More Delay/Semaphore "fun"

Gary Chambers gazzaguru2 at btinternet.com
Fri Oct 5 21:31:06 UTC 2007


Win and Linux. Depending on "other" activities, moving mouse, changing
active windows, can be 3 to 33! Depends on processor speed, I guess (the
critical "window").

We're on IRC at the moment, would be nice to chat with you there...
(freenode.net).


> -----Original Message-----
> From: squeak-dev-bounces at lists.squeakfoundation.org 
> [mailto:squeak-dev-bounces at lists.squeakfoundation.org] On 
> Behalf Of Andreas Raab
> Sent: 05 October 2007 10:22 pm
> To: The general-purpose Squeak developers list
> Subject: Re: More Delay/Semaphore "fun"
> 
> 
> Hi Gary -
> 
> Gary Chambers wrote:
> > *I* do get "too few signals" even after the extra change... 
> At least 
> > the "too many" problem seems to be fixed! Is a start...
> 
> Hm ... I've been running this code now for a while now and 
> didn't have a 
> single problem. What platform are you running on? Do you have 
> anything 
> else running in the background when you try it? How many 
> loops does it 
> usually go through before exploding?
> 
> Cheers,
>    - Andreas
> 
> > Best to fork the thing off with a halt unless you like unresponsive 
> > UIs with lots of popups...
> > 
> > --------------------
> > 
> > s _ Semaphore forMutualExclusion.
> > i _ 1.
> > 
> > "Loop while there's not too many signals on the semaphore (should be
> > 0 or 1)"
> > [[(s instVarNamed: #excessSignals) < 2] whileTrue: [
> > 
> > "Fork two processes to do things inside the semaphore"
> > p _ [[true] whileTrue: [s critical: [(Delay 
> forMilliseconds: 10) wait]]]
> > 	forkNamed: 'p', i printString.
> > 	
> > q _ [[true] whileTrue: [s critical: [(Delay 
> forMilliseconds: 10) wait]]]
> > 	forkNamed: 'q', i printString.
> > 
> > "Increment the counter just to make it easy to ID the 
> processes" i _ i 
> > + 1.
> > 
> > "Delay to give the processes a chance to resume and potentially get
> > into the critical on the Semaphore"
> > (Delay forMilliseconds: 500 atRandom) wait.
> > p terminate.
> > (Delay forMilliseconds: 500 atRandom) wait.
> > q terminate.
> > 
> > "After terminating the two processes, the excess signals should be 1
> > on the Semaphore because
> > nothing is in critical any more, assuming the processes terminated  
> > properly and the unwind happened
> > as it should, but... "
> > 
> > "In our images with Andreas' recent Delay and Semaphore fixes, we
> > always get one of these two
> > error conditions (although normally too many signals). This would  
> > cause deadlock in 'real world' situations"
> > (s instVarNamed: #excessSignals) = 0 ifTrue: [
> > 	WorldState addDeferredUIMessage: [self inform: 'Too few 
> signals  
> > after ', i printString, ' loops'].
> > 	self halt]].
> > self inform: 'Too many signals after ', i printString, ' 
> loops'] fork
> > 
> > --------------
> > 
> > Varies in the number of successful loops
> > 
> > 
> >> -----Original Message-----
> >> From: squeak-dev-bounces at lists.squeakfoundation.org
> >> [mailto:squeak-dev-bounces at lists.squeakfoundation.org] On 
> >> Behalf Of Andreas Raab
> >> Sent: 05 October 2007 6:34 pm
> >> To: The general-purpose Squeak developers list
> >> Subject: Re: More Delay/Semaphore "fun"
> >>
> >>
> >> Hi Simon -
> >>
> >> I think I got it. Look at this:
> >>
> >> Semaphore>>critical:
> >>    caught := false.
> >>    [
> >>      caught := true.
> >>      self wait.
> >>      blockValue := mutuallyExcludedBlock value
> >>    ] ensure: [
> >>      caught ifTrue: [self signal].
> >>    ].
> >>
> >> Now let's run a little thought experiment:
> >> * p1 enters the #critical:
> >> * enters ensure: block
> >> * sets "caught"
> >> * waits on semaphore
> >> * enters mutually excluded block; does its stuff
> >>
> >> And then:
> >> * p2 enters #critical:
> >> * enters ensure: block
> >> * sets "caught"
> >> * waits on semaphore
> >> * gets killed
> >>
> >> At this point, we enter the ensure: handler for p2. And will
> >> 'ya look at 
> >> that: "caught" is set even though p2 didn't ever own the critical 
> >> section. This will make it signal the semaphore and screw up 
> >> the rest of it.
> >>
> >> Okay, obviously this needs to be changed to say, e.g.:
> >>
> >>      self wait.
> >>      caught := true. "entered semaphore successfully"
> >>
> >> I have an image running in the background with your loop and
> >> it seems to 
> >> be doing fine for now. Coincidentally, I have not seen the 
> >> effect that 
> >> too *few* signals were generated; are you certain you ever 
> had that 
> >> effect? It couldn't be explained with the above sequence at all.
> >>
> >> Cheers,
> >>    - Andreas
> >>
> >> Simon Kirk wrote:
> >>> Hi all. We've been playing with Semaphores and Delays
> >> recently, as we
> >>> were having some problems with said issues. We tried
> >> installing Andreas'
> >>> fixes, but if we do, the code below yields some strange
> >> results when
> >>> evaluated in a workspace:
> >>>
> >>>
> >>> s _ Semaphore forMutualExclusion.
> >>> i _ 1.
> >>>
> >>> "Loop while there's not too many signals on the semaphore
> >> (should be 0
> >>> or 1)"
> >>> [(s instVarNamed: #excessSignals) < 2] whileTrue: [
> >>>
> >>> "Fork two processes to do things inside the semaphore"
> >>> p _ [[true] whileTrue: [s critical: [(Delay
> >> forMilliseconds: 10) wait]]]
> >>>     forkNamed: 'p', i printString.
> >>>     
> >>> q _ [[true] whileTrue: [s critical: [(Delay
> >> forMilliseconds: 10) wait]]]
> >>>     forkNamed: 'q', i printString.
> >>>
> >>> "Increment the counter just to make it easy to ID the
> >> processes" i _ i
> >>> + 1.
> >>>
> >>> "Delay to give the processes a chance to resume and 
> potentially get
> >>> into
> >>> the critical on the Semaphore"
> >>> (Delay forMilliseconds: 500 atRandom) wait.
> >>> p terminate.
> >>> (Delay forMilliseconds: 500 atRandom) wait.
> >>> q terminate.
> >>>
> >>> "After terminating the two processes, the excess signals
> >> should be 1
> >>> on
> >>> the Semaphore because
> >>> nothing is in critical any more, assuming the processes terminated
> >>> properly and the unwind happened
> >>> as it should, but... "
> >>>
> >>> "In our images with Andreas' recent Delay and Semaphore fixes, we
> >>> always
> >>> get one of these two
> >>> error conditions (although normally too many signals). This 
> >> would cause
> >>> deadlock in 'real world' situations"
> >>> (s instVarNamed: #excessSignals) = 0 ifTrue: [
> >>>     WorldState addDeferredUIMessage: [self inform: 'Too 
> few signals
> >>> after ', i printString, ' loops']]].
> >>> self inform: 'Too many signals after ', i printString, ' loops'.
> >>>
> >>>
> >>> Don't know if we've done something wrong here, but if not 
> I hope it
> >>> may
> >>> give cleverer people than me some more pointers to the root 
> >> of the whole
> >>> Semaphore problem :)
> >>>
> >>> S
> >>>
> >>>
> >>> Pinesoft Computers are registered in England, Registered number: 
> >>> 2914825. Registered office: 266-268 High Street, Waltham
> >> Cross, Herts,
> >>> EN8 7EA
> >>>
> >>>
> >>>
> >>> This message has been scanned for viruses by BlackSpider
> >> MailControl -
> >>> www.blackspider.com
> >>>
> >>>
> >>>
> >>
> > 
> > 
> > 
> 
> 




More information about the Squeak-dev mailing list