[M3devel] Thread testing program

Mika Nystrom mika at async.caltech.edu
Tue Jan 11 22:09:28 CET 2011


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