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();