summaryrefslogtreecommitdiffstats
path: root/setupdwfl.h
diff options
context:
space:
mode:
authorMark Wielaard <mjw@redhat.com>2009-09-29 16:45:37 +0200
committerMark Wielaard <mjw@redhat.com>2009-09-29 16:45:37 +0200
commit68983551cc9390aa2bddd8e62ed0f0e3eca1edb6 (patch)
tree98dc1f189dac99351989f7167b84a88f39d6a86c /setupdwfl.h
parent497f19d74912d0b6adf729f88509c71a45cacdd4 (diff)
downloadsystemtap-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.h33
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);