<div dir="ltr">Hi Both,<div><br></div><div>   apologies for not responding sooner.  I have been trying to release new VMs (done, announcement soon), and have been sick.  So use either 207,208 &amp; 209, or 150, 151 and 152.  Let me have the code and I can integrate it.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 15, 2016 at 7:08 AM, Denis Kudriashov <span dir="ltr">&lt;<a href="mailto:dionisiydk@gmail.com" target="_blank">dionisiydk@gmail.com</a>&gt;</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">Hi Ben.<div><br></div><div>Do you commit your changes?</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-02-05 8:34 GMT+01:00 Ben Coman <span dir="ltr">&lt;<a href="mailto:btc@openinworld.com" target="_blank">btc@openinworld.com</a>&gt;</span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div><br>
On Fri, Feb 5, 2016 at 12:16 AM, Denis Kudriashov &lt;<a href="mailto:dionisiydk@gmail.com" target="_blank">dionisiydk@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hi.<br>
&gt;<br>
&gt; We already discuss it in another thread. And I want to make little conclusion.<br>
&gt;<br>
&gt; I propose new lock primitives #acquireLock and #tryAcquireLock. They should be based on existed ownership primitives 186 and 187 but with inverted logic.<br>
&gt;<br>
&gt; acquireLock should return true if lock was established by this call. It should return false if lock was already established by current process.<br>
&gt;<br>
&gt; tryAcquireLock should doing same as acquireLock. But if lock already acquired by another process primitive should return nil immediately without waiting.<br>
&gt;<br>
&gt; Eliot, do you already implemented it?<br>
&gt; if you have no time yet could you say me new primitive numbers? And I will try it myself.<br>
&gt;<br>
&gt; It will be nice to get new prims for Pharo5 release.<br>
&gt;<br>
&gt; Best regards,<br>
&gt; Denis<br>
&gt;<br>
<br>
<br>
</div></div>Following instructions at <a href="https://github.com/pharo-project/pharo-vm" rel="noreferrer" target="_blank">https://github.com/pharo-project/pharo-vm</a><br>
(btw I&#39;m on 32-bit Debian Jessie)<br>
<br>
git clone <a href="https://github.com/pharo-project/pharo-vm.git" rel="noreferrer" target="_blank">https://github.com/pharo-project/pharo-vm.git</a><br>
cd pharo-vm<br>
cd image &amp;&amp; ./newImage.sh<br>
./pharo-ui generator.image<br>
   PharoVMSpur32Builder buildUnix32.<br>
cd ../build<br>
bash build.sh<br>
../results/pharo  #Needs a spur image<br>
<br>
mkdir ../spurImage &amp; cd ../spurImage<br>
curl <a href="http://get.pharo.org/50" rel="noreferrer" target="_blank">get.pharo.org/50</a> | bash<br>
cp ../image/pharo-vm/PharoV40.sources .<br>
cd ../build<br>
<br>
bash build.sh<br>
../results/pharo ../spurImage/Pharo.image<br>
<br>
------------<br>
../image/pharo-ui ../image/generator.image<br>
<br>
searched for implementors of primitiveEnterCriticalSection<br>
<br>
In CoInterpreterPrimitives<br>
duplicated primitiveEnterCriticalSection as primitiveAquireOwnedLock<br>
duplicated primitiveExitCriticalSection  as primitiveReleaseOwnedLock<br>
<br>
senders of primitiveEnterCriticalSection found...<br>
   StackInterpreter&gt;&gt;initializePrimitiveTable<br>
where I saw...(150 159 primitiveFail)<br>
so for experiment (first time ever playing with this table)<br>
I tried...<br>
    (150 primitiveAquireOwnedLock)<br>
    (151 primitiveReleaseOwnedLock)<br>
<br>
  PharoVMSpur32Builder buildUnix32.<br>
<br>
bash build.sh<br>
../results/pharo ../spurImage/Pharo.image<br>
<br>
-----------------------<br>
Loaded Eliot&#39;s CriticalSection.st from [1]...<br>
[1] <a href="http://forum.world.st/Where-to-get-Monitor-implementation-based-on-primitives-td4869758.html" rel="noreferrer" target="_blank">http://forum.world.st/Where-to-get-Monitor-implementation-based-on-primitives-td4869758.html</a><br>
<br>
&gt;From Pharo5Inbox cherrypicked your<br>
SLICE-Issue-17373-Mutex-should-be-based-on-VM-primitives-and-implement-critical-methods-from-Semaphore--DenisKudryashov.10<br>
* all of OwnedLock as OwnedLock186<br>
* Mutex&gt;&gt;criticalNew: as NewMutex186&gt;&gt;critical:<br>
* Mutex&gt;&gt;initialize as NewMutex186&gt;&gt;initialize<br>
<br>
Copied OwnedLock186 &amp; NewMutex186<br>
to OwnedLock150 &amp; NewMutex150.<br>
<br>
OwnwedLock150&gt;&gt;acquire<br>
&lt;primitive: 150&gt;<br>
<br>
OwnwedLock150&gt;&gt;release<br>
&lt;primitive: 151&gt;<br>
<br>
NewMutex150&gt;&gt;initialize<br>
super initialize.<br>
lock := OwnedLock150 new<br>
<br>
NewMutex150&gt;&gt;critical: aBlock<br>
^[<br>
lock acquire.<br>
aBlock value<br>
] ensure: [lock release].<br>
<br>
Adapted performance tests from [1]...<br>
<br>
{Mutex. Monitor. CriticalSection. NewMutex186. NewMutex150} collect:<br>
[:csClass | | n |<br>
n := 0.<br>
   cs := csClass new.<br>
([cs critical: [n := n + 1]. cs critical: [n := n + 1]. cs critical:<br>
[n := n + 1]. cs critical: [n := n + 1]. cs critical: [n := n + 1].<br>
cs critical: [n := n - 1]. cs critical: [n := n - 1]. cs critical: [n<br>
:= n - 1]. cs critical: [n := n - 1]. cs critical: [n := n - 1].<br>
n ] bench),&#39; -&gt; &#39; , cs class name ]<br>
<br>
which sorted gave...<br>
&#39;264,486 per second -&gt; Mutex&#39;<br>
&#39;405,653 per second -&gt; Monitor&#39;<br>
&#39;516,199 per second -&gt; NewMutex186&#39;<br>
&#39;520,167 per second -&gt; NewMutex150&#39;<br>
&#39;686,169 per second -&gt; CriticalSection&#39;<br>
<br>
Yay! I added (err, copied) my first primitive.<br>
</blockquote></div><br></div>
<br></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>