1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
package sys.thread;
@:coreApi class Semaphore {
final native:eval.luv.Semaphore;
public function new(value:Int):Void {
native = eval.luv.Semaphore.init(value).resolve();
eval.vm.Gc.finalise(destroy, this);
}
static function destroy(sem:Semaphore):Void {
sem.native.destroy();
}
public function acquire():Void {
native.wait();
}
public function tryAcquire(?timeout:Float):Bool {
if (timeout == null) {
return native.tryWait().isOk();
} else {
var t = Sys.time() + timeout;
while (Sys.time() < t) {
if (native.tryWait().isOk()) {
return true;
}
}
return false;
}
}
public function release():Void {
native.post();
}
}
|