[M3devel] Thread testing program
Tony Hosking
hosking at cs.purdue.edu
Wed Jan 12 02:43:19 CET 2011
Please try the latest commit.
On Jan 11, 2011, at 4:09 PM, Mika Nystrom wrote:
>
> AMD64_FREEBSD of some time ago (about a year) also doesn't seem to
> make any progress. But no, I haven't gone through any old versions
> systematically. The old PM3 is what I use in "production" systems,
> and it works... but unfortunately my next "production" system is slated
> to be a new Debian system.
>
> Mika
>
> Tony Hosking writes:
>> Did you stress test any older versions of M3?
>> I believe we have had a number of regressions lately.
>>
>> On Jan 11, 2011, at 5:29 AM, Mika Nystrom wrote:
>>
>>>
>>> Hello everyone,
>>>
>>> After studying failure modes and implementation of the current
>>> threading implementation in CM3, I've developed a little stress-testing
>>> program, attached. Currently it crashes in various ways.
>>>
>>> It takes one command-line argument, the approximate number of threads
>>> to create (e.g., 100). It creates threads of three types:
>>> reader (reads a file), forker (forks a process), allocator (allocates
>>> memory that constantly goes out of scope).
>>>
>>> Files attached below. Happy 1/11/11.
>>>
>>> Mika
>>>
>>> My m3makefile:
>>>
>>> import ("libm3")
>>>
>>> implementation ("Main")
>>>
>>> program ("threadtest")
>>>
>>> My m3overrides (optional):
>>>
>>> if defined("CM3_VERSION")
>>> /* Critical Mass Modula-3 */
>>> % see http://www.elegosoft.com/cm3/doc/help/cm3/cm3.html
>>>
>>> % not sure about this:
>>> build_standalone()
>>>
>>> m3_optimize("")
>>> end
>>>
>>> My Main.m3:
>>>
>>>
>>> (* $Id: Main.m3,v 1.1 2011/01/11 10:06:21 mika Exp $ *)
>>>
>>> MODULE Main;
>>>
>>> (* threading stress-test *)
>>>
>>> IMPORT Params, Scan, Thread, Rd, FileRd, Wr, FileWr, Process;
>>>
>>> VAR n := Scan.Int(Params.Get(1));
>>>
>>> PROCEDURE MakeReaderThread() =
>>> BEGIN
>>> EVAL Thread.Fork(NEW(Thread.Closure, apply := RApply))
>>> END MakeReaderThread;
>>>
>>> PROCEDURE MakeForkerThread() =
>>> BEGIN
>>> EVAL Thread.Fork(NEW(Thread.Closure, apply := FApply))
>>> END MakeForkerThread;
>>>
>>> PROCEDURE MakeAllocatorThread() =
>>> BEGIN
>>> EVAL Thread.Fork(NEW(Thread.Closure, apply := AApply))
>>> END MakeAllocatorThread;
>>>
>>> (**********************************************************************)
>>>
>>> PROCEDURE RApply(cl : Thread.Closure) : REFANY =
>>> BEGIN
>>> LOOP
>>> WITH rd = FileRd.Open(Filename) DO
>>> TRY
>>> LOOP
>>> VAR c := Rd.GetChar(rd); BEGIN END
>>> END
>>> EXCEPT
>>> Rd.EndOfFile => Rd.Close(rd)
>>> END
>>> END
>>> END
>>> END RApply;
>>>
>>> PROCEDURE FApply(cl : Thread.Closure) : REFANY =
>>> BEGIN
>>> LOOP
>>> WITH proc = Process.Create("sleep",
>>> ARRAY OF TEXT { "1" }) DO
>>> EVAL Process.Wait(proc)
>>> END
>>> END
>>> END FApply;
>>>
>>> PROCEDURE AApply(cl : Thread.Closure) : REFANY =
>>> BEGIN
>> LOOP
>>> VAR
>>> arr := NEW(REF ARRAY OF INTEGER, 1025);
>>> BEGIN
>>> FOR i := FIRST(arr^)+1 TO LAST(arr^) DO
>>> arr[i] := arr[i] - arr[i-1]
>>> END
>>> END
>>> END
>>> END AApply;
>>>
>>>
>>> CONST Filename = "hohum";
>>>
>>> PROCEDURE WriteAFile() =
>>> BEGIN
>>> WITH wr = FileWr.Open(Filename) DO
>>> FOR i := 1 TO 256 DO
>>> FOR j := 1 TO i DO
>>> Wr.PutChar(wr, VAL(ORD('A') + i MOD 25, CHAR))
>>> END;
>>> Wr.PutChar(wr, '\n')
>>> END
>>> END
>>> END WriteAFile;
>>>
>>> BEGIN
>>> WriteAFile();
>>> FOR i := 1 TO n DIV 3 DO
>>> MakeReaderThread()
>>> END;
>>> FOR i := 1 TO n DIV 3 DO
>>> MakeForkerThread()
>>> END;
>>> FOR i := 1 TO n DIV 3 DO
>>> MakeAllocatorThread()
>>> END;
>>>
>>> LOOP
>>> Thread.Pause(1.0d0)
>>> END
>>> END Main.
>>>
More information about the M3devel
mailing list