src/share/vm/runtime/safepoint.cpp

Print this page

        

*** 262,273 **** // Blocking or yielding incur their own penalties in the form of context switching // and the resultant loss of $ residency. // // Further complicating matters is that yield() does not work as naively expected // on many platforms -- yield() does not guarantee that any other ready threads ! // will run. As such we revert yield_all() after some number of iterations. ! // Yield_all() is implemented as a short unconditional sleep on some platforms. // Typical operating systems round a "short" sleep period up to 10 msecs, so sleeping // can actually increase the time it takes the VM thread to detect that a system-wide // stop-the-world safepoint has been reached. In a pathological scenario such as that // described in CR6415670 the VMthread may sleep just before the mutator(s) become safe. // In that case the mutators will be stalled waiting for the safepoint to complete and the --- 262,273 ---- // Blocking or yielding incur their own penalties in the form of context switching // and the resultant loss of $ residency. // // Further complicating matters is that yield() does not work as naively expected // on many platforms -- yield() does not guarantee that any other ready threads ! // will run. As such we revert to naked_short_sleep() after some number of iterations. ! // nakes_short_sleep() is implemented as a short unconditional sleep. // Typical operating systems round a "short" sleep period up to 10 msecs, so sleeping // can actually increase the time it takes the VM thread to detect that a system-wide // stop-the-world safepoint has been reached. In a pathological scenario such as that // described in CR6415670 the VMthread may sleep just before the mutator(s) become safe. // In that case the mutators will be stalled waiting for the safepoint to complete and the
*** 320,332 **** SpinPause() ; // MP-Polite spin } else if (steps < DeferThrSuspendLoopCount) { os::NakedYield() ; } else { ! os::yield_all() ; ! // Alternately, the VM thread could transiently depress its scheduling priority or ! // transiently increase the priority of the tardy mutator(s). } iterations ++ ; } assert(iterations < (uint)max_jint, "We have been iterating in the safepoint loop too long"); --- 320,330 ---- SpinPause() ; // MP-Polite spin } else if (steps < DeferThrSuspendLoopCount) { os::NakedYield() ; } else { ! os::naked_short_sleep(1); } iterations ++ ; } assert(iterations < (uint)max_jint, "We have been iterating in the safepoint loop too long");