<div dir="ltr">Hi Denis,<div><br></div><div>ignore this: I'm confused. I will catch up soon :-/</div><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 17, 2016 at 11:52 AM, Eliot Miranda <span dir="ltr"><<a href="mailto:eliot.miranda@gmail.com" target="_blank">eliot.miranda@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi Denis,<br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Mon, Jan 11, 2016 at 5:58 AM, Denis Kudriashov <span dir="ltr"><<a href="mailto:dionisiydk@gmail.com" target="_blank">dionisiydk@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br><div dir="ltr">Eliot I found that there are no methods for simulation code (if it right name for it). So stepping over new primitives failed (which is infinite recursion for Pharo case)</div></blockquote><div><br></div></span><div>Find the Squeak code attached. Merge it with the Pharo code (renaming ContextPart to COntext of course; something we'll do in Squeak eventually :-) )..</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><div dir="ltr"><div><br></div><div>Context>>doPrimitive: primitiveIndex method: meth receiver: aReceiver args: arguments<br></div><div>...</div><div><div>"Mutex>>primitiveEnterCriticalSection</div><div><span style="white-space:pre-wrap">        </span> Mutex>>primitiveTestAndSetOwnershipOfCriticalSection"</div><div><span style="white-space:pre-wrap">        </span>(primitiveIndex = 186 or: [primitiveIndex = 187]) ifTrue:</div><div><span style="white-space:pre-wrap">                </span>[| active effective |</div><div><span style="white-space:pre-wrap">                </span> active := Processor activeProcess.</div><div><span style="white-space:pre-wrap">                </span> effective := active effectiveProcess.</div><div><span style="white-space:pre-wrap">                </span> "active == effective"</div><div><span style="white-space:pre-wrap">                </span> value := primitiveIndex = 186</div><div><span style="white-space:pre-wrap">                                        </span>ifTrue: [aReceiver <b>primitiveEnterCriticalSectionOnBehalfOf</b>: effective]</div><div><span style="white-space:pre-wrap">                                        </span>ifFalse: [aReceiver <b>primitiveTestAndSetOwnershipOfCriticalSectionOnBehalfOf</b>: effective].</div><div><span style="white-space:pre-wrap">                </span> ^(self isPrimFailToken: value)</div><div><span style="white-space:pre-wrap">                        </span>ifTrue: [value]</div><div><span style="white-space:pre-wrap">                        </span>ifFalse: [self push: value]].</div></div><div><br></div><div>How this methods should be implemented?</div></div></span><div class="gmail_extra"><br><div class="gmail_quote"><span class="">2016-01-11 13:59 GMT+01:00 Denis Kudriashov <span dir="ltr"><<a href="mailto:dionisiydk@gmail.com" target="_blank">dionisiydk@gmail.com</a>></span>:<br></span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello.<span class=""><div>I publish slice <a href="https://pharo.fogbugz.com/f/cases/17373/Mutex-should-be-based-on-VM-primitives-and-implement-critical-methods-from-Semaphore" target="_blank">17373</a>.</div><div><br></div><div><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">I introduce LockOwnership class which implements VM primitives as:</span><br style="margin-top:0px;color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">- acquire</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">- tryAcquire</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">- release</span><br>(It comment saves copyright from CriticalSection)</div></span><div><br><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">Mutext uses it as ownership instance variable to implement critical methods correctly:</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">- critical:</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">- critical:ifLocked:</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">- critical:ifError:</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">- critical:ifCurtailed:</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">For the integration process old Mutex instance variables are not removed.</span><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"> So loading this code should not broke current Mutex instances. But when we integrate it Mutex will have only variable ownership.</span></div><div><br></div><div>If you look critical implementation you will understand why I not like semantic of primitives. it should be inverted in future. #acquire should return true when ownership is acquired right now.</div><div><br></div><div><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">Process>>terminate now detects waiting on LockOwnership and ask it to handle wait termination.Then LockOwnership inject right value into lock state variable. Such variables should be marked with special pragma </span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"> <lockAt: #ownershipVariableName tracksStateAt: 1> "index of local variable"</span><br style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><span style="color:rgb(74,74,74);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">Method can contain mulpible pragmas to reference all ownerships in method. ReadWriteLock for example needs this.</span><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-01-11 13:30 GMT+01:00 Henrik Johansen <span dir="ltr"><<a href="mailto:henrik.s.johansen@veloxit.no" target="_blank">henrik.s.johansen@veloxit.no</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> <br><div style="word-wrap:break-word"><div><div class="h5"><div><div><br><div><blockquote type="cite"><div>On 08 Jan 2016, at 4:25 , Ben Coman <<a href="mailto:btc@openinworld.com" target="_blank">btc@openInWorld.com</a>> wrote:</div><br><div><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">On Fri, Jan 8, 2016 at 9:39 PM, Ben Coman <</span><a href="mailto:btc@openinworld.com" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">btc@openinworld.com</a><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">> wrote:</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><blockquote type="cite" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">On Fri, Jan 8, 2016 at 5:42 PM, stephane ducasse<br><<a href="mailto:stephane.ducasse@gmail.com" target="_blank">stephane.ducasse@gmail.com</a>> wrote:<br><blockquote type="cite"><br>I have a (stupid) question.<br>Is the code running without the primitives?<br>Are the code below the primitives correct?<br>I asked that because we can have 100 eyes and brains on the smalltalk level and far less on the VM primitive level.<br></blockquote><br>Because:<br>1. Concurrency bugs can be subtle and the *exact* conditions can be<br>hard to reproduce for debugging. For example, the solution to a<br>couple of problems with Delay [1] [2] were solved by moving away from<br>Semaphore>>critical: to use signalling.<br><br>2. The in-image atomicity of determining whether a signal was actually<br>consumed or not during process suspension/termination is awkward. Its<br>seems hard to *really* know for sure it right (but I haven't looked in<br>depth into Denis' latest proposals.)<br><br>3. The existing in-image implementation of Semaphore>>critical messes<br>around in Process>>terminate in a *special* way that is not easy for<br>those 100 eyes to understand. For example, I personally am not<br>comfortable with understanding how the special Semaphore handling in<br>Process>>terminate works, but I can easily follow how<br>primitiveEnterCriticalSection just looking at the code [3].<br></blockquote><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">Points 2 & 3 might possibly be addressed by having new primitiveWaitReturned</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">*always* return true, so if the process is terminated while waiting,</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">the assignment to signalConsumed doesn't occur...</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> critical: mutuallyExcludedBlock</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> signalConsumed := false.</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> [</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> signalConsumed := self primitiveWaitReturned.</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> blockValue := mutuallyExcludedBlock value</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> ] ensure: [ signalConsumed ifTrue: [self signal] ].</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> ^blockValue</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">where primitiveWait (</span><a href="https://git.io/vuDjd" style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px" target="_blank">https://git.io/vuDjd</a><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">) is copied</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">and (just guessing) the marked line added...</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> primitiveWaitReturned</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> | sema excessSignals activeProc inInterpreter |</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> sema := self stackTop. "rcvr"</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">"==>>" self pop: argumentCount + 1 thenPush: objectMemory trueObject. "<<=="</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> excessSignals := self fetchInteger: ExcessSignalsIndex ofObject: sema.</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> excessSignals > 0</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> ifTrue:</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> [self storeInteger: ExcessSignalsIndex</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> ofObject: sema</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> withValue: excessSignals - 1]</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> ifFalse:</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> inInterpreter := instructionPointer >= objectMemory startOfMemory.</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> activeProc := self activeProcess.</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> self addLastLink: activeProc toList: sema.</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> self transferTo: self wakeHighestPriority from: CSWait.</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important"> self</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">forProcessPrimitiveReturnToExecutivePostContextSwitch: inInterpreter]</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">which I guess could be added quickly if Esteban could compile the</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">latest pharo-spur-vm ;)</span><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><span style="font-family:Helvetica;font-size:12px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important">cheers -ben</span></div></blockquote><br></div></div></div></div></div><div>Won't work, there's no guarantee thread has actually ran and signalConsumed been assigned the primitive result after Semaphore resumed the waiting thread, before a higher priority thread runs and terminates it. (which is exactly the case handled by special code in #terminate)</div><div><br></div><div>Cheers,</div><div>Henry</div></div></blockquote></div></div></blockquote></div></div></blockquote><div> </div></div><div><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div></div>