11
11
12
12
package com .automq .stream .utils ;
13
13
14
- import com .automq .stream .utils .threads .EventLoop ;
15
-
16
14
import org .slf4j .Logger ;
17
15
import org .slf4j .LoggerFactory ;
18
16
19
17
import java .util .LinkedList ;
20
18
import java .util .Queue ;
21
19
import java .util .concurrent .CompletableFuture ;
20
+ import java .util .concurrent .Executor ;
22
21
import java .util .function .Supplier ;
23
22
24
23
public class AsyncSemaphore {
@@ -36,11 +35,11 @@ public AsyncSemaphore(long permits) {
36
35
* @param requiredPermits the required permits
37
36
* @param task task to run when the permits are available, the task should return a CompletableFuture
38
37
* which will be completed when the permits could be released.
39
- * @param eventLoop the eventLoop to run the task when the permits are available
38
+ * @param executor the executor to run the task when the permits are available
40
39
* @return true if the permits are acquired, false if the task is added to the waiting queue.
41
40
*/
42
41
public synchronized boolean acquire (long requiredPermits , Supplier <CompletableFuture <?>> task ,
43
- EventLoop eventLoop ) {
42
+ Executor executor ) {
44
43
if (permits >= 0 ) {
45
44
// allow permits minus to negative
46
45
permits -= requiredPermits ;
@@ -51,7 +50,7 @@ public synchronized boolean acquire(long requiredPermits, Supplier<CompletableFu
51
50
}
52
51
return true ;
53
52
} else {
54
- tasks .add (new AsyncSemaphoreTask (requiredPermits , task , eventLoop ));
53
+ tasks .add (new AsyncSemaphoreTask (requiredPermits , task , executor ));
55
54
return false ;
56
55
}
57
56
}
@@ -69,21 +68,21 @@ synchronized void release(long requiredPermits) {
69
68
if (permits > 0 ) {
70
69
AsyncSemaphoreTask t = tasks .poll ();
71
70
if (t != null ) {
72
- // use eventLoop to reset the thread stack to avoid stack overflow
73
- t .eventLoop .execute (() -> acquire (t .requiredPermits , t .task , t .eventLoop ));
71
+ // use executor to reset the thread stack to avoid stack overflow
72
+ t .executor .execute (() -> acquire (t .requiredPermits , t .task , t .executor ));
74
73
}
75
74
}
76
75
}
77
76
78
77
static class AsyncSemaphoreTask {
79
78
final long requiredPermits ;
80
79
final Supplier <CompletableFuture <?>> task ;
81
- final EventLoop eventLoop ;
80
+ final Executor executor ;
82
81
83
- public AsyncSemaphoreTask (long requiredPermits , Supplier <CompletableFuture <?>> task , EventLoop eventLoop ) {
82
+ public AsyncSemaphoreTask (long requiredPermits , Supplier <CompletableFuture <?>> task , Executor executor ) {
84
83
this .requiredPermits = requiredPermits ;
85
84
this .task = task ;
86
- this .eventLoop = eventLoop ;
85
+ this .executor = executor ;
87
86
}
88
87
}
89
88
}
0 commit comments