The Mutex primitives return a tri-state value: true, false and nil. So we would have...
NewMutex>>critical: mutuallyExcludedBlock ifLocked: alternativeBlock ^lock tryAcquire ifNil: mutuallyExcludedBlock ifNotNil: [:acquired| acquired ifTrue: [mutuallyExcludedBlock ensure: [lock strictRelease]] ifFalse: alternativeBlock ]. NewMutex>>critical: mutuallyExcludedBlock ^lock waitAcquire ifNil: mutuallyExcludedBlock ifNotNil:[ mutuallyExcludedBlock ensure: [lock strictRelease] ]. So we would have NewMutex>>critical: aBlock ifLocked: lockedBlock ^lock tryAcquire ifNil: mutuallyExcludedBlock ifNotNil: [:acquired | acquired ifTrue: [mutuallyExcludedBlock ensure: [lock strictRelease]] ifFalse: alternativeBlock ]. Mutex>>critical: aBlock ifLocked: lockedBlock ^self primitiveTestAndSetOwnershipOfCriticalSection ifNil: [lockedBlock value] ifNotNil:[:alreadyOwner| alreadyOwner ifTrue: [aBlock value] ifFalse: [aBlock ensure: [self primitiveExitCriticalSection]]] ifNil:ifNotNil: Also, I notice several of RBMessageNode>>isInlineXXXX methods contain... self receiver isBlock ifTrue: [^ false]. Does this mean that... [ true ] ifTrue: [2] ifFalse: [3] is not inlined?