<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>