forked from LeenkxTeam/LNXSDK
146 lines
3.2 KiB
Haxe
146 lines
3.2 KiB
Haxe
|
package kha;
|
||
|
|
||
|
import haxe.macro.Context;
|
||
|
import haxe.macro.Expr;
|
||
|
#if macro
|
||
|
import kha.internal.AssetsBuilder;
|
||
|
import sys.io.File;
|
||
|
#end
|
||
|
|
||
|
using haxe.macro.ExprTools;
|
||
|
|
||
|
#if (kha_html5 || kha_krom)
|
||
|
class Worker {
|
||
|
#if kha_in_worker
|
||
|
public static function notifyWorker(func: Dynamic->Void): Void {
|
||
|
#if !macro
|
||
|
js.Syntax.code("self").addEventListener("message", function(e) {
|
||
|
func(e.data);
|
||
|
});
|
||
|
#end
|
||
|
}
|
||
|
|
||
|
public static function postFromWorker(message: Dynamic): Void {
|
||
|
#if !macro
|
||
|
js.Syntax.code("self").postMessage(message);
|
||
|
#end
|
||
|
}
|
||
|
#else
|
||
|
#if macro
|
||
|
static var threads = new Array<String>();
|
||
|
#else
|
||
|
var worker: js.html.Worker;
|
||
|
#end
|
||
|
|
||
|
function new(file: String) {
|
||
|
#if !macro
|
||
|
worker = new js.html.Worker(file);
|
||
|
#end
|
||
|
}
|
||
|
|
||
|
@:noCompletion
|
||
|
public static function _create(file: String): Worker {
|
||
|
return new Worker(file);
|
||
|
}
|
||
|
|
||
|
public function notify(func: Dynamic->Void): Void {
|
||
|
#if !macro
|
||
|
worker.addEventListener("message", function(e) {
|
||
|
func(e.data);
|
||
|
});
|
||
|
#end
|
||
|
}
|
||
|
|
||
|
public function post(message: Dynamic): Void {
|
||
|
#if !macro
|
||
|
worker.postMessage(message);
|
||
|
#end
|
||
|
}
|
||
|
|
||
|
public static macro function create(expr: Expr) {
|
||
|
var name: String = expr.toString();
|
||
|
if (threads.indexOf(name) < 0) {
|
||
|
threads.push(name);
|
||
|
}
|
||
|
var threadstring = "";
|
||
|
for (thread in threads) {
|
||
|
threadstring += thread + "\n";
|
||
|
}
|
||
|
File.saveContent(AssetsBuilder.findResources() + "workers.txt", threadstring);
|
||
|
return Context.parse("kha.Worker._create(\"" + name + ".js\")", Context.currentPos());
|
||
|
}
|
||
|
#end
|
||
|
}
|
||
|
#end
|
||
|
|
||
|
#if kha_kore
|
||
|
import sys.thread.Thread;
|
||
|
import sys.thread.Tls;
|
||
|
import kha.Scheduler;
|
||
|
|
||
|
private class Message {
|
||
|
public final threadId: Int;
|
||
|
public final message: Dynamic;
|
||
|
|
||
|
public function new(message: Dynamic) {
|
||
|
this.threadId = @:privateAccess Worker.threadId.value;
|
||
|
this.message = message;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class Worker {
|
||
|
public static var _mainThread: Thread;
|
||
|
|
||
|
static var notifyFuncs: Array<Dynamic->Void> = [];
|
||
|
static var taskId: Int = -1;
|
||
|
static var nextThreadId: Int = 0;
|
||
|
static var threadId = new Tls<Int>();
|
||
|
|
||
|
var thread: Thread;
|
||
|
var id: Int;
|
||
|
|
||
|
function new(thread: Thread, id: Int) {
|
||
|
this.thread = thread;
|
||
|
this.id = id;
|
||
|
}
|
||
|
|
||
|
public static function create(clazz: Class<Dynamic>): Worker {
|
||
|
var id = nextThreadId++;
|
||
|
return new Worker(Thread.create(function() {
|
||
|
threadId.value = id;
|
||
|
Reflect.field(clazz, "main")();
|
||
|
}), id);
|
||
|
}
|
||
|
|
||
|
public function notify(func: Dynamic->Void): Void {
|
||
|
notifyFuncs[id] = func;
|
||
|
if (taskId != -1)
|
||
|
return;
|
||
|
taskId = Scheduler.addFrameTask(function() {
|
||
|
var message: Message = Thread.readMessage(false);
|
||
|
if (message != null) {
|
||
|
var func = notifyFuncs[message.threadId];
|
||
|
func(message.message);
|
||
|
}
|
||
|
}, 0);
|
||
|
}
|
||
|
|
||
|
public function post(message: Dynamic): Void {
|
||
|
thread.sendMessage(message);
|
||
|
}
|
||
|
|
||
|
public static function notifyWorker(func: Dynamic->Void): Void {
|
||
|
while (true) {
|
||
|
var message = Thread.readMessage(true);
|
||
|
if (message != null) {
|
||
|
func(message);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static function postFromWorker(message: Dynamic): Void {
|
||
|
_mainThread.sendMessage(new Message(message));
|
||
|
}
|
||
|
}
|
||
|
#end
|