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;
 | 
						|
   }
 | 
						|
 | 
						|
}
 | 
						|
 |