comparison src/os/bsd/vm/os_bsd.cpp @ 4712:e7dead7e90af

7117303: VM uses non-monotonic time source and complains that it is non-monotonic Summary: Replaces calls to os::javaTimeMillis(), which does not (and cannot) guarantee monotonicity, in GC code to an equivalent expression that uses os::javaTimeNanos(). os::javaTimeNanos is guaranteed monotonically non-decreasing if the underlying platform provides a monotonic time source. Changes in OS files are to make use of the newly defined constants in globalDefinitions.hpp. Reviewed-by: dholmes, ysr
author johnc
date Mon, 19 Dec 2011 10:02:05 -0800
parents 36b057451829
children 20bfb6d15a94
comparison
equal deleted inserted replaced
4711:adedfbbf0360 4712:e7dead7e90af
148 148
149 #define MAX_PATH (2 * K) 149 #define MAX_PATH (2 * K)
150 150
151 // for timer info max values which include all bits 151 // for timer info max values which include all bits
152 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF) 152 #define ALL_64_BITS CONST64(0xFFFFFFFFFFFFFFFF)
153 #define SEC_IN_NANOSECS 1000000000LL
154 153
155 #define LARGEPAGES_BIT (1 << 6) 154 #define LARGEPAGES_BIT (1 << 6)
156 //////////////////////////////////////////////////////////////////////////////// 155 ////////////////////////////////////////////////////////////////////////////////
157 // global variables 156 // global variables
158 julong os::Bsd::_physical_memory = 0; 157 julong os::Bsd::_physical_memory = 0;
3443 // Solaris uses poll(), bsd uses park(). 3442 // Solaris uses poll(), bsd uses park().
3444 // Poll() is likely a better choice, assuming that Thread.interrupt() 3443 // Poll() is likely a better choice, assuming that Thread.interrupt()
3445 // generates a SIGUSRx signal. Note that SIGUSR1 can interfere with 3444 // generates a SIGUSRx signal. Note that SIGUSR1 can interfere with
3446 // SIGSEGV, see 4355769. 3445 // SIGSEGV, see 4355769.
3447 3446
3448 const int NANOSECS_PER_MILLISECS = 1000000;
3449
3450 int os::sleep(Thread* thread, jlong millis, bool interruptible) { 3447 int os::sleep(Thread* thread, jlong millis, bool interruptible) {
3451 assert(thread == Thread::current(), "thread consistency check"); 3448 assert(thread == Thread::current(), "thread consistency check");
3452 3449
3453 ParkEvent * const slp = thread->_SleepEvent ; 3450 ParkEvent * const slp = thread->_SleepEvent ;
3454 slp->reset() ; 3451 slp->reset() ;
3467 if (newtime - prevtime < 0) { 3464 if (newtime - prevtime < 0) {
3468 // time moving backwards, should only happen if no monotonic clock 3465 // time moving backwards, should only happen if no monotonic clock
3469 // not a guarantee() because JVM should not abort on kernel/glibc bugs 3466 // not a guarantee() because JVM should not abort on kernel/glibc bugs
3470 assert(!Bsd::supports_monotonic_clock(), "time moving backwards"); 3467 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
3471 } else { 3468 } else {
3472 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISECS; 3469 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
3473 } 3470 }
3474 3471
3475 if(millis <= 0) { 3472 if(millis <= 0) {
3476 return OS_OK; 3473 return OS_OK;
3477 } 3474 }
3506 if (newtime - prevtime < 0) { 3503 if (newtime - prevtime < 0) {
3507 // time moving backwards, should only happen if no monotonic clock 3504 // time moving backwards, should only happen if no monotonic clock
3508 // not a guarantee() because JVM should not abort on kernel/glibc bugs 3505 // not a guarantee() because JVM should not abort on kernel/glibc bugs
3509 assert(!Bsd::supports_monotonic_clock(), "time moving backwards"); 3506 assert(!Bsd::supports_monotonic_clock(), "time moving backwards");
3510 } else { 3507 } else {
3511 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISECS; 3508 millis -= (newtime - prevtime) / NANOSECS_PER_MILLISEC;
3512 } 3509 }
3513 3510
3514 if(millis <= 0) break ; 3511 if(millis <= 0) break ;
3515 3512
3516 prevtime = newtime; 3513 prevtime = newtime;
4195 jlong os::Bsd::fast_thread_cpu_time(clockid_t clockid) { 4192 jlong os::Bsd::fast_thread_cpu_time(clockid_t clockid) {
4196 struct timespec tp; 4193 struct timespec tp;
4197 int rc = os::Bsd::clock_gettime(clockid, &tp); 4194 int rc = os::Bsd::clock_gettime(clockid, &tp);
4198 assert(rc == 0, "clock_gettime is expected to return 0 code"); 4195 assert(rc == 0, "clock_gettime is expected to return 0 code");
4199 4196
4200 return (tp.tv_sec * SEC_IN_NANOSECS) + tp.tv_nsec; 4197 return (tp.tv_sec * NANOSECS_PER_SEC) + tp.tv_nsec;
4201 } 4198 }
4202 #endif 4199 #endif
4203 4200
4204 ///// 4201 /////
4205 // glibc on Bsd platform uses non-documented flag 4202 // glibc on Bsd platform uses non-documented flag
5520 * on the condvar. Contention seen when trying to park implies that someone 5517 * on the condvar. Contention seen when trying to park implies that someone
5521 * is unparking you, so don't wait. And spurious returns are fine, so there 5518 * is unparking you, so don't wait. And spurious returns are fine, so there
5522 * is no need to track notifications. 5519 * is no need to track notifications.
5523 */ 5520 */
5524 5521
5525
5526 #define NANOSECS_PER_SEC 1000000000
5527 #define NANOSECS_PER_MILLISEC 1000000
5528 #define MAX_SECS 100000000 5522 #define MAX_SECS 100000000
5529 /* 5523 /*
5530 * This code is common to bsd and solaris and will be moved to a 5524 * This code is common to bsd and solaris and will be moved to a
5531 * common place in dolphin. 5525 * common place in dolphin.
5532 * 5526 *