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
>

Reply via email to