forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
105
Kha/Backends/Kinc-hxcpp/khacpp/tools/hxcpp/ThreadPool.hx
Executable file
105
Kha/Backends/Kinc-hxcpp/khacpp/tools/hxcpp/ThreadPool.hx
Executable file
@ -0,0 +1,105 @@
|
||||
#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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user