If you run it, and are confused '2 start' never shows up in transcript, I intended the start messages to be outside critical blocks, sorry for old copypasta.
Cheers, Henry > On 06 Jan 2016, at 1:29 , Henrik Johansen <henrik.s.johan...@veloxit.no> > wrote: > >> >> On 05 Jan 2016, at 7:52 , Henrik Johansen <henrik.s.johan...@veloxit.no >> <mailto:henrik.s.johan...@veloxit.no>> wrote: >> >> >>> On 05 Jan 2016, at 7:24 , Denis Kudriashov <dionisi...@gmail.com >>> <mailto:dionisi...@gmail.com>> wrote: >>> >>> >>> 2016-01-05 18:49 GMT+01:00 Henrik Johansen <henrik.s.johan...@veloxit.no >>> <mailto:henrik.s.johan...@veloxit.no>>: >>> ifCurtailed: only unwinds if an error/termination occured, so that would >>> mean not signalling the semaphore when everything goes as planned, and we >>> leave the critical section... >>> >>> I not suppose to replace #ensure: with #ifCurtailed:. I think about: >>> >>> signalRequired := false. >>> [ >>> [signalRequired := true. >>> self wait] ifCurtailed: [signalRequired := false]. >>> blockValue := mutuallyExcludedBlock value >>> ] ensure: [signalRequired ifTrue: [self signal]]. >>> ^blockValue >>> >> >> Ah, that makes more sense, yes, much simpler than what I wrote! >> AFAICT, it should work too ;) > > After thinking a bit more, it suffers from a similar edge case where the > semaphore has been signaled, but process is terminated before it's had a > chance to run, after changing to ifCurtailed and cleaning #terminate: > > "This runs on UI thread, pri 40" > waiter := Semaphore new. > waiter2 := Semaphore new. > lock := Semaphore forMutualExclusion. > > proc := [lock critical: [ Transcript crShow: '1 start'. > waiter wait. > Transcript crShow: '1 done'.]] newProcess. > proc priority: 70. > proc resume. > > proc2 := [lock critical: [ Transcript crShow: '2 start'. > waiter2 wait. > Transcript crShow: '2 done'. ]] newProcess. > proc2 priority: 15. > proc2 resume. > > "Yield for proc2 so it gets to waiting on lock" > 1 second wait. > "Signal waiter and yield, causing proc1 to run, and release the lock. lock > will then remove proc2 from waiting list" > waiter signal. > Processor yield. > "We have a higher pri than proc2, and will resume execution here before proc2 > has chance to run" > proc2 terminate. > "proc2 has been curtailed before running, thus ifCurtailed: guard is still on > stack and will be run as part of termination." > (lock instVarNamed: 'excessSignals') 0 "Should be 1" > > Cheers, > Henry
signature.asc
Description: Message signed with OpenPGP using GPGMail