src/os/linux/vm/os_linux.cpp

Print this page
rev 2869 : 7117303: VM uses non-monotonic time source and complains that it is non-monotonic
Summary: Replaces calls to os::javaTimeMillis(), which does not guarantee montonicity, in GC code to os::javaTimeNanos() with a suitable conversion factor. os::javaTimeNanos() mostly guarantees montonicity depending on the underlying OS implementation and, as a result, a better alternative. Changes in OS files are to make use of the newly defined constants in globalDefinitions.hpp.
Reviewed-by:

*** 125,135 **** #define MAX_PATH (2 * K) // for timer info max values which include all bits #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) - #define SEC_IN_NANOSECS 1000000000LL #define LARGEPAGES_BIT (1 << 6) //////////////////////////////////////////////////////////////////////////////// // global variables julong os::Linux::_physical_memory = 0; --- 125,134 ----
*** 3257,3268 **** // Solaris uses poll(), linux uses park(). // Poll() is likely a better choice, assuming that Thread.interrupt() // generates a SIGUSRx signal. Note that SIGUSR1 can interfere with // SIGSEGV, see 4355769. - const int NANOSECS_PER_MILLISECS = 1000000; - int os::sleep(Thread* thread, jlong millis, bool interruptible) { assert(thread == Thread::current(), "thread consistency check"); ParkEvent * const slp = thread->_SleepEvent ; slp->reset() ; --- 3256,3265 ----
*** 3281,3291 **** if (newtime - prevtime < 0) { // time moving backwards, should only happen if no monotonic clock // not a guarantee() because JVM should not abort on kernel/glibc bugs assert(!Linux::supports_monotonic_clock(), "time moving backwards"); } else { ! millis -= (newtime - prevtime) / NANOSECS_PER_MILLISECS; } if(millis <= 0) { return OS_OK; } --- 3278,3288 ---- if (newtime - prevtime < 0) { // time moving backwards, should only happen if no monotonic clock // not a guarantee() because JVM should not abort on kernel/glibc bugs assert(!Linux::supports_monotonic_clock(), "time moving backwards"); } else { ! millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC; } if(millis <= 0) { return OS_OK; }
*** 3320,3330 **** if (newtime - prevtime < 0) { // time moving backwards, should only happen if no monotonic clock // not a guarantee() because JVM should not abort on kernel/glibc bugs assert(!Linux::supports_monotonic_clock(), "time moving backwards"); } else { ! millis -= (newtime - prevtime) / NANOSECS_PER_MILLISECS; } if(millis <= 0) break ; prevtime = newtime; --- 3317,3327 ---- if (newtime - prevtime < 0) { // time moving backwards, should only happen if no monotonic clock // not a guarantee() because JVM should not abort on kernel/glibc bugs assert(!Linux::supports_monotonic_clock(), "time moving backwards"); } else { ! millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC; } if(millis <= 0) break ; prevtime = newtime;
*** 3922,3932 **** jlong os::Linux::fast_thread_cpu_time(clockid_t clockid) { struct timespec tp; int rc = os::Linux::clock_gettime(clockid, &tp); assert(rc == 0, "clock_gettime is expected to return 0 code"); ! return (tp.tv_sec * SEC_IN_NANOSECS) + tp.tv_nsec; } ///// // glibc on Linux platform uses non-documented flag // to indicate, that some special sort of signal --- 3919,3929 ---- jlong os::Linux::fast_thread_cpu_time(clockid_t clockid) { struct timespec tp; int rc = os::Linux::clock_gettime(clockid, &tp); assert(rc == 0, "clock_gettime is expected to return 0 code"); ! return (tp.tv_sec * NANOSECS_PER_SEC) + tp.tv_nsec; } ///// // glibc on Linux platform uses non-documented flag // to indicate, that some special sort of signal
*** 5163,5175 **** * on the condvar. Contention seen when trying to park implies that someone * is unparking you, so don't wait. And spurious returns are fine, so there * is no need to track notifications. */ - - #define NANOSECS_PER_SEC 1000000000 - #define NANOSECS_PER_MILLISEC 1000000 #define MAX_SECS 100000000 /* * This code is common to linux and solaris and will be moved to a * common place in dolphin. * --- 5160,5169 ----