135 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			135 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package gc; | ||
|  | import haxe.io.Bytes; | ||
|  | import haxe.crypto.Md5; | ||
|  | import cpp.vm.Gc; | ||
|  | import sys.io.File; | ||
|  | #if haxe4 | ||
|  | import sys.thread.Thread; | ||
|  | #else | ||
|  | import cpp.vm.Thread; | ||
|  | #end | ||
|  | 
 | ||
|  | class Wrapper | ||
|  | { | ||
|  |   public var a:Int; | ||
|  |   public function new(inA:Int) a = inA; | ||
|  | } | ||
|  | 
 | ||
|  | 
 | ||
|  | @:cppInclude("./ZoneTest.cpp") | ||
|  | @:depend("./ZoneTest.cpp") | ||
|  | class TestGCThreaded extends haxe.unit.TestCase | ||
|  | { | ||
|  |   @:keep | ||
|  |   static var keepRunning = false; | ||
|  |   @:keep | ||
|  |   static var nativeRunning = false; | ||
|  |   var bigText:String; | ||
|  | 
 | ||
|  | 
 | ||
|  |    override public function setup() | ||
|  |    { | ||
|  |       var lines = [ for(i in 0...100000) "abc123\n" ]; | ||
|  |       #if nme | ||
|  |       bigText = lines.join(""); | ||
|  |       #else | ||
|  |       File.saveContent( "gc/big.txt", lines.join("") ); | ||
|  |       #end | ||
|  |    } | ||
|  | 
 | ||
|  |    public function testThreadOnce():Void | ||
|  |    { | ||
|  |       startNative(); | ||
|  |       doThreadedWork(4,100); | ||
|  |       stopNative(); | ||
|  |       assertTrue(true); | ||
|  |    } | ||
|  | 
 | ||
|  | 
 | ||
|  |    public function testThreadMany():Void | ||
|  |    { | ||
|  |       startNative(); | ||
|  |       for(i in  0...10) | ||
|  |          #if nme | ||
|  |          doThreadedWork(4,100); | ||
|  |          #else | ||
|  |          doThreadedWork(100,100); | ||
|  |          #end | ||
|  |       stopNative(); | ||
|  |       assertTrue(true); | ||
|  |    } | ||
|  | 
 | ||
|  |    @:native("nativeLoop") | ||
|  |    extern static function nativeLoop() : Void; | ||
|  | 
 | ||
|  |    function startNative() | ||
|  |    { | ||
|  |       Thread.create( () -> { | ||
|  |          nativeRunning = true; | ||
|  |          keepRunning = true; | ||
|  |          nativeLoop(); | ||
|  |       }); | ||
|  |    } | ||
|  |    function stopNative() | ||
|  |    { | ||
|  |       keepRunning = false; | ||
|  |       while(nativeRunning) | ||
|  |          Sys.sleep(0.1); | ||
|  |    } | ||
|  | 
 | ||
|  |    function doThreadedWork(numThreads, numWork):Void | ||
|  |    { | ||
|  |       var threads:Array<Thread> = makeThreads(numThreads); | ||
|  | 
 | ||
|  |       for (i in 0...numWork) | ||
|  |          threads[i % threads.length].sendMessage('doWork'); | ||
|  | 
 | ||
|  |       for (i in 0...numThreads) | ||
|  |       { | ||
|  |          threads[i].sendMessage('exit');  | ||
|  |          Thread.readMessage(true); | ||
|  |       } | ||
|  |    } | ||
|  | 
 | ||
|  |    function makeThreads(numThreads:Int):Array<Thread> | ||
|  |    { | ||
|  |       #if nme | ||
|  |       var text:String = bigText; | ||
|  |       #else | ||
|  |       var text:String = File.getContent("gc/big.txt"); | ||
|  |       #end | ||
|  |       var main:Thread = Thread.current(); | ||
|  |       var threads:Array<Thread> = []; | ||
|  |       for (i in 0...numThreads) | ||
|  |       { | ||
|  |          threads.push( Thread.create(function() { | ||
|  |             while(true) { | ||
|  |                var message:Dynamic = Thread.readMessage(true); | ||
|  |                if(message == 'exit') | ||
|  |                   break; | ||
|  |                else | ||
|  |                   Md5.encode(text); | ||
|  |                   var arrays = new Array<Array<Wrapper>>(); | ||
|  |                   for(i in 0...100) | ||
|  |                   { | ||
|  |                      var wrappers = new Array<Wrapper>(); | ||
|  |                      arrays.push(wrappers); | ||
|  |                      for(j in 0...1000) | ||
|  |                         wrappers.push( new Wrapper(1) ); | ||
|  |                   } | ||
|  |                   var sum = 0; | ||
|  |                   for(a in arrays) | ||
|  |                      for(w in a) | ||
|  |                         sum += w.a; | ||
|  | 
 | ||
|  |                   assertTrue(sum==100000); | ||
|  |             } | ||
|  |             main.sendMessage('done'); | ||
|  |          }) ); | ||
|  |       } | ||
|  |       return threads; | ||
|  |    } | ||
|  | 
 | ||
|  | } | ||
|  | 
 |