<div dir="ltr">Hi Levente,<div><br></div><div>    thanks!!</div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Dec 31, 2016 at 8:48 AM, Levente Uzonyi <span dir="ltr"><<a href="mailto:leves@caesar.elte.hu" target="_blank">leves@caesar.elte.hu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><br>
On Sat, 31 Dec 2016, <a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"></blockquote></blockquote><div>[snip] </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
Item was changed:<br>
 ----- Method: StackInterpreterSimulator>>sig<wbr>nalSemaphoreWithIndex: (in category 'process primitive support') -----<br>
 signalSemaphoreWithIndex: index<br>
        "This is a non-thread-safe simulation.  See platforms/Cross/vm/sqExternalS<wbr>emaphores.c<br>
</blockquote>
<br>
It could be made thread safe:<br>
<br>
        | originalResponses newRequests newResponses |<br>
        index <= 0 ifTrue: [^false].<br>
        index > externalSemaphoreSignalRequest<wbr>s size ifTrue: [<br>
                newRequests := Array new: 1 << index highBit withAll: 0.<br>
                newResponses := newRequests copy ].<br>
        originalResponses := externalSemaphoreSignalRespons<wbr>es.<br>
        [ index > externalSemaphoreSignalRequest<wbr>s size ] whileTrue: [<br>
                newRequests<br>
                        replaceFrom: 1<br>
                        to: externalSemaphoreSignalRequest<wbr>s size<br>
                        with: externalSemaphoreSignalRequest<wbr>s<br>
                        startingAt: 1.<br>
                newResponses<br>
                        replaceFrom: 1<br>
                        to: externalSemaphoreSignalRespons<wbr>es size<br>
                        with: externalSemaphoreSignalRespons<wbr>es<br>
                        startingAt: 1.<br>
                externalSemaphoreSignalRespons<wbr>es == originalResponses "This should always be true."<br>
                        ifTrue: [<br>
                                externalSemaphoreSignalRequest<wbr>s := newRequests.<br>
                                externalSemaphoreSignalRespons<wbr>es := newResponses ]<br>
                        ifFalse: [ originalResponses := externalSemaphoreSignalRespons<wbr>es ] ].<br>
        externalSemaphoreSignalRequest<wbr>s<br>
                at: index<br>
                put: (externalSemaphoreSignalReques<wbr>ts at: index) + 1.<br>
        ^true<br>
<br>
This is also a good example why CAS-style thread safety is a lot less flexible.<br>
<br>
Levente<br></blockquote><div><br></div><div>I wonder would you be interested in taking a look at the real code in <span style="font-size:14px;color:rgb(0,0,0)">platforms/Cross/vm/sqExternalS</span><wbr style="font-size:14px;color:rgb(0,0,0)"><span style="font-size:14px;color:rgb(0,0,0)">emaphores.c?  I have a lock-free implementation of signalling, but no lock-free implementation of growing the sequence of signal requests, and hence the ugly and annoying need to specify a maximum size to the external signal requests table.  It would be lovely to say good bye to this :-)</span></div><div><span style="font-size:14px;color:rgb(0,0,0)"><br></span></div><div><span style="font-size:14px;color:rgb(0,0,0)"><br></span></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
         for the real code."<br>
        index <= 0 ifTrue: [^false].<br>
        index > externalSemaphoreSignalRequest<wbr>s size ifTrue:<br>
                [| newRequests newResponses |<br>
                newRequests := Array new: 1 << index highBit withAll: 0.<br>
                newResponses := newRequests copy.<br>
                newRequests<br>
                        replaceFrom: 1<br>
                        to: externalSemaphoreSignalRequest<wbr>s size<br>
                        with: externalSemaphoreSignalRequest<wbr>s<br>
                        startingAt: 1.<br>
                newResponses<br>
                        replaceFrom: 1<br>
                        to: externalSemaphoreSignalRespons<wbr>es size<br>
                        with: externalSemaphoreSignalRespons<wbr>es<br>
+                       startingAt: 1.<br>
+               <wbr>externalSemaphoreSignalRequest<wbr>s := newRequests.<br>
+               <wbr>externalSemaphoreSignalRespons<wbr>es := newResponses].<br>
-                       startingAt: 1].<br>
        externalSemaphoreSignalRequest<wbr>s<br>
                at: index<br>
                put: (externalSemaphoreSignalReques<wbr>ts at: index) + 1.<br>
        ^true!<br>
</blockquote>
</blockquote></div><br>Yes, nice.  The final at:put: is not thread-safe but your code is far better than the original.  I've included it and will commit soon.  Happy new year!<br clear="all"><div><br></div><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>