[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