< prev index next >

src/hotspot/share/runtime/objectMonitor.cpp

Print this page

        

*** 108,118 **** static int Knob_Penalty = 200; // spin failure penalty static int Knob_Poverty = 1000; static int Knob_FixedSpin = 0; static int Knob_PreSpin = 10; // 20-100 likely better ! static volatile int InitDone = 0; // ----------------------------------------------------------------------------- // Theory of operations -- Monitors lists, thread residency, etc: // // * A thread acquires ownership of a monitor by successfully --- 108,118 ---- static int Knob_Penalty = 200; // spin failure penalty static int Knob_Poverty = 1000; static int Knob_FixedSpin = 0; static int Knob_PreSpin = 10; // 20-100 likely better ! DEBUG_ONLY(static volatile bool InitDone = false;) // ----------------------------------------------------------------------------- // Theory of operations -- Monitors lists, thread residency, etc: // // * A thread acquires ownership of a monitor by successfully
*** 426,436 **** assert(_owner == Self, "invariant"); assert(_Responsible != Self, "invariant"); return; } ! DeferredInitialize(); // We try one round of spinning *before* enqueueing Self. // // If the _owner is ready but OFFPROC we could use a YieldTo() // operation to donate the remainder of this thread's quantum --- 426,436 ---- assert(_owner == Self, "invariant"); assert(_Responsible != Self, "invariant"); return; } ! assert(InitDone, "Unexpectedly not initialized"); // We try one round of spinning *before* enqueueing Self. // // If the _owner is ready but OFFPROC we could use a YieldTo() // operation to donate the remainder of this thread's quantum
*** 1100,1110 **** intptr_t ObjectMonitor::complete_exit(TRAPS) { Thread * const Self = THREAD; assert(Self->is_Java_thread(), "Must be Java thread!"); JavaThread *jt = (JavaThread *)THREAD; ! DeferredInitialize(); if (THREAD != _owner) { if (THREAD->is_lock_owned ((address)_owner)) { assert(_recursions == 0, "internal state error"); _owner = THREAD; // Convert from basiclock addr to Thread addr --- 1100,1110 ---- intptr_t ObjectMonitor::complete_exit(TRAPS) { Thread * const Self = THREAD; assert(Self->is_Java_thread(), "Must be Java thread!"); JavaThread *jt = (JavaThread *)THREAD; ! assert(InitDone, "Unexpectedly not initialized"); if (THREAD != _owner) { if (THREAD->is_lock_owned ((address)_owner)) { assert(_recursions == 0, "internal state error"); _owner = THREAD; // Convert from basiclock addr to Thread addr
*** 1184,1194 **** void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { Thread * const Self = THREAD; assert(Self->is_Java_thread(), "Must be Java thread!"); JavaThread *jt = (JavaThread *)THREAD; ! DeferredInitialize(); // Throw IMSX or IEX. CHECK_OWNER(); EventJavaMonitorWait event; --- 1184,1194 ---- void ObjectMonitor::wait(jlong millis, bool interruptible, TRAPS) { Thread * const Self = THREAD; assert(Self->is_Java_thread(), "Must be Java thread!"); JavaThread *jt = (JavaThread *)THREAD; ! assert(InitDone, "Unexpectedly not initialized"); // Throw IMSX or IEX. CHECK_OWNER(); EventJavaMonitorWait event;
*** 1886,1898 **** // We could also defer initialization and initialize on-demand // the first time we call inflate(). Initialization would // be protected - like so many things - by the MonitorCache_lock. void ObjectMonitor::Initialize() { ! static int InitializationCompleted = 0; ! assert(InitializationCompleted == 0, "invariant"); ! InitializationCompleted = 1; if (UsePerfData) { EXCEPTION_MARK; #define NEWPERFCOUNTER(n) \ { \ n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events, \ --- 1886,1903 ---- // We could also defer initialization and initialize on-demand // the first time we call inflate(). Initialization would // be protected - like so many things - by the MonitorCache_lock. void ObjectMonitor::Initialize() { ! assert(!InitDone, "invariant"); ! ! if (!os::is_MP()) { ! Knob_SpinLimit = 0; ! Knob_PreSpin = 0; ! Knob_FixedSpin = -1; ! } ! if (UsePerfData) { EXCEPTION_MARK; #define NEWPERFCOUNTER(n) \ { \ n = PerfDataManager::create_counter(SUN_RT, #n, PerfData::U_Events, \
*** 1911,1938 **** NEWPERFCOUNTER(_sync_Notifications); NEWPERFVARIABLE(_sync_MonExtant); #undef NEWPERFCOUNTER #undef NEWPERFVARIABLE } - } - - void ObjectMonitor::DeferredInitialize() { - if (InitDone > 0) return; - if (Atomic::cmpxchg (-1, &InitDone, 0) != 0) { - while (InitDone != 1) /* empty */; - return; - } - - // One-shot global initialization ... - // The initialization is idempotent, so we don't need locks. - // In the future consider doing this via os::init_2(). - - if (!os::is_MP()) { - Knob_SpinLimit = 0; - Knob_PreSpin = 0; - Knob_FixedSpin = -1; - } ! OrderAccess::fence(); ! InitDone = 1; } - --- 1916,1923 ---- NEWPERFCOUNTER(_sync_Notifications); NEWPERFVARIABLE(_sync_MonExtant); #undef NEWPERFCOUNTER #undef NEWPERFVARIABLE } ! DEBUG_ONLY(InitDone = true;) }
< prev index next >