@@ -12,17 +12,10 @@ class CountingSemaphore {
1212 }
1313 }
1414
15- enter ( callback ) {
15+ enter ( ) {
1616 Atomics . wait ( this . counter , 0 , 0 ) ;
1717 const prev = Atomics . sub ( this . counter , 0 , 1 ) ;
18- if ( prev > 0 ) {
19- setTimeout ( callback , 0 ) ;
20- } else {
21- this . leave ( ) ;
22- setTimeout ( ( ) => {
23- this . enter ( callback ) ;
24- } , 0 ) ;
25- }
18+ if ( prev === 0 ) this . leave ( ) ;
2619 }
2720
2821 leave ( ) {
@@ -35,7 +28,8 @@ class CountingSemaphore {
3528
3629if ( isMainThread ) {
3730 const buffer = new SharedArrayBuffer ( 4 ) ;
38- const semaphore = new CountingSemaphore ( buffer , 0 , 2 ) ;
31+ // Try to change 10 to 2 at next lene to check solution
32+ const semaphore = new CountingSemaphore ( buffer , 0 , 10 ) ;
3933 console . dir ( { semaphore : semaphore . counter [ 0 ] } ) ;
4034 for ( let i = 0 ; i < 20 ; i ++ ) {
4135 new Worker ( __filename , { workerData : buffer } ) ;
@@ -47,12 +41,11 @@ if (isMainThread) {
4741 const file = `file-${ threadId } .dat` ;
4842 console . dir ( { threadId, semaphore : semaphore . counter [ 0 ] } ) ;
4943
50- semaphore . enter ( ( ) => {
51- const data = `Data from ${ threadId } ` . repeat ( REPEAT_COUNT ) ;
52- fs . writeFile ( file , data , ( ) => {
53- fs . unlink ( file , ( ) => {
54- semaphore . leave ( ) ;
55- } ) ;
44+ semaphore . enter ( ) ;
45+ const data = `Data from ${ threadId } ` . repeat ( REPEAT_COUNT ) ;
46+ fs . writeFile ( file , data , ( ) => {
47+ fs . unlink ( file , ( ) => {
48+ semaphore . leave ( ) ;
5649 } ) ;
5750 } ) ;
5851}
0 commit comments