'From Croquet1.0beta of 11 April 2006 [latest update: #1] on 21 June 2008 at 4:32:05 pm'! TestCase subclass: #SimulationBugs instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'KernelTests-Processes'! !SimulationBugs methodsFor: 'tests' stamp: 'ar 6/21/2008 16:31'! testStepOutOfCriticalAndTerminate "Illustrates a bug in the simulation of stepping out of Semaphore>>critical:." | sema process ctx newCtx | sema := Semaphore forMutualExclusion. self assert: sema isSignaled. process := [sema critical:[sema wait]] forkAt: Processor activePriority + 1. self deny: sema isSignaled. "At this point the process should have myList set to sema" self assert: process suspendingList == sema. "Now step out of the wait and back into critical:" ctx := process suspendedContext. [ctx method == (Semaphore compiledMethodAt: #critical:)] whileFalse:[ newCtx := process completeStep: ctx. newCtx = ctx ifTrue:[process stepToSendOrReturn]. ctx := newCtx. ]. "At this point, terminating the process should leave the semaphore signaled" process terminate. self assert: sema isSignaled.! ! !SimulationBugs methodsFor: 'tests' stamp: 'art 6/21/2008 16:26'! testStepOutOfSemaphoreWait "Illustrates a bug in the simulation of stepping out of Semaphore>>wait. A simplified version for testStepOutOfCriticalAndTerminate." | sema process | sema := Semaphore new. process := [sema wait] forkAt: Processor activePriority + 1. "At this point the process should have myList set to sema" self assert: process suspendingList == sema. "Now step out of the wait" process completeStep: process suspendedContext. "At this point we expect myList to be nil since we're no longer waiting on the semaphore" self assert: process suspendingList == nil. ! !