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