[M3devel] Thread testing program
Mika Nystrom
mika at async.caltech.edu
Tue Jan 11 11:39:41 CET 2011
Hmm, to make that program really useful it needs two enhancements:
1. check that the threads are indeed created (on AMD64_LINUX, the
system deadlocks for me after 50)
2. check that the running threads are, indeed, making some sort of
progress...
As it is it is useful in a debugger but not for any kind of automated
or foolproof testing, yet.
Mika
Mika Nystrom writes:
>
>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