I found problem. Look at Process>>terminate.
There is special place:
"Figure
out if we are terminating the process while waiting in
Semaphore>>critical:
In this
case, pop the suspendedContext so that we leave the ensure:
block inside
Semaphore>>critical:
without signaling the semaphore."
(oldList
class == Semaphore and: [
self
halt.
suspendedContext
method == (Semaphore compiledMethodAt: #critical:) ])
ifTrue: [
suspendedContext
:= suspendedContext home ].
Really crazy. Comment inside #critical: method said that we
should signal in any case. But #terminate method said that we
should not allow signalling in that case.��
Why it is not implemented inside #critical: method by
#ifCurtailed: logic?��