diff options
author | Mark Wielaard <mjw@redhat.com> | 2009-09-29 16:45:37 +0200 |
---|---|---|
committer | Mark Wielaard <mjw@redhat.com> | 2009-09-29 16:45:37 +0200 |
commit | 68983551cc9390aa2bddd8e62ed0f0e3eca1edb6 (patch) | |
tree | 98dc1f189dac99351989f7167b84a88f39d6a86c /setupdwfl.h | |
parent | 497f19d74912d0b6adf729f88509c71a45cacdd4 (diff) | |
download | systemtap-steved-68983551cc9390aa2bddd8e62ed0f0e3eca1edb6.tar.gz systemtap-steved-68983551cc9390aa2bddd8e62ed0f0e3eca1edb6.tar.xz systemtap-steved-68983551cc9390aa2bddd8e62ed0f0e3eca1edb6.zip |
Cache Dwfl's for reuse between pass 2 and pass 3.
* setupdwfl.h: Introduce DwflPtr.
* setupdwfl.cxx: Cache kernel_dwfl and user_dwfl. Keep track of last used
module strings. Return cached versions if same query used.
* dwflpp.h: Use DwflPtr instead of Dwfl*.
* dwflpp.cxx: Use DwflPtr and don't dwfl_end().
* translate.cxx: Likewise. Run through dwfl_getmodules() with returned
ptr offset.
Diffstat (limited to 'setupdwfl.h')
-rw-r--r-- | setupdwfl.h | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/setupdwfl.h b/setupdwfl.h index 67a66397..743ce668 100644 --- a/setupdwfl.h +++ b/setupdwfl.h @@ -16,21 +16,32 @@ #include <string> #include <vector> +#include <tr1/memory> + extern "C" { #include <elfutils/libdwfl.h> } -Dwfl *setup_dwfl_kernel(const std::string &name, - unsigned *found, - systemtap_session &s); -Dwfl *setup_dwfl_kernel(const std::set<std::string> &names, - unsigned *found, - systemtap_session &s); - -Dwfl* setup_dwfl_user(const std::string &name); -Dwfl* setup_dwfl_user(std::vector<std::string>::const_iterator &begin, - const std::vector<std::string>::const_iterator &end, - bool all_needed); +struct StapDwfl +{ +public: + StapDwfl(Dwfl *d) : dwfl(d) { } + ~StapDwfl() { if (dwfl) dwfl_end (dwfl); } + Dwfl *dwfl; +}; +typedef std::tr1::shared_ptr<StapDwfl> DwflPtr; + +DwflPtr setup_dwfl_kernel(const std::string &name, + unsigned *found, + systemtap_session &s); +DwflPtr setup_dwfl_kernel(const std::set<std::string> &names, + unsigned *found, + systemtap_session &s); + +DwflPtr setup_dwfl_user(const std::string &name); +DwflPtr setup_dwfl_user(std::vector<std::string>::const_iterator &begin, + const std::vector<std::string>::const_iterator &end, + bool all_needed); // user-space files must be full paths and not end in .ko bool is_user_module(const std::string &m); |