forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			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;
 | |
|    }
 | |
| 
 | |
| }
 | |
| 
 |