forked from LeenkxTeam/LNXSDK
Update Files
This commit is contained in:
60
Kha/Tools/macos/std/cs/_std/sys/thread/Deque.hx
Normal file
60
Kha/Tools/macos/std/cs/_std/sys/thread/Deque.hx
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package sys.thread;
|
||||
|
||||
import cs.system.threading.ManualResetEvent;
|
||||
import cs.Lib;
|
||||
|
||||
@:coreApi class Deque<T> {
|
||||
final storage:Array<T> = [];
|
||||
final lockObj = {};
|
||||
final addEvent = new ManualResetEvent(false);
|
||||
|
||||
public function new():Void {}
|
||||
|
||||
public function add(i:T):Void {
|
||||
Lib.lock(lockObj, {
|
||||
storage.push(i);
|
||||
addEvent.Set();
|
||||
});
|
||||
}
|
||||
|
||||
public function push(i:T):Void {
|
||||
Lib.lock(lockObj, {
|
||||
storage.unshift(i);
|
||||
addEvent.Set();
|
||||
});
|
||||
}
|
||||
|
||||
public function pop(block:Bool):Null<T> {
|
||||
do {
|
||||
Lib.lock(lockObj, {
|
||||
if (storage.length > 0) {
|
||||
return storage.shift();
|
||||
}
|
||||
addEvent.Reset();
|
||||
});
|
||||
} while (block && addEvent.WaitOne());
|
||||
return null;
|
||||
}
|
||||
}
|
79
Kha/Tools/macos/std/cs/_std/sys/thread/Lock.hx
Normal file
79
Kha/Tools/macos/std/cs/_std/sys/thread/Lock.hx
Normal file
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package sys.thread;
|
||||
|
||||
import haxe.Timer;
|
||||
import cs.Lib;
|
||||
import cs.system.threading.ManualResetEvent;
|
||||
|
||||
class Lock {
|
||||
final lockObj = {};
|
||||
final releaseEvent = new ManualResetEvent(false);
|
||||
|
||||
var waitCount = 1; // initially locked
|
||||
var releaseCount = 0;
|
||||
|
||||
public function new():Void {}
|
||||
|
||||
public function wait(?timeout:Float):Bool {
|
||||
var myTicket;
|
||||
// Get a ticket in queue
|
||||
Lib.lock(lockObj, {
|
||||
myTicket = waitCount;
|
||||
waitCount++;
|
||||
if (myTicket <= releaseCount) {
|
||||
return true;
|
||||
}
|
||||
releaseEvent.Reset();
|
||||
});
|
||||
|
||||
if (timeout == null) {
|
||||
do {
|
||||
releaseEvent.WaitOne();
|
||||
if (myTicket <= releaseCount) {
|
||||
return true;
|
||||
}
|
||||
} while (true);
|
||||
} else {
|
||||
var timeoutStamp = Timer.stamp() + timeout;
|
||||
do {
|
||||
var secondsLeft = timeoutStamp - Timer.stamp();
|
||||
if (secondsLeft <= 0 || !releaseEvent.WaitOne(Std.int(secondsLeft * 1000))) {
|
||||
// Timeout. Do not occupy a place in queue anymore
|
||||
release();
|
||||
return false;
|
||||
}
|
||||
if (myTicket <= releaseCount) {
|
||||
return true;
|
||||
}
|
||||
} while (true);
|
||||
}
|
||||
}
|
||||
|
||||
public function release():Void {
|
||||
Lib.lock(lockObj, {
|
||||
releaseCount++;
|
||||
releaseEvent.Set();
|
||||
});
|
||||
}
|
||||
}
|
43
Kha/Tools/macos/std/cs/_std/sys/thread/Mutex.hx
Normal file
43
Kha/Tools/macos/std/cs/_std/sys/thread/Mutex.hx
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package sys.thread;
|
||||
|
||||
import cs.system.threading.Mutex as NativeMutex;
|
||||
|
||||
class Mutex {
|
||||
final native = new NativeMutex();
|
||||
|
||||
public function new():Void {}
|
||||
|
||||
public function acquire():Void {
|
||||
native.WaitOne();
|
||||
}
|
||||
|
||||
public function tryAcquire():Bool {
|
||||
return native.WaitOne(0);
|
||||
}
|
||||
|
||||
public function release():Void {
|
||||
native.ReleaseMutex();
|
||||
}
|
||||
}
|
184
Kha/Tools/macos/std/cs/_std/sys/thread/Thread.hx
Normal file
184
Kha/Tools/macos/std/cs/_std/sys/thread/Thread.hx
Normal file
@ -0,0 +1,184 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package sys.thread;
|
||||
|
||||
import cs.system.threading.Thread as NativeThread;
|
||||
import cs.system.threading.Mutex as NativeMutex;
|
||||
import cs.system.WeakReference;
|
||||
import cs.Lib;
|
||||
|
||||
private typedef ThreadImpl = HaxeThread;
|
||||
|
||||
abstract Thread(ThreadImpl) from ThreadImpl {
|
||||
public var events(get,never):EventLoop;
|
||||
|
||||
inline function new(thread:HaxeThread) {
|
||||
this = thread;
|
||||
}
|
||||
|
||||
public static function create(job:Void->Void):Thread {
|
||||
var hx:Null<HaxeThread> = null;
|
||||
var native = new NativeThread(job);
|
||||
native.IsBackground = true;
|
||||
hx = HaxeThread.allocate(native, false);
|
||||
native.Start();
|
||||
|
||||
return new Thread(hx);
|
||||
}
|
||||
|
||||
public static inline function runWithEventLoop(job:()->Void):Void {
|
||||
HaxeThread.runWithEventLoop(job);
|
||||
}
|
||||
|
||||
public static inline function createWithEventLoop(job:()->Void):Thread {
|
||||
var hx:Null<HaxeThread> = null;
|
||||
var native = new NativeThread(() -> {
|
||||
job();
|
||||
if(hx == null) {
|
||||
HaxeThread.get(NativeThread.CurrentThread).events.loop();
|
||||
} else {
|
||||
hx.events.loop();
|
||||
}
|
||||
});
|
||||
native.IsBackground = true;
|
||||
hx = HaxeThread.allocate(native, true);
|
||||
native.Start();
|
||||
|
||||
return new Thread(hx);
|
||||
}
|
||||
|
||||
public static inline function current():Thread {
|
||||
return new Thread(HaxeThread.get(NativeThread.CurrentThread));
|
||||
}
|
||||
|
||||
public static function readMessage(block:Bool):Dynamic {
|
||||
return current().readMessageImpl(block);
|
||||
}
|
||||
|
||||
public inline function sendMessage(msg:Dynamic):Void {
|
||||
this.sendMessage(msg);
|
||||
}
|
||||
|
||||
inline function readMessageImpl(block:Bool):Dynamic {
|
||||
return this.readMessage(block);
|
||||
}
|
||||
|
||||
function get_events():EventLoop {
|
||||
if(this.events == null)
|
||||
throw new NoEventLoopException();
|
||||
return this.events;
|
||||
}
|
||||
|
||||
@:keep
|
||||
static function processEvents():Void {
|
||||
HaxeThread.get(NativeThread.CurrentThread).events.loop();
|
||||
}
|
||||
}
|
||||
|
||||
private class HaxeThread {
|
||||
static var mainNativeThread:NativeThread;
|
||||
static var mainHaxeThread:HaxeThread;
|
||||
static var threads:Map<Int, WeakReference>;
|
||||
static var threadsMutex:NativeMutex;
|
||||
static var allocateCount:Int;
|
||||
|
||||
static function __init__() {
|
||||
threads = new Map();
|
||||
threadsMutex = new NativeMutex();
|
||||
allocateCount = 0;
|
||||
mainNativeThread = NativeThread.CurrentThread;
|
||||
mainHaxeThread = new HaxeThread(NativeThread.CurrentThread);
|
||||
mainHaxeThread.events = new EventLoop();
|
||||
}
|
||||
|
||||
public final native:NativeThread;
|
||||
public var events(default,null):Null<EventLoop>;
|
||||
|
||||
final messages = new Deque<Dynamic>();
|
||||
|
||||
public static function get(native:NativeThread):HaxeThread {
|
||||
if(native == mainNativeThread) {
|
||||
return mainHaxeThread;
|
||||
}
|
||||
var native = NativeThread.CurrentThread;
|
||||
var key = native.ManagedThreadId;
|
||||
threadsMutex.WaitOne();
|
||||
var ref = threads.get(key);
|
||||
threadsMutex.ReleaseMutex();
|
||||
if (ref == null || !ref.IsAlive) {
|
||||
return allocate(native, false);
|
||||
}
|
||||
return ref.Target;
|
||||
}
|
||||
|
||||
public static function allocate(native:NativeThread, withEventLoop:Bool):HaxeThread {
|
||||
threadsMutex.WaitOne();
|
||||
allocateCount++;
|
||||
inline function cleanup() {
|
||||
if (allocateCount % 100 == 0) {
|
||||
for (key => ref in threads) {
|
||||
if (!ref.IsAlive) {
|
||||
threads.remove(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var hx = new HaxeThread(native);
|
||||
if(withEventLoop)
|
||||
hx.events = new EventLoop();
|
||||
var ref = new WeakReference(hx);
|
||||
cleanup();
|
||||
threads.set(native.ManagedThreadId, ref);
|
||||
threadsMutex.ReleaseMutex();
|
||||
return hx;
|
||||
}
|
||||
|
||||
public static function runWithEventLoop(job:()->Void):Void {
|
||||
var thread = get(NativeThread.CurrentThread);
|
||||
if(thread.events == null) {
|
||||
thread.events = new EventLoop();
|
||||
try {
|
||||
job();
|
||||
thread.events.loop();
|
||||
thread.events = null;
|
||||
} catch(e) {
|
||||
thread.events = null;
|
||||
throw e;
|
||||
}
|
||||
} else {
|
||||
job();
|
||||
}
|
||||
}
|
||||
|
||||
function new(native:NativeThread) {
|
||||
this.native = native;
|
||||
}
|
||||
|
||||
public inline function readMessage(block:Bool):Dynamic {
|
||||
return messages.pop(block);
|
||||
}
|
||||
|
||||
public function sendMessage(msg:Dynamic):Void {
|
||||
messages.add(msg);
|
||||
}
|
||||
}
|
45
Kha/Tools/macos/std/cs/_std/sys/thread/Tls.hx
Normal file
45
Kha/Tools/macos/std/cs/_std/sys/thread/Tls.hx
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Copyright (C)2005-2019 Haxe Foundation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
package sys.thread;
|
||||
|
||||
import cs.system.threading.Thread as NativeThread;
|
||||
import cs.system.LocalDataStoreSlot;
|
||||
|
||||
class Tls<T> {
|
||||
public var value(get, set):T;
|
||||
|
||||
final slot:LocalDataStoreSlot;
|
||||
|
||||
public function new():Void {
|
||||
slot = NativeThread.GetNamedDataSlot('__hx__Tls');
|
||||
}
|
||||
|
||||
function get_value():T {
|
||||
return NativeThread.GetData(slot);
|
||||
}
|
||||
|
||||
function set_value(value:T):T {
|
||||
NativeThread.SetData(slot, value);
|
||||
return value;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user