src/share/vm/utilities/decoder.cpp

Print this page

        

*** 22,103 **** * */ #include "precompiled.hpp" #include "prims/jvm.h" #include "utilities/decoder.hpp" ! Decoder::decoder_status Decoder::_decoder_status = Decoder::no_error; ! bool Decoder::_initialized = false; ! #if !defined(_WINDOWS) && !defined(__APPLE__) ! // Implementation of common functionalities among Solaris and Linux ! #include "utilities/elfFile.hpp" ! ElfFile* Decoder::_opened_elf_files = NULL; ! bool Decoder::can_decode_C_frame_in_vm() { ! return true; ! } ! void Decoder::initialize() { ! _initialized = true; ! } ! ! void Decoder::uninitialize() { ! if (_opened_elf_files != NULL) { ! delete _opened_elf_files; ! _opened_elf_files = NULL; } ! _initialized = false; } ! Decoder::decoder_status Decoder::decode(address addr, const char* filepath, char *buf, int buflen, int *offset) { ! if (_decoder_status != no_error) { ! return _decoder_status; ! } ! ElfFile* file = get_elf_file(filepath); ! if (_decoder_status != no_error) { ! return _decoder_status; ! } ! const char* symbol = file->decode(addr, offset); ! if (file->get_status() == out_of_memory) { ! _decoder_status = out_of_memory; ! return _decoder_status; ! } else if (symbol != NULL) { ! if (!demangle(symbol, buf, buflen)) { ! jio_snprintf(buf, buflen, "%s", symbol); ! } ! return no_error; ! } else { ! return symbol_not_found; ! } } ! ElfFile* Decoder::get_elf_file(const char* filepath) { ! if (_decoder_status != no_error) { ! return NULL; ! } ! ElfFile* file = _opened_elf_files; ! while (file != NULL) { ! if (file->same_elf_file(filepath)) { ! return file; ! } ! file = file->m_next; ! } ! file = new ElfFile(filepath); ! if (file == NULL) { ! _decoder_status = out_of_memory; } - if (_opened_elf_files != NULL) { - file->m_next = _opened_elf_files; - } ! _opened_elf_files = file; ! return file; } - - #endif --- 22,107 ---- * */ #include "precompiled.hpp" #include "prims/jvm.h" + #include "runtime/mutexLocker.hpp" #include "utilities/decoder.hpp" ! #if defined(_WINDOWS) ! #include "decoder_windows.hpp" ! #elif defined(__APPLE__) ! #include "decoder_machO.hpp" ! #else ! #include "decoder_elf.hpp" ! #endif ! NullDecoder* Decoder::_decoder = NULL; ! NullDecoder Decoder::_do_nothing_decoder; ! Mutex* Decoder::_decoder_lock = new Mutex(Mutex::safepoint, ! "DecoderLock"); ! // _decoder_lock should already acquired before enter this method ! NullDecoder* Decoder::get_decoder() { ! assert(_decoder_lock != NULL && _decoder_lock->owned_by_self(), ! "Require DecoderLock to enter"); ! if (_decoder != NULL) { ! return _decoder; ! } ! // Decoder is a secondary service. Although, it is good to have, ! // but we can live without it. ! #if defined(_WINDOWS) ! _decoder = new (std::nothrow) WindowsDecoder(); ! #elif defined (__APPLE__) ! _decoder = new (std::nothrow)MachODecoder(); ! #else ! _decoder = new (std::nothrow)ElfDecoder(); ! #endif ! if (_decoder == NULL || _decoder->has_error()) { ! if (_decoder != NULL) { ! delete _decoder; } ! _decoder = &_do_nothing_decoder; ! } ! return _decoder; } ! bool Decoder::decode(address addr, char* buf, int buflen, int* offset, const char* modulepath) { ! assert(_decoder_lock != NULL, "Just check"); ! MutexLockerEx locker(_decoder_lock, true); ! NullDecoder* decoder = get_decoder(); ! assert(decoder != NULL, "null decoder"); ! return decoder->decode(addr, buf, buflen, offset, modulepath); ! } ! bool Decoder::demangle(const char* symbol, char* buf, int buflen) { ! assert(_decoder_lock != NULL, "Just check"); ! MutexLockerEx locker(_decoder_lock, true); ! NullDecoder* decoder = get_decoder(); ! assert(decoder != NULL, "null decoder"); ! return decoder->demangle(symbol, buf, buflen); } ! bool Decoder::can_decode_C_frame_in_vm() { ! assert(_decoder_lock != NULL, "Just check"); ! MutexLockerEx locker(_decoder_lock, true); ! NullDecoder* decoder = get_decoder(); ! assert(decoder != NULL, "null decoder"); ! return decoder->can_decode_C_frame_in_vm(); ! } ! // shutdown real decoder and replace it with ! // _do_nothing_decoder ! void Decoder::shutdown() { ! assert(_decoder_lock != NULL, "Just check"); ! MutexLockerEx locker(_decoder_lock, true); ! ! if (_decoder != NULL && _decoder != &_do_nothing_decoder) { ! delete _decoder; } ! _decoder = &_do_nothing_decoder; }