[squeak-dev] The Inbox: KernelTests-jar.436.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Jun 20 16:16:53 UTC 2022
A new version of KernelTests was added to project The Inbox:
http://source.squeak.org/inbox/KernelTests-jar.436.mcz
==================== Summary ====================
Name: KernelTests-jar.436
Author: jar
Time: 20 June 2022, 6:16:50.946618 pm
UUID: e028fc29-0d67-2840-b4cf-be8269e69fc3
Ancestors: KernelTests-ct.435
Add semaphore and mutex tests for #suspend vs #suspendAndUnblock semantics
=============== Diff against KernelTests-ct.435 ===============
Item was added:
+ ----- Method: MutexTest>>testSuspendAndResume (in category 'tests') -----
+ testSuspendAndResume "self run: #testSuspendAndResume"
+ "Test the semantics of suspending and resuming a process blocked on a mutex;
+ Note the difference between #suspend and #suspendAndUnblock.
+ Note: this test will fail when run with older VMs without primitive suspend 578."
+
+ | lock sock proc wait |
+ lock := Mutex new.
+ sock := Semaphore new.
+ proc := [lock critical: [sock wait]] fork.
+ wait := [lock critical: []] fork.
+ Processor yield.
+ self assert: proc suspendingList == sock.
+ self assert: wait suspendingList == lock.
+ self deny: lock isEmpty.
+ self assert: lock isOwned.
+ wait suspend; resume.
+ "wait returned back to the mutex"
+ Processor yield.
+ self assert: wait isBlocked.
+ self assert: proc suspendingList == sock.
+ self assert: wait suspendingList == lock.
+ self deny: lock isEmpty.
+ self assert: lock isOwned.
+
+ "now the same with suspendAndUnblock"
+ lock := Mutex new.
+ sock := Semaphore new.
+ proc := [lock critical: [sock wait]] fork.
+ wait := [lock critical: []] fork.
+ Processor yield.
+ self assert: proc suspendingList == sock.
+ self assert: wait suspendingList == lock.
+ self deny: lock isEmpty.
+ self assert: lock isOwned.
+ wait suspendAndUnblock; resume.
+ "wait unblocked from the mutex BUT..."
+ Processor yield.
+ self assert: wait isTerminated.
+ self assert: proc suspendingList == sock.
+ self assert: wait suspendingList == nil.
+ self assert: lock isEmpty.
+ "... left this MESS behind:"
+ self deny: lock isOwned
+ "Indeed, lock should have stayed owned;
+ this is why primitive 88 is so dangerous"!
Item was added:
+ ----- Method: SemaphoreTest>>testSuspendAndResume (in category 'tests') -----
+ testSuspendAndResume
+ "Test the semantics of suspending and resuming a process blocked on a semaphore;
+ Note the difference between #suspend and #suspendAndUnblock.
+ Note: this test will fail when run with older VMs without primitive suspend 578."
+
+ | p |
+ p := [Semaphore new wait] fork.
+ Processor yield.
+ p suspend; resume.
+ "suspend removes p from the semaphore but backs up its pc;
+ hence when resumed p reenters the wait state"
+ Processor yield.
+ self assert: p isBlocked.
+
+ p := [Semaphore new wait] fork.
+ Processor yield.
+ p suspendAndUnblock; resume.
+ "suspendAndUnblock just removes p from the semaphore;
+ hence when resumed p simply proceeds"
+ Processor yield.
+ self assert: p isTerminated!
More information about the Squeak-dev
mailing list
|