src/share/vm/runtime/advancedThresholdPolicy.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/runtime/advancedThresholdPolicy.cpp

src/share/vm/runtime/advancedThresholdPolicy.cpp

Print this page
rev 6096 : 8023461: Thread holding lock at safepoint that vm can block on: MethodCompileQueue_lock
Reviewed-by: ?

*** 72,86 **** set_start_time(os::javaTimeMillis()); } // update_rate() is called from select_task() while holding a compile queue lock. void AdvancedThresholdPolicy::update_rate(jlong t, Method* m) { ! JavaThread* THREAD = JavaThread::current(); if (is_old(m)) { // We don't remove old methods from the queue, // so we can just zero the rate. ! m->set_rate(0, THREAD); return; } // We don't update the rate if we've just came out of a safepoint. // delta_s is the time since last safepoint in milliseconds. --- 72,89 ---- set_start_time(os::javaTimeMillis()); } // update_rate() is called from select_task() while holding a compile queue lock. void AdvancedThresholdPolicy::update_rate(jlong t, Method* m) { ! // Skip update if counters are absent. ! // Can't allocate them since we are holding compile queue lock. ! if (m->method_counters() == NULL) return; ! if (is_old(m)) { // We don't remove old methods from the queue, // so we can just zero the rate. ! m->set_rate(0); return; } // We don't update the rate if we've just came out of a safepoint. // delta_s is the time since last safepoint in milliseconds.
*** 92,108 **** // We should be running for at least 1ms. if (delta_s >= TieredRateUpdateMinTime) { // And we must've taken the previous point at least 1ms before. if (delta_t >= TieredRateUpdateMinTime && delta_e > 0) { ! m->set_prev_time(t, THREAD); ! m->set_prev_event_count(event_count, THREAD); ! m->set_rate((float)delta_e / (float)delta_t, THREAD); // Rate is events per millisecond ! } else if (delta_t > TieredRateUpdateMaxTime && delta_e == 0) { // If nothing happened for 25ms, zero the rate. Don't modify prev values. ! m->set_rate(0, THREAD); } } } // Check if this method has been stale from a given number of milliseconds. --- 95,112 ---- // We should be running for at least 1ms. if (delta_s >= TieredRateUpdateMinTime) { // And we must've taken the previous point at least 1ms before. if (delta_t >= TieredRateUpdateMinTime && delta_e > 0) { ! m->set_prev_time(t); ! m->set_prev_event_count(event_count); ! m->set_rate((float)delta_e / (float)delta_t); // Rate is events per millisecond ! } else { if (delta_t > TieredRateUpdateMaxTime && delta_e == 0) { // If nothing happened for 25ms, zero the rate. Don't modify prev values. ! m->set_rate(0); ! } } } } // Check if this method has been stale from a given number of milliseconds.
*** 161,171 **** jlong t = os::javaTimeMillis(); // Iterate through the queue and find a method with a maximum rate. for (CompileTask* task = compile_queue->first(); task != NULL;) { CompileTask* next_task = task->next(); Method* method = task->method(); - MethodData* mdo = method->method_data(); update_rate(t, method); if (max_task == NULL) { max_task = task; max_method = method; } else { --- 165,174 ----
src/share/vm/runtime/advancedThresholdPolicy.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File