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?��