It's multithreaded now, thanks to a boost mutex

master
Marc Wäckerlin 20 years ago
parent 4b332eb798
commit bfcbda2ead
  1. 17
      mrw/stacktrace.cpp
  2. 25
      mrw/stacktrace.hpp

@ -9,6 +9,9 @@
@license LGPL, see file <a href="license.html">COPYING</a> @license LGPL, see file <a href="license.html">COPYING</a>
$Log$ $Log$
Revision 1.14 2005/03/11 23:22:58 marc
It's multithreaded now, thanks to a boost mutex
Revision 1.13 2005/02/28 07:28:37 marc Revision 1.13 2005/02/28 07:28:37 marc
typo typo
@ -90,7 +93,7 @@ extern "C" {
- in file file: /usr/include/demangle.h - in file file: /usr/include/demangle.h
- of package: binutils-2.15.90.0.1.1-31 - of package: binutils-2.15.90.0.1.1-31
An idiot unfortunately abused the C++ keyword @c typename as Someone unfortunately abused the C++ keyword @c typename as
variable name to @c cplus_demangle_fill_builtin_type, so I have variable name to @c cplus_demangle_fill_builtin_type, so I have
to work around it. to work around it.
*/ */
@ -199,6 +202,9 @@ const mrw::StackTrace& mrw::StackTrace::print(std::ostream& os) const
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
mrw::StackTrace::CodePos mrw::StackTrace::translate(void* addr) mrw::StackTrace::CodePos mrw::StackTrace::translate(void* addr)
throw(std::bad_exception) { throw(std::bad_exception) {
#ifdef _REENTRANT
boost::recursive_mutex::scoped_lock lock(_mutex);
#endif
assert(sizeof(bfd_vma)>=sizeof(void*)); assert(sizeof(bfd_vma)>=sizeof(void*));
bfd_vma vma_addr(reinterpret_cast<bfd_vma>(addr)); bfd_vma vma_addr(reinterpret_cast<bfd_vma>(addr));
std::map<Translator::key_type, std::string>::iterator std::map<Translator::key_type, std::string>::iterator
@ -224,6 +230,9 @@ mrw::StackTrace::CodePos mrw::StackTrace::translate(void* addr)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool mrw::StackTrace::createSymtable(const std::string& fname, void* offs) bool mrw::StackTrace::createSymtable(const std::string& fname, void* offs)
throw(std::bad_exception) { throw(std::bad_exception) {
#ifdef _REENTRANT
boost::recursive_mutex::scoped_lock lock(_mutex);
#endif
if (_dic.find(fname)!=_dic.end()) return true; // already loaded if (_dic.find(fname)!=_dic.end()) return true; // already loaded
try { try {
static DynamicLibrary lib("libbfd"); static DynamicLibrary lib("libbfd");
@ -267,6 +276,9 @@ bool mrw::StackTrace::createSymtable(const std::string& fname, void* offs)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
bool mrw::StackTrace::createSymtable(const mrw::StackTrace::BinFiles& files) bool mrw::StackTrace::createSymtable(const mrw::StackTrace::BinFiles& files)
throw(std::bad_exception) { throw(std::bad_exception) {
#ifdef _REENTRANT
boost::recursive_mutex::scoped_lock lock(_mutex);
#endif
bool success(true); bool success(true);
for (BinFiles::const_iterator it(files.begin()); for (BinFiles::const_iterator it(files.begin());
it!=files.end(); ++it) { it!=files.end(); ++it) {
@ -353,3 +365,6 @@ std::map<mrw::StackTrace::Translator::key_type, std::string>
mrw::StackTrace::_addrs; mrw::StackTrace::_addrs;
std::map<std::string, mrw::StackTrace::AutoBfd> mrw::StackTrace::_bfd; std::map<std::string, mrw::StackTrace::AutoBfd> mrw::StackTrace::_bfd;
std::map<std::string, mrw::AutoPtr<asymbol*> > mrw::StackTrace::_syms; std::map<std::string, mrw::AutoPtr<asymbol*> > mrw::StackTrace::_syms;
#ifdef _REENTRANT
boost::recursive_mutex mrw::StackTrace::_mutex;
#endif

@ -9,6 +9,9 @@
@license LGPL, see file <a href="license.html">COPYING</a> @license LGPL, see file <a href="license.html">COPYING</a>
$Log$ $Log$
Revision 1.14 2005/03/11 23:22:58 marc
It's multithreaded now, thanks to a boost mutex
Revision 1.13 2005/02/18 15:48:56 marc Revision 1.13 2005/02/18 15:48:56 marc
Dynamic loading of libbfd, no more dependency on specific libbfd version! Dynamic loading of libbfd, no more dependency on specific libbfd version!
@ -62,9 +65,8 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <bfd.h> #include <bfd.h>
#ifdef __REENTRANT #ifdef _REENTRANT
#warning "mrw::StackTrace is not thread safe yet!" #include <boost/thread/recursive_mutex.hpp>
#warning "It should work, but is at least untested..."
#endif #endif
namespace mrw { namespace mrw {
@ -119,7 +121,7 @@ namespace mrw {
names, sorce file names and line numbers are evaluated. names, sorce file names and line numbers are evaluated.
@note Method StackTrace::createSymtable must be called exactely @note Method StackTrace::createSymtable must be called exactely
once, before evaluating the first stack trace.Best place is the once, before evaluating the first stack trace. Best place is the
first line of the @c main function. first line of the @c main function.
@note Debug information is required for compiling. You nee the @note Debug information is required for compiling. You nee the
@ -169,8 +171,8 @@ namespace mrw {
CXXFLAGS="-g -fno-inline" ./configure && make clean check CXXFLAGS="-g -fno-inline" ./configure && make clean check
@endcode @endcode
@todo Add support for alternative symbol evaluation using @c @todo Should I add support for alternative symbol evaluation using @c
backtrace_symbols. backtrace_symbols? I think rather not...?
*/ */
class StackTrace { class StackTrace {
public: public:
@ -202,8 +204,8 @@ namespace mrw {
/// evaluate the stack trace and print it to a stream /// evaluate the stack trace and print it to a stream
const StackTrace& print(std::ostream& os) const throw(std::bad_exception); const StackTrace& print(std::ostream& os) const throw(std::bad_exception);
/// evaluates and returns all information from a raw address /// evaluates and returns all information from a raw address
static CodePos translate(void* addr) /** @classmutex _mutex */
throw(std::bad_exception); static CodePos translate(void* addr) throw(std::bad_exception);
/** @brief read the symbol table from the executable file or a /** @brief read the symbol table from the executable file or a
shared library shared library
@ -239,6 +241,8 @@ namespace mrw {
@note If this method is called more than once for the same @note If this method is called more than once for the same
file, the symbols are created only the first time, so you file, the symbols are created only the first time, so you
don't loose too much time. don't loose too much time.
@classmutex _mutex
*/ */
static bool createSymtable(const std::string& fname="", void* offs=0) static bool createSymtable(const std::string& fname="", void* offs=0)
throw(std::bad_exception); throw(std::bad_exception);
@ -266,6 +270,8 @@ namespace mrw {
@note This method calls the other one for all files in @note This method calls the other one for all files in
parameter @c files. parameter @c files.
@classmutex _mutex
*/ */
static bool createSymtable(const BinFiles& files) static bool createSymtable(const BinFiles& files)
throw(std::bad_exception); throw(std::bad_exception);
@ -282,6 +288,9 @@ namespace mrw {
static std::map<Translator::key_type, std::string> _addrs; static std::map<Translator::key_type, std::string> _addrs;
static std::map<std::string, AutoBfd> _bfd; static std::map<std::string, AutoBfd> _bfd;
static std::map<std::string, mrw::AutoPtr<asymbol*> > _syms; static std::map<std::string, mrw::AutoPtr<asymbol*> > _syms;
#ifdef _REENTRANT
static boost::recursive_mutex _mutex;
#endif
//................................................................ methods //................................................................ methods
static BinFiles filename() throw(std::bad_exception); static BinFiles filename() throw(std::bad_exception);
static void buildSectionMap(bfd*, asection*, void*) static void buildSectionMap(bfd*, asection*, void*)

Loading…
Cancel
Save