diff --git a/modules/util/src/com/caucho/util/Alarm.java b/modules/util/src/com/caucho/util/Alarm.java index 8bee0e8..93c6e9d 100644 --- a/modules/util/src/com/caucho/util/Alarm.java +++ b/modules/util/src/com/caucho/util/Alarm.java @@ -62,6 +63,7 @@ public class Alarm implements ThreadTask { static private int _testCount; static private final Method _nanoTimeMethod; + static private boolean _nanoTimeIsReal; private long _wakeTime; private AlarmListener _listener; @@ -80,6 +82,19 @@ public class Alarm implements ThreadTask { try { nanoTimeMethod = System.class.getMethod("nanoTime", null); + + // Test to see if nanoTime() is close to currentTimeMillis() * 1000000 + long milliTime = System.currentTimeMillis(); + try { + long nanoTime = (Long)nanoTimeMethod.invoke(null); + nanoTime /= 1000000; + if (nanoTime >= milliTime && nanoTime - milliTime < 5) { + _nanoTimeIsReal = true; + } + } catch (Exception e) { + _nanoTimeIsReal = false; + } + } catch (NoSuchMethodException e) { @@ -240,6 +255,14 @@ public class Alarm implements ThreadTask { if (_testTime > 0) return _testTime * 1000000L; + if (_nanoTimeIsReal && _nanoTimeMethod != null) { + try { + return (Long) _nanoTimeMethod.invoke(null); + } + catch (Exception e) { + _nanoTimeIsReal = false; + } + } return System.currentTimeMillis() * 1000000L; }