static long timeJumpDetector_lastTimeJump; // in sys time static long timeJumpDetector_lastTimeJumpLength; sbool timeJumpDetector_verbose; static L timeJumpDetector_onTimeJump = synchroList(); static int timeJumpDetector_minJump = 5000; static void timeJumpDetector() { doEvery(1000, new Runnable { long diff = now()-sysNow(); long lastSysNow = sysNow(); public void run() { long sysNow = sysNow(); long newDiff = now()-sysNow; long d = newDiff-diff; if (timeJumpDetector_verbose) print("timeJumpDetector: sysNow=" + sysNow + ", diff=" + newDiff); if (abs(d) <= timeJumpDetector_minJump && /*isWindows() &&*/ sysNow-lastSysNow >= 10000) d = sysNow-lastSysNow-10000; if (abs(d) > timeJumpDetector_minJump) { diff = now()-sysNow(); timeJumpDetector_lastTimeJump = sysNow(); timeJumpDetector_lastTimeJumpLength = d; printAndProgramLog(ymd_hms() + ": Time jump occurred! (" + formatDouble(toSeconds(d), 1) + " seconds)"); if (nempty(timeJumpDetector_onTimeJump)) thread { pcallFAll(concurrentlyIterateList(timeJumpDetector_onTimeJump)); } } diff = newDiff; lastSysNow = sysNow; } }); }