|
Just thought I'd share something enlightening I learnt today, a
curious surprise...
When a process is terminated, the #ensure: unwind block effectively
inherits the priority of the terminator process.
Thus the following...
log := OrderedCollection new.
s := Semaphore new.
p :=
[ [ log add: 1.
s signal.
log add: 4.
] ensure: [log add: 5]
] forkAt: 30.
s wait.
log add: 2.
"p terminate."
log add: 3.
100 milliSeconds wait.
Transcript crShow: log.
...gives {1 2 3 4 5} as expected.
However uncommenting the terminate statement produces {1 2 5 3}.
Quite non-intuitive** to have the "5" code inside the priority 30 block
execute before the "3" code of the priority 40 of the UI/Playground.
**meaning it bit me for a few hours trying to understand some
ProcessTests related to Case 17588.
cheers -ben
|