Class Semaphore Object count processList Methods Semaphore new count <- 0. processList <- List new ] Methods Semaphore set: aNumber count <- aNumber ] Methods Semaphore wait | process | (count = 0) ifTrue: [ scheduler critical: [ process <- scheduler currentProcess. processList add: process. scheduler removeProcess: process]. scheduler yield ] ifFalse: [ count <- count - 1] ] Methods Semaphore critical: aBlock self wait. aBlock value. self signal ] Methods Semaphore signal (processList size = 0) ifTrue: [ count <- count + 1] ifFalse: [ scheduler critical: [ processList first resume. processList removeFirst ]] ]