[M3devel] Thread testing program
Tony Hosking
hosking at cs.purdue.edu
Tue Jan 11 20:29:09 CET 2011
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