forked from LeenkxTeam/LNXSDK
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
		
			Executable File
		
	
	
	
	
#if haxe4
 | 
						|
  import sys.thread.Thread;
 | 
						|
  import sys.thread.Mutex;
 | 
						|
#else
 | 
						|
  #if neko
 | 
						|
  import neko.vm.Thread;
 | 
						|
  import neko.vm.Mutex;
 | 
						|
  #else
 | 
						|
  import cpp.vm.Thread;
 | 
						|
  import cpp.vm.Mutex;
 | 
						|
  #end
 | 
						|
#end
 | 
						|
 | 
						|
#if cpp
 | 
						|
import cpp.AtomicInt;
 | 
						|
#end
 | 
						|
 | 
						|
class ThreadPool
 | 
						|
{
 | 
						|
   var threads:Array<Thread>;
 | 
						|
   var mainThread:Thread;
 | 
						|
   #if cpp
 | 
						|
   var arrayIndex:AtomicInt;
 | 
						|
   #else
 | 
						|
   var arrayIndex:Int;
 | 
						|
   #end
 | 
						|
   var arrayCount:Int;
 | 
						|
 | 
						|
   public var mutex:Mutex;
 | 
						|
 | 
						|
 | 
						|
   public function new(inCount:Int)
 | 
						|
   {
 | 
						|
      mutex = new Mutex();
 | 
						|
      mainThread = Thread.current();
 | 
						|
      threads = [];
 | 
						|
      for(i in 0...inCount)
 | 
						|
        threads.push( Thread.create( function() threadLoop(i) ) );
 | 
						|
 | 
						|
      // Is this needed?
 | 
						|
      Tools.addOnExitHook( function(_) runJob(null) );
 | 
						|
   }
 | 
						|
 | 
						|
   function threadLoop(threadId:Int)
 | 
						|
   {
 | 
						|
      while(true)
 | 
						|
      {
 | 
						|
         var job:Int->Void = Thread.readMessage(true);
 | 
						|
         if (job==null)
 | 
						|
         {
 | 
						|
            mainThread.sendMessage("done");
 | 
						|
            break;
 | 
						|
         }
 | 
						|
 | 
						|
         try
 | 
						|
         {
 | 
						|
            job(threadId);
 | 
						|
         }
 | 
						|
         catch (error:Dynamic)
 | 
						|
         {
 | 
						|
            if (BuildTool.threadExitCode!=0)
 | 
						|
               BuildTool.setThreadError(-1);
 | 
						|
            else
 | 
						|
               Log.warn("Error in compile thread: " + error);
 | 
						|
         }
 | 
						|
 | 
						|
         mainThread.sendMessage("ok");
 | 
						|
      }
 | 
						|
   }
 | 
						|
 | 
						|
   public function setArrayCount(inCount:Int)
 | 
						|
   {
 | 
						|
      arrayIndex = 0;
 | 
						|
      arrayCount = inCount;
 | 
						|
   }
 | 
						|
   public function getNextIndex() : Int
 | 
						|
   {
 | 
						|
       #if cpp
 | 
						|
       var index = AtomicInt.atomicInc( cpp.Pointer.addressOf(arrayIndex) );
 | 
						|
       #else
 | 
						|
       mutex.acquire();
 | 
						|
       var index = arrayIndex++;
 | 
						|
       mutex.release();
 | 
						|
       #end
 | 
						|
 | 
						|
       if (index<arrayCount)
 | 
						|
          return index;
 | 
						|
       return -1;
 | 
						|
   }
 | 
						|
 | 
						|
   public function runJob(job:Int->Void)
 | 
						|
   {
 | 
						|
      for(thread in threads)
 | 
						|
         thread.sendMessage( job );
 | 
						|
      for(i in 0...threads.length)
 | 
						|
         Thread.readMessage(true);
 | 
						|
 | 
						|
      // Already printed the error from the thread, just need to exit
 | 
						|
      if (job!=null && BuildTool.threadExitCode!=0)
 | 
						|
         Tools.exit(BuildTool.threadExitCode);
 | 
						|
   }
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
 |