[armedbear-devel] hang with threads:object-wait

Erik Huelsmann ehuels at gmail.com
Sat Feb 1 16:36:33 UTC 2014


Hi James,

My thinking is that the wait time is being rounded to zero, which might be
used internally by Java to encode an indefinite wait.

Does the patch below work for you?

Bye,

Erik.


Index: LispThread.java
===================================================================
--- LispThread.java (revision 14464)
+++ LispThread.java (working copy)
@@ -1004,11 +1004,12 @@
     };


+  private static DoubleFloat factor1000 = new DoubleFloat(1000);
+
     public static final long javaSleepInterval(LispObject lispSleep)
-
     {
         double d =
-            checkDoubleFloat(lispSleep.multiplyBy(new
DoubleFloat(1000))).getValue();
+            checkDoubleFloat(lispSleep.multiplyBy(factor1000)).getValue();
         if (d < 0)
             type_error(lispSleep, list(Symbol.REAL, Fixnum.ZERO));

@@ -1015,6 +1016,17 @@
         return (d < Long.MAX_VALUE ? (long) d : Long.MAX_VALUE);
     }

+    public static final int javaSleepNanos(LispObject lispSleep)
+    {
+        double d = // d contains millis
+            checkDoubleFloat(lispSleep.multiplyBy(factor1000)).getValue();
+        double n = d*1000000; // n contains nanos
+        d = 1.0e6*((long)d); // convert rounded millis to nanos
+        n = n - d; // retain nanos not in millis
+
+        return (n < Integer.MAX_VALUE ? (int) n : Integer.MAX_VALUE);
+    }
+
     @DocString(name="sleep", args="seconds",
     doc="Causes the invoking thread to sleep for SECONDS seconds.\n"+
         "SECONDS may be a value between 0 1and 1.")
@@ -1025,7 +1037,8 @@
         {

             try {
-                Thread.sleep(javaSleepInterval(arg));
+      Thread.sleep(javaSleepInterval(arg),
+   javaSleepNanos(arg));
             }
             catch (InterruptedException e) {
                 currentThread().processThreadInterrupts();
@@ -1208,7 +1221,8 @@

         {
             try {
-                object.lockableInstance().wait(javaSleepInterval(timeout));
+      object.lockableInstance().wait(javaSleepInterval(timeout),
+     javaSleepNanos(timeout));
             }
             catch (InterruptedException e) {
                 currentThread().processThreadInterrupts();




On Sat, Feb 1, 2014 at 2:54 PM, James M. Lawrence <llmjjmll at gmail.com>wrote:

> (defun test ()
>   (let ((object (cons nil nil)))
>     (threads:synchronized-on object
>       (threads:object-wait object 0.0001))))
>
> For times between 0 and 0.0001 this appears to hang indefinitely. No
> problem with times above 0.001.
>
> The context is the new timeout option for bordeaux-threads:condition-wait,
>
>
> https://github.com/sionescu/bordeaux-threads/blob/master/src/impl-abcl.lisp#L101
>
> 1.3.0-dev-svn-14623
> Java_HotSpot(TM)_Server_VM-Oracle_Corporation-1.7.0_04-b20
> i386-Linux-3.2.0-24-generic-pae
>
> Best,
> lmj
>
>


-- 
Bye,

Erik.

http://efficito.com -- Hosted accounting and ERP.
Robust and Flexible. No vendor lock-in.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/armedbear-devel/attachments/20140201/a2d4ec9e/attachment.html>


More information about the armedbear-devel mailing list