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