Determining if a Process is waiting on a Semaphore

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Determining if a Process is waiting on a Semaphore

Ben Coman
Looking at at the primitive comment in...
  Semaphore>>wait
     "excessSignals>0
        ifTrue: [excessSignals := excessSignals-1]
        ifFalse: [self addLastLink: Processor activeProcess suspend]"

I expected/hoped the following...
   Transcript clear.
   s := Semaphore new.
   p := [ Transcript crShow: '1'. s wait. Transcript crShow: '2' ] forkAt: 50.
   Transcript crShow: p isSuspended.
   s signal.

would produce
1
true
2

but I get
1
false
2

How do I determine from another thread if a Process is waiting on a
Semaphore,  or even better, waiting on a particular semaphore?

cheers -ben

Reply | Threaded
Open this post in threaded view
|

Re: Determining if a Process is waiting on a Semaphore

Guillermo Polito
A bit more on that:

Processor activeProcess suspendingList. => nil “An active process has nil as a list"
Processor activeProcess isSuspended. => true??


p := [  ] forkAt: 30.
p suspendingList. => “the list where it is waiting ready to run"
p isSuspended. => false?

s := Semaphore new.
p := ([ s wait ] forkAt: 50).
p suspendingList. => “the semaphore where it is waiting to be unsuspended, since a semaphore is a list"
p isSuspended. => false?

It is evident that a suspended process has the list where it is waiting, and the active process has nil.
Then, I think the problem is that isSuspended is wrong.

isSuspended
        ^myList isNil or: [ myList isEmpty ]

When it should be maybe

isSuspended
        ^myList notNil


Am I wrong?

Then, to actually answer your question, you can check if you are waiting in a semaphore or not, you can compare that the suspendingList is = to the semaphore. Of course we should also revise the API ^^.

s := Semaphore new.
p := ([ s wait ] forkAt: 50).
p suspendingList == s

Guille


> On 30 dic 2015, at 5:35 a.m., Ben Coman <[hidden email]> wrote:
>
> Looking at at the primitive comment in...
>  Semaphore>>wait
>     "excessSignals>0
>        ifTrue: [excessSignals := excessSignals-1]
>        ifFalse: [self addLastLink: Processor activeProcess suspend]"
>
> I expected/hoped the following...
>   Transcript clear.
>   s := Semaphore new.
>   p := [ Transcript crShow: '1'. s wait. Transcript crShow: '2' ] forkAt: 50.
>   Transcript crShow: p isSuspended.
>   s signal.
>
> would produce
> 1
> true
> 2
>
> but I get
> 1
> false
> 2
>
> How do I determine from another thread if a Process is waiting on a
> Semaphore,  or even better, waiting on a particular semaphore?
>
> cheers -ben
>


Reply | Threaded
Open this post in threaded view
|

Re: Determining if a Process is waiting on a Semaphore

Guillermo Polito
Ben, did that help you?

> On 30 dic 2015, at 12:49 p.m., Guillermo Polito <[hidden email]> wrote:
>
> A bit more on that:
>
> Processor activeProcess suspendingList. => nil “An active process has nil as a list"
> Processor activeProcess isSuspended. => true??
>
>
> p := [  ] forkAt: 30.
> p suspendingList. => “the list where it is waiting ready to run"
> p isSuspended. => false?
>
> s := Semaphore new.
> p := ([ s wait ] forkAt: 50).
> p suspendingList. => “the semaphore where it is waiting to be unsuspended, since a semaphore is a list"
> p isSuspended. => false?
>
> It is evident that a suspended process has the list where it is waiting, and the active process has nil.
> Then, I think the problem is that isSuspended is wrong.
>
> isSuspended
> ^myList isNil or: [ myList isEmpty ]
>
> When it should be maybe
>
> isSuspended
> ^myList notNil
>
>
> Am I wrong?
>
> Then, to actually answer your question, you can check if you are waiting in a semaphore or not, you can compare that the suspendingList is = to the semaphore. Of course we should also revise the API ^^.
>
> s := Semaphore new.
> p := ([ s wait ] forkAt: 50).
> p suspendingList == s
>
> Guille
>
>
>> On 30 dic 2015, at 5:35 a.m., Ben Coman <[hidden email]> wrote:
>>
>> Looking at at the primitive comment in...
>> Semaphore>>wait
>>    "excessSignals>0
>>       ifTrue: [excessSignals := excessSignals-1]
>>       ifFalse: [self addLastLink: Processor activeProcess suspend]"
>>
>> I expected/hoped the following...
>>  Transcript clear.
>>  s := Semaphore new.
>>  p := [ Transcript crShow: '1'. s wait. Transcript crShow: '2' ] forkAt: 50.
>>  Transcript crShow: p isSuspended.
>>  s signal.
>>
>> would produce
>> 1
>> true
>> 2
>>
>> but I get
>> 1
>> false
>> 2
>>
>> How do I determine from another thread if a Process is waiting on a
>> Semaphore,  or even better, waiting on a particular semaphore?
>>
>> cheers -ben
>>
>