src/share/vm/compiler/disassembler.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File
hotspot Cdiff src/share/vm/compiler/disassembler.cpp
src/share/vm/compiler/disassembler.cpp
Print this page
rev 10077 : 8148696: Race loading hsdis may cause SIGSEGV
Summary: Guard library loading with a lock
Reviewed-by:
*** 78,87 ****
--- 78,88 ----
if (_tried_to_load_library) {
// Do not try twice.
// To force retry in debugger: assign _tried_to_load_library=0
return false;
}
+
// Try to load it.
char ebuf[1024];
char buf[JVM_MAXPATHLEN];
os::jvm_path(buf, sizeof(buf));
int jvm_offset = -1;
*** 163,172 ****
--- 164,189 ----
// Success.
tty->print_cr("Loaded disassembler from %s", buf);
return true;
}
+ bool Disassembler::can_decode() {
+ if (_decode_instructions_virtual != NULL || _decode_instructions != NULL) {
+ // Already succeeded.
+ return true;
+ }
+ if (_tried_to_load_library) {
+ // Do not try twice.
+ // To force retry in debugger: assign _tried_to_load_library=0
+ return false;
+ }
+
+ // If it was not loaded - lock and load. (double checked)
+ MutexLockerEx locker(DirectivesStack_lock, Mutex::_no_safepoint_check_flag);
+ return Disassembler::load_library();
+ }
+
class decode_env {
private:
nmethod* _nm;
CodeBlob* _code;
*** 511,522 ****
options());
}
void Disassembler::decode(CodeBlob* cb, outputStream* st) {
ttyLocker ttyl;
- if (!load_library()) return;
if (cb->is_nmethod()) {
decode((nmethod*)cb, st);
return;
}
decode_env env(cb, st);
--- 528,539 ----
options());
}
void Disassembler::decode(CodeBlob* cb, outputStream* st) {
+ if (!can_decode()) return;
ttyLocker ttyl;
if (cb->is_nmethod()) {
decode((nmethod*)cb, st);
return;
}
decode_env env(cb, st);
*** 525,543 ****
env.output()->print_cr(" at [" PTR_FORMAT ", " PTR_FORMAT "] " JLONG_FORMAT " bytes", p2i(cb->code_begin()), p2i(cb->code_end()), ((jlong)(cb->code_end() - cb->code_begin())) * sizeof(unsigned char*));
env.decode_instructions(cb->code_begin(), cb->code_end());
}
void Disassembler::decode(address start, address end, outputStream* st, CodeStrings c) {
ttyLocker ttyl;
- if (!load_library()) return;
decode_env env(CodeCache::find_blob_unsafe(start), st, c);
env.decode_instructions(start, end);
}
void Disassembler::decode(nmethod* nm, outputStream* st) {
ttyLocker ttyl;
- if (!load_library()) return;
decode_env env(nm, st);
env.output()->print_cr("----------------------------------------------------------------------");
#ifdef SHARK
SharkEntry* entry = (SharkEntry *) nm->code_begin();
--- 542,560 ----
env.output()->print_cr(" at [" PTR_FORMAT ", " PTR_FORMAT "] " JLONG_FORMAT " bytes", p2i(cb->code_begin()), p2i(cb->code_end()), ((jlong)(cb->code_end() - cb->code_begin())) * sizeof(unsigned char*));
env.decode_instructions(cb->code_begin(), cb->code_end());
}
void Disassembler::decode(address start, address end, outputStream* st, CodeStrings c) {
+ if (!can_decode()) return;
ttyLocker ttyl;
decode_env env(CodeCache::find_blob_unsafe(start), st, c);
env.decode_instructions(start, end);
}
void Disassembler::decode(nmethod* nm, outputStream* st) {
+ if (!can_decode()) return;
ttyLocker ttyl;
decode_env env(nm, st);
env.output()->print_cr("----------------------------------------------------------------------");
#ifdef SHARK
SharkEntry* entry = (SharkEntry *) nm->code_begin();
src/share/vm/compiler/disassembler.cpp
Index
Unified diffs
Context diffs
Sdiffs
Patch
New
Old
Previous File
Next File