[squeak-dev] (no subject)
Jaromir Matas
mail at jaromir.net
Sat May 28 19:57:56 UTC 2022
Hi Eliot, Nicolas, all,
I've been circling around a question how to terminate, i.e. unwind a process sitting at a condition variable inside an unwind block:
The old suspend primitive 88 unblocks the process and the unwind can proceed. The new suspend primitive 568/578 on the other hand backs it up before the wait send which means the unwind in such case won't proceed far - it will get sat back to the wait. It looks like for termination/unwind purposes it's more convenient to use the old prim 88 (called from e.g. suspendAndUnblock method Nicolas suggested). Just making sure I haven't overlooked anything.
Now, if the process gets unblocked from the condition variable, the unwind would proceed *as if* the process got a signal on the condition variable. I've sent a question to the dev-list about such unblocking in case of a mutex. It looks suspicious that a process continues into the critical block without acquiring the ownership and even niling the existing ownership. I'm not sure I understand the Mutex correctly though. Here's the test:
testMutexBlockedInCritical "self run: #testMutexBlockedInCritical"
| lock sock proc wait |
lock := Mutex new.
sock := Semaphore new.
proc := [lock critical: [sock wait]] fork.
wait := [[] ensure: [lock critical: []]] fork. "<---- important"
Processor yield.
self assert: proc suspendingList == sock.
self assert: wait suspendingList == lock.
self deny: lock isEmpty.
self assert: lock isOwned.
wait terminate.
Processor yield.
self assert: wait isTerminated.
self assert: proc suspendingList == sock.
self assert: wait suspendingList == nil.
self assert: lock isEmpty.
self deny: lock isOwned "<---- is this right???"
Similarly, this modified Semaphore test fails too:
testSemaInCriticalWait2 "self run: #testSemaInCriticalWait"
"This tests whether a semaphore that has entered the wait in Semaphore>>critical:
leaves it without signaling the associated semaphore."
| s p |
s := Semaphore new.
p := [[] ensure: [s critical:[]]] fork. "<---- important"
Processor yield.
self assert:(p suspendingList == s).
p terminate.
self assert: 0 equals: s excessSignals "<---- s will have 1 excess signal!!!"
Is this something to worry about? How should a process unblocked from a condition variable continue, actually? Or maybe just in case of critical sections the behavior could be restricted, e.g. to avoid evaluating the critical section?
Thanks for any comments,
Jaromir
--
JaromÃr Matas
mail at jaromir.net
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20220528/1d77e0e6/attachment.html>
More information about the Squeak-dev
mailing list
|