-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathSemaphore.hx
106 lines (80 loc) · 2.3 KB
/
Semaphore.hx
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
/*
* SPDX-FileCopyrightText: © Vegard IT GmbH (https://vegardit.com) and contributors
* SPDX-FileContributor: Sebastian Thomschke, Vegard IT GmbH
* SPDX-License-Identifier: Apache-2.0
*/
package hx.concurrent.lock;
import hx.concurrent.ConcurrentException;
import hx.concurrent.internal.Dates;
import hx.concurrent.lock.RLock;
import hx.concurrent.lock.Acquirable.AbstractAcquirable;
import hx.concurrent.thread.Threads;
/**
* See:
* - https://en.wikipedia.org/wiki/Semaphore_(programming)
* - https://docs.microsoft.com/en-us/dotnet/api/system.threading.semaphore
* - http://devdocs.io/openjdk~8/java/util/concurrent/semaphore
*
* @author Sebastian Thomschke, Vegard IT GmbH
*/
class Semaphore extends AbstractAcquirable {
#if java
final _sem:java.util.concurrent.Semaphore;
inline //
function get_availablePermits():Int
return _sem.availablePermits();
inline //
public function new(initialPermits:Int) {
_sem = new java.util.concurrent.Semaphore(initialPermits);
}
inline //
public function acquire():Void
_sem.acquire();
inline //
public function tryAcquire(timeoutMS = 0):Bool
return _sem.tryAcquire(timeoutMS, java.util.concurrent.TimeUnit.MILLISECONDS);
/**
* Increases availablePermits by one.
*/
inline //
public function release():Void
_sem.release();
#else
var _availablePermits:Int;
inline //
function get_availablePermits():Int
return _availablePermits;
final permitLock = new RLock();
inline //
public function new(initialPermits:Int) {
_availablePermits = initialPermits;
}
inline //
public function acquire():Void
while (tryAcquire(500) == false) {
};
private function tryAcquireInternal():Bool
return permitLock.execute(function() {
if (_availablePermits > 0) {
_availablePermits--;
return true;
}
return false;
});
inline //
public function tryAcquire(timeoutMS = 0):Bool
#if threads
return Threads.await(tryAcquireInternal, timeoutMS);
#else
return tryAcquireInternal();
#end
/**
* Increases availablePermits by one.
*/
public function release():Void {
permitLock.acquire();
_availablePermits++;
permitLock.release();
}
#end
}