106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | #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); | ||
|  |    } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | 
 |