[squeak-dev] The Trunk: Kernel-jar.1476.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Jun 9 08:15:48 UTC 2022
Marcel Taeumel uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-jar.1476.mcz
==================== Summary ====================
Name: Kernel-jar.1476
Author: jar
Time: 7 June 2022, 5:26:20.195964 pm
UUID: 485a13c3-c632-aa4b-bc0d-a1a7fb9a3376
Ancestors: Kernel-jar.1475
- fix synchronization between the terminating process and the process that invoked the termination
- add further protection against multiple termination (it makes the code uglier but I can't help it)
- improve the comment (it's still too long and insufficient though ;) )
Complemented by additional tests (I'll bundle all of them in one changeset)
=============== Diff against Kernel-jar.1475 ===============
Item was changed:
----- Method: Process>>terminate (in category 'changing process state') -----
terminate
"Stop the process that the receiver represents forever.
Unwind to execute pending #ensure:/#ifCurtailed: blocks before terminating;
allow all unwind blocks to run; if they are currently in progress, let them finish."
"This is the kind of behavior we expect when terminating a healthy process.
See further comments in #terminateAggressively and #destroy methods dealing
with process termination when closing the debugger or after a catastrophic failure.
If terminating the active process, create a new stack and run unwinds from there.
If terminating a suspended process (including runnable and blocked), always
suspend the terminating process first so it doesn't accidentally get woken up.
Equally important is the side effect of the suspension: In 2022 a new suspend
semantics has been introduced: the revised #suspend backs up a process waiting
on a conditional variable to the send that invoked the wait state, while the previous
#suspend simply removed the process from the conditional variable's list it was
previously waiting on; see #suspend and #suspendAndUnblock comments.
If the process is in the middle of a #critical: critical section, release it properly.
To allow a suspended process to unwind itself, create a new stack for the process
being terminated and resume the suspended process to complete its termination
from the new parallel stack. Use a semaphore to make the process that invoked
the termination wait for self's completion. Execute the termination in the ensure
argument block to ensure it completes even if the terminator process itself gets
+ terminated before it's finished; see testTerminateInTerminate and others."
- terminated before it's finished; see testTerminateInTerminate."
| context |
self isActiveProcess ifTrue: [
context := thisContext.
+ ^[[] ensure: [context unwindTo: nil]. self suspend] asContext jump].
- ^[context unwindTo: nil. self suspend] asContext jump].
[] ensure: [ | terminator |
self suspendAndReleaseCriticalSection.
context := suspendedContext ifNil: [^self].
terminator := Semaphore new.
+ context bottomContext insertSender: (Context contextEnsure: [terminator signal]).
+ self suspendedContext: [[] ensure: [context unwindTo: nil]. self suspend] asContext;
+ priority: Processor activePriority;
+ resume.
- suspendedContext := [context unwindTo: nil. terminator signal. self suspend] asContext.
- self priority: Processor activePriority; resume.
terminator wait]!
More information about the Squeak-dev
mailing list
|