[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