Hi James,<div><br><div>I'm sure Gary et al. will have a fix soon -- today if past performance is any measure -- but for now try this. In your ccl directory (/opt/ccl/ccl in my system, because I install my ccl from svn in /opt/ccl), in the level-1 directory, in the file l1-lisp-threads.lisp,  hunt down and replace the %nanosleep function with this:</div>
<div><br></div><div><div>#-windows-target</div><div>(defun %nanosleep (seconds nanoseconds)</div><div>  (with-process-whostate ("Sleep")</div><div>    (rlet ((a :timespec)</div><div>           (b :timespec))</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>  (setf (pref a :timespec.tv_sec) seconds</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>(pref a :timespec.tv_nsec) nanoseconds)</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>  (let ((aptr a)</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>(bptr b))</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>    (loop</div>
<div><span class="Apple-tab-span" style="white-space:pre">      </span>       (let ((result </div><div><span class="Apple-tab-span" style="white-space:pre">                </span>      (external-call #+darwin-target "_nanosleep"</div>
<div><span class="Apple-tab-span" style="white-space:pre">                              </span>     #-darwin-target "nanosleep"</div><div><span class="Apple-tab-span" style="white-space:pre">                           </span>     :address aptr</div><div><span class="Apple-tab-span" style="white-space:pre">                           </span>     :address bptr</div>
<div><span class="Apple-tab-span" style="white-space:pre">                              </span>     :signed-fullword)))</div><div><span class="Apple-tab-span" style="white-space:pre">             </span> (declare (type (signed-byte 32) result))</div><div><span class="Apple-tab-span" style="white-space:pre">            </span> (if (and (< result 0)</div>
<div><span class="Apple-tab-span" style="white-space:pre">                      </span>  (eql (%get-errno) (- #$EINTR)))</div><div><span class="Apple-tab-span" style="white-space:pre">            </span>     (psetq aptr bptr bptr aptr)</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>     (return))))))))</div>
</div><div><br></div><div>All I did was remove the OS X workaround code. I'm working with the up-to-date trunk, v 1.9.</div><div><br></div><div>I'm sure the official fix will be in soon, and will probably conditionalize the OS X (Leopard) code.</div>
<div><br></div><div>Then fire up ccl and issue (rebuild-ccl). I've had the 1 second test running all night, with no issues at all, and the 0.01 with just two, at 800,482 and 2,236,556 iterations.</div><div><br></div><div>
It is notable that sleep does not guarantee a high degree of accuracy in the sleep time -- to wit, if it is the underlying call to nanosleep is interrupted and then continued (as the lisp code above does) the sleep duration will drift upwards (increased by the time between the interruption and the next call to nanosleep.)</div>
<div><br></div><div>There is a another Linux/Posix call "clock_nanosleep" which can be used to set an absolute time for the sleep, which avoids the drift issue. Perhaps worth pursuing? </div><div><br></div><div>
<br></div><div>Erik.</div><div><div><br></div><br><div class="gmail_quote">On Thu, May 10, 2012 at 7:39 AM, James M. Lawrence <span dir="ltr"><<a href="mailto:llmjjmll@gmail.com" target="_blank">llmjjmll@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 class="im">On Thu, May 10, 2012 at 2:10 AM, Gary Byers <<a href="mailto:gb@clozure.com">gb@clozure.com</a>> wrote:<br>

>> The upshot of what you're saying is that Clozure cannot reliably<br>
>> distribute work across threads, while other CL implementations can.<br>
><br>
</div>> [...]<br>
<div class="im">><br>
> Second of all, CCL doesn't "distribute work between threads"; neither<br>
> does SBCL, nor do recent versions of LispWorks, nor do other lisp<br>
> implementations that offer native threads.<br>
<br>
</div>I was simply referring to the ability to reliably send tasks to a<br>
worker thread pool and receive a notification for each task<br>
immediately after it completes. This is exactly the use case I have,<br>
and it is exactly what the test case asserts.<br>
<br>
I should mention my machine may be unusual -- it's a Core-i7 but with<br>
32-bit Linux installed. (Ubuntu 11 repeatedly failed to install,<br>
Ubuntu 12 was not released yet, and when I grabbed the nightly build<br>
at 2AM it was the 32-bit one. I plan to install 64-bit, but not yet.)<br>
<br>
I just ran the test again: 2 second sleep failed at 37 iterations; 10<br>
second sleep failed at 86. Rarely it goes past 100 -- if it does, I<br>
restart CCL to jostle things up, but that may only be superstition (on<br>
SBCL I once had a condition variable problem which was either fully<br>
present or fully absent depending upon a dice roll at launch).<br>
<br>
I will grant ssh access to my machine.<br>
<br>
ccl-1.8/lx86cl, md5 040409ba578edfa8b3dd62b009d57929<br>
<br>
3.2.0-24-generic-pae #37-Ubuntu SMP Wed Apr 25 10:47:59 UTC 2012 i686<br>
i686 i386 GNU/Linux<br>
<div class="HOEnZb"><div class="h5">_______________________________________________<br>
Openmcl-devel mailing list<br>
<a href="mailto:Openmcl-devel@clozure.com">Openmcl-devel@clozure.com</a><br>
<a href="http://clozure.com/mailman/listinfo/openmcl-devel" target="_blank">http://clozure.com/mailman/listinfo/openmcl-devel</a><br>
</div></div></blockquote></div><br></div></div>