I'm not qualified to judge, but is sounds okay.�� I have an alternative
proposal to consider that hopefully might remove Semaphore handling
completely from Process>>terminate.
What if we have a wait primitive that instead of returning itself
(i.e. a Semaphore), it always returns true.�� ��Then if the process is
terminated while the primitive is waiting, before it consumes a
signal, the assignment to signalConsumed never occurs.�� Then we
have...
�� critical: mutuallyExcludedBlock
�� �� signalConsumed := false.
�� �� [
�� �� �� �� signalConsumed := self primWaitSucceeded.
�� �� �� �� blockValue := mutuallyExcludedBlock value
�� �� ] ensure: [ signalConsumed ifTrue: [self signal] ].
�� �� ^blockValue
It *feels* more atomic.�� Someone knowledgeable with the vm would need
to advise whether after the primitive wakes up and consumes a signal,
the assignment into signalConsumed can be guaranteed to occur before
the process gets a chance to terminate, even if the primitive needs to
directly poke the value into signalConsumed.