File tree Expand file tree Collapse file tree 3 files changed +67
-0
lines changed Expand file tree Collapse file tree 3 files changed +67
-0
lines changed Original file line number Diff line number Diff line change @@ -29,6 +29,13 @@ export class RawSemaphore {
29
29
return this . #value === 0 ;
30
30
}
31
31
32
+ /**
33
+ * Returns the number of waiters that are waiting for lock release.
34
+ */
35
+ get waiterCount ( ) : number {
36
+ return this . #resolves. length ;
37
+ }
38
+
32
39
/**
33
40
* Acquires the semaphore, blocking until the semaphore is available.
34
41
*/
Original file line number Diff line number Diff line change @@ -35,6 +35,13 @@ export class Semaphore {
35
35
return this . #sem. locked ;
36
36
}
37
37
38
+ /**
39
+ * Returns the number of waiters that are waiting for lock release.
40
+ */
41
+ get waiterCount ( ) : number {
42
+ return this . #sem. waiterCount ;
43
+ }
44
+
38
45
/**
39
46
* Acquires a lock on the semaphore, and invokes the specified function.
40
47
*
Original file line number Diff line number Diff line change @@ -106,3 +106,56 @@ test(
106
106
assertThrows ( ( ) => new Semaphore ( 0 ) , RangeError ) ;
107
107
} ,
108
108
) ;
109
+
110
+ test (
111
+ "Semaphore.waiterCount returns the number of waiters (n=5)" ,
112
+ async ( ) => {
113
+ const befores : number [ ] = [ ] ;
114
+ const afters : number [ ] = [ ] ;
115
+ const sem = new Semaphore ( 5 ) ;
116
+ const worker = ( i : number ) => {
117
+ return sem . lock ( async ( ) => {
118
+ befores . push ( sem . waiterCount ) ;
119
+ await new Promise ( ( resolve ) => setTimeout ( resolve , 10 + i ) ) ;
120
+ afters . push ( sem . waiterCount ) ;
121
+ } ) ;
122
+ } ;
123
+ await Promise . all ( [ ...Array ( 10 ) ] . map ( ( _ , i ) => worker ( i ) ) ) ;
124
+ /**
125
+ * Worker 0 |5========5
126
+ * Worker 1 |5=========4
127
+ * Worker 2 |5==========3
128
+ * Worker 3 |5===========2
129
+ * Worker 4 |5============1
130
+ * Worker 5 |----------4=============0
131
+ * Worker 6 |-----------3==============0
132
+ * Worker 7 |------------2===============0
133
+ * Worker 8 |-------------1================0
134
+ * Worker 9 |--------------0=================0
135
+ */
136
+ assertEquals ( befores , [
137
+ 5 ,
138
+ 5 ,
139
+ 5 ,
140
+ 5 ,
141
+ 5 ,
142
+ 4 ,
143
+ 3 ,
144
+ 2 ,
145
+ 1 ,
146
+ 0 ,
147
+ ] ) ;
148
+ assertEquals ( afters , [
149
+ 5 ,
150
+ 4 ,
151
+ 3 ,
152
+ 2 ,
153
+ 1 ,
154
+ 0 ,
155
+ 0 ,
156
+ 0 ,
157
+ 0 ,
158
+ 0 ,
159
+ ] ) ;
160
+ } ,
161
+ ) ;
You can’t perform that action at this time.
0 commit comments