< prev index next >
src/share/vm/runtime/sharedRuntime.cpp
Print this page
*** 3123,3156 ****
#endif /* PRODUCT */
JRT_LEAF(void, SharedRuntime::enable_stack_reserved_zone(JavaThread* thread))
assert(thread->is_Java_thread(), "Only Java threads have a stack reserved zone");
thread->enable_stack_reserved_zone();
thread->set_reserved_stack_activation(thread->stack_base());
JRT_END
frame SharedRuntime::look_for_reserved_stack_annotated_method(JavaThread* thread, frame fr) {
frame activation;
CompiledMethod* nm = NULL;
int count = 1;
assert(fr.is_java_frame(), "Must start on Java frame");
while (true) {
Method* method = NULL;
if (fr.is_interpreted_frame()) {
method = fr.interpreter_frame_method();
} else {
CodeBlob* cb = fr.cb();
if (cb != NULL && cb->is_compiled()) {
nm = cb->as_compiled_method();
method = nm->method();
}
}
! if ((method != NULL) && method->has_reserved_stack_access()) {
! ResourceMark rm(thread);
activation = fr;
warning("Potentially dangerous stack overflow in "
"ReservedStackAccess annotated method %s [%d]",
method->name_and_sig_as_C_string(), count++);
EventReservedStackActivation event;
--- 3123,3170 ----
#endif /* PRODUCT */
JRT_LEAF(void, SharedRuntime::enable_stack_reserved_zone(JavaThread* thread))
assert(thread->is_Java_thread(), "Only Java threads have a stack reserved zone");
+ if (thread->stack_reserved_zone_disabled()) {
thread->enable_stack_reserved_zone();
+ }
thread->set_reserved_stack_activation(thread->stack_base());
JRT_END
frame SharedRuntime::look_for_reserved_stack_annotated_method(JavaThread* thread, frame fr) {
+ ResourceMark rm(thread);
frame activation;
CompiledMethod* nm = NULL;
int count = 1;
assert(fr.is_java_frame(), "Must start on Java frame");
while (true) {
Method* method = NULL;
+ bool found = false;
if (fr.is_interpreted_frame()) {
method = fr.interpreter_frame_method();
+ if (method != NULL && method->has_reserved_stack_access()) {
+ found = true;
+ }
} else {
CodeBlob* cb = fr.cb();
if (cb != NULL && cb->is_compiled()) {
nm = cb->as_compiled_method();
method = nm->method();
+ // scope_desc_near() must be used, instead of scope_desc_at() because on
+ // SPARC, the pcDesc can be on the delay slot after the call instruction.
+ for (ScopeDesc *sd = nm->scope_desc_near(fr.pc()); sd; sd = sd->sender()) {
+ method = sd->method();
+ if (method != NULL && method->has_reserved_stack_access()) {
+ found = true;
}
}
! }
! }
! if (found) {
activation = fr;
warning("Potentially dangerous stack overflow in "
"ReservedStackAccess annotated method %s [%d]",
method->name_and_sig_as_C_string(), count++);
EventReservedStackActivation event;
< prev index next >