6966589: hs16-b08 causes java.lang.StackOverflowError
Reviewed-by: mchung, dholmes, chrisphi
This commit is contained in:
parent
bb7771888b
commit
612faf72b7
@ -1382,3 +1382,61 @@ void ClassLoader::compile_the_world_in(char* name, Handle loader, TRAPS) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif //PRODUCT
|
#endif //PRODUCT
|
||||||
|
|
||||||
|
// Please keep following two functions at end of this file. With them placed at top or in middle of the file,
|
||||||
|
// they could get inlined by agressive compiler, an unknown trick, see bug 6966589.
|
||||||
|
void PerfClassTraceTime::initialize() {
|
||||||
|
if (!UsePerfData) return;
|
||||||
|
|
||||||
|
if (_eventp != NULL) {
|
||||||
|
// increment the event counter
|
||||||
|
_eventp->inc();
|
||||||
|
}
|
||||||
|
|
||||||
|
// stop the current active thread-local timer to measure inclusive time
|
||||||
|
_prev_active_event = -1;
|
||||||
|
for (int i=0; i < EVENT_TYPE_COUNT; i++) {
|
||||||
|
if (_timers[i].is_active()) {
|
||||||
|
assert(_prev_active_event == -1, "should have only one active timer");
|
||||||
|
_prev_active_event = i;
|
||||||
|
_timers[i].stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_recursion_counters == NULL || (_recursion_counters[_event_type])++ == 0) {
|
||||||
|
// start the inclusive timer if not recursively called
|
||||||
|
_t.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
// start thread-local timer of the given event type
|
||||||
|
if (!_timers[_event_type].is_active()) {
|
||||||
|
_timers[_event_type].start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PerfClassTraceTime::~PerfClassTraceTime() {
|
||||||
|
if (!UsePerfData) return;
|
||||||
|
|
||||||
|
// stop the thread-local timer as the event completes
|
||||||
|
// and resume the thread-local timer of the event next on the stack
|
||||||
|
_timers[_event_type].stop();
|
||||||
|
jlong selftime = _timers[_event_type].ticks();
|
||||||
|
|
||||||
|
if (_prev_active_event >= 0) {
|
||||||
|
_timers[_prev_active_event].start();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_recursion_counters != NULL && --(_recursion_counters[_event_type]) > 0) return;
|
||||||
|
|
||||||
|
// increment the counters only on the leaf call
|
||||||
|
_t.stop();
|
||||||
|
_timep->inc(_t.ticks());
|
||||||
|
if (_selftimep != NULL) {
|
||||||
|
_selftimep->inc(selftime);
|
||||||
|
}
|
||||||
|
// add all class loading related event selftime to the accumulated time counter
|
||||||
|
ClassLoader::perf_accumulated_time()->inc(selftime);
|
||||||
|
|
||||||
|
// reset the timer
|
||||||
|
_timers[_event_type].reset();
|
||||||
|
}
|
||||||
|
@ -402,65 +402,11 @@ class PerfClassTraceTime {
|
|||||||
initialize();
|
initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
void initialize() {
|
|
||||||
if (!UsePerfData) return;
|
|
||||||
|
|
||||||
if (_eventp != NULL) {
|
|
||||||
// increment the event counter
|
|
||||||
_eventp->inc();
|
|
||||||
}
|
|
||||||
|
|
||||||
// stop the current active thread-local timer to measure inclusive time
|
|
||||||
_prev_active_event = -1;
|
|
||||||
for (int i=0; i < EVENT_TYPE_COUNT; i++) {
|
|
||||||
if (_timers[i].is_active()) {
|
|
||||||
assert(_prev_active_event == -1, "should have only one active timer");
|
|
||||||
_prev_active_event = i;
|
|
||||||
_timers[i].stop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_recursion_counters == NULL || (_recursion_counters[_event_type])++ == 0) {
|
|
||||||
// start the inclusive timer if not recursively called
|
|
||||||
_t.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
// start thread-local timer of the given event type
|
|
||||||
if (!_timers[_event_type].is_active()) {
|
|
||||||
_timers[_event_type].start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void suspend() { _t.stop(); _timers[_event_type].stop(); }
|
inline void suspend() { _t.stop(); _timers[_event_type].stop(); }
|
||||||
inline void resume() { _t.start(); _timers[_event_type].start(); }
|
inline void resume() { _t.start(); _timers[_event_type].start(); }
|
||||||
|
|
||||||
~PerfClassTraceTime() {
|
~PerfClassTraceTime();
|
||||||
if (!UsePerfData) return;
|
void initialize();
|
||||||
|
|
||||||
// stop the thread-local timer as the event completes
|
|
||||||
// and resume the thread-local timer of the event next on the stack
|
|
||||||
_timers[_event_type].stop();
|
|
||||||
jlong selftime = _timers[_event_type].ticks();
|
|
||||||
|
|
||||||
if (_prev_active_event >= 0) {
|
|
||||||
_timers[_prev_active_event].start();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_recursion_counters != NULL && --(_recursion_counters[_event_type]) > 0) return;
|
|
||||||
|
|
||||||
// increment the counters only on the leaf call
|
|
||||||
_t.stop();
|
|
||||||
_timep->inc(_t.ticks());
|
|
||||||
if (_selftimep != NULL) {
|
|
||||||
_selftimep->inc(selftime);
|
|
||||||
}
|
|
||||||
// add all class loading related event selftime to the accumulated time counter
|
|
||||||
ClassLoader::perf_accumulated_time()->inc(selftime);
|
|
||||||
|
|
||||||
// reset the timer
|
|
||||||
_timers[_event_type].reset();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#endif // SHARE_VM_CLASSFILE_CLASSLOADER_HPP
|
#endif // SHARE_VM_CLASSFILE_CLASSLOADER_HPP
|
||||||
|
Loading…
x
Reference in New Issue
Block a user