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? 2016-01-05 17:10 GMT+01:00 Denis Kudriashov <dionisi...@gmail.com>: > > 2016-01-05 16:54 GMT+01:00 Denis Kudriashov <dionisi...@gmail.com>: > >> 2016-01-05 16:06 GMT+01:00 Ben Coman <b...@openinworld.com>: >> >>> This is really strange! Why does the copied class Semaphore2 behave >>> differently to the original class Semaphore? This was in build 50510. >>> >> >> It is so frustrating. >> I add tests for your cases which is red now. And one for Semaphore >> (inside ReadWriteLockTests) which is green >> > > It is really crazy. I just try two experiments: > 1) I move semaphore critical: logic to Mutex. Our test with mutex become > red. > 2) I copy Semaphore>>critical: to #critical2:. And with it Semaphore test > become red. > > So somebody definitely know about #critical: selector and it receiver >