Done. 

        https://github.com/pharo-project/pharo/issues/5466

It was so simple that I preferred to do it myself so like that I will look like 
a great Pharo contributor. 





> On 10 Jan 2020, at 06:30, Danil Osipchuk <danil.osipc...@gmail.com> wrote:
> 
> Maybe to add this into the class comment, this is the most concise and clear 
> description of how it works i've ever seen
> 
> пт, 10 янв. 2020 г., 8:13 Eliot Miranda <eliot.mira...@gmail.com 
> <mailto:eliot.mira...@gmail.com>>:
> 
> 
> On Thu, Jan 9, 2020 at 5:03 AM ducasse <steph...@netcourrier.com 
> <mailto:steph...@netcourrier.com>> wrote:
> Hi
> 
> I wanted to explain
> 
> | semaphore p1 p2 |
> semaphore := Semaphore new.
> p1 := [ semaphore wait.
>         'p1' crTrace ] fork.
> 
> p2 := [semaphore signal.
>          'p2' crTrace ] fork.
> 
> displays p2 and p1. 
> but I would like explain clearly but it depends on the semantics of signal. 
> 
> 
> - ==p1== is scheduled and its execution starts to wait on the semaphore, so 
> it is removed from the run queue of the scheduler and added to the waiting 
> list of the semaphore.
> - ==p2== is scheduled and it signals the semaphore. The semaphore takes the 
> first waiting process (==p1==) and reschedule it by adding it to the end of 
> the suspended lists.
> 
> Since Smalltalk does not have a preemptive scheduler, neither p1 nor p2 will 
> start to run until something else happens after the execution of p1 := [...] 
> fork. p2 := [...] fork. So for example, if there is Processor yield then p1 
> can start to run.
> 
> So you need to add code to your example to be able to determine what will 
> happen.  The easiest thing would be to delay long enough that both can run.  
> 1 millisecond is more than enough.
>  
> Now this sentence "The semaphore takes the first waiting process (==p1==) and 
> reschedule it by adding it to the end of the suspended lists.” is super 
> naive. Is the semaphore signalling scheduled? or not?
> 
> I would say these three things, something like this:
> 
> "A semaphore is a queue (implemented as a linked list) and an excess signals 
> count, which is a non-negative integer.  On instance creation a new semaphore 
> is empty and has a zero excess signals count.  A semaphore created for mutual 
> exclusion is empty and has an excess signals count of one."
> 
> "When a process waits on a semaphore, if the semaphore's excess signals count 
> is non-zero, then the excess signal count is decremented, and the process 
> proceeds.  But if the semaphore has a zero excess signals count then the 
> process is unscheduled and added to the end of the semaphore, after any other 
> processes that are queued on the semaphore."
> 
> "When a semaphore is signaled, if it is not empty, the first process is 
> removed from it and added to the runnable processes in the scheduler. If the 
> semaphore is empty its excess signals count is incremented.
> 
> Given these three statements it is easy to see how they work, how to use them 
> for mutual exclusion, etc.
> 
> 
> 
> signal
>         "Primitive. Send a signal through the receiver. If one or more 
> processes 
>         have been suspended trying to receive a signal, allow the first one 
> to 
>         proceed. If no process is waiting, remember the excess signal. 
> Essential. 
>         See Object documentation whatIsAPrimitive."
> 
>         <primitive: 85>
>         self primitiveFailed
> 
>         "self isEmpty    
>                 ifTrue: [excessSignals := excessSignals+1]    
>                 ifFalse: [Processor resume: self removeFirstLink]"
> 
> 
> I wanted to know what is really happening when a semaphore is signalled. 
> Now resume: does not exist on Processor. 
> 
> I will look in the VM code. 
> 
> 
> S
> 
> 
> 
> 
> 
> S.
> 
> 
> 
> -- 
> _,,,^..^,,,_
> best, Eliot

Reply via email to