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?

Reply via email to