Update Files

This commit is contained in:
2025-01-22 16:18:30 +01:00
parent ed4603cf95
commit a36294b518
16718 changed files with 2960346 additions and 0 deletions

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

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

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

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

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