summaryrefslogtreecommitdiffstats
path: root/tapsets.cxx
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2009-07-08 12:01:45 -0400
committerDave Brolley <brolley@redhat.com>2009-07-08 12:01:45 -0400
commitbdf70a5d466fa9c1559a93ab71603981f1c0d753 (patch)
tree9dcacb67e60b3754129ff8b484878a994f6a7f75 /tapsets.cxx
parent271691992a2e790cfa40df61b42de38be75d0677 (diff)
parent619d9aaf011c975159a79d34259083a596162bf1 (diff)
downloadsystemtap-steved-bdf70a5d466fa9c1559a93ab71603981f1c0d753.tar.gz
systemtap-steved-bdf70a5d466fa9c1559a93ab71603981f1c0d753.tar.xz
systemtap-steved-bdf70a5d466fa9c1559a93ab71603981f1c0d753.zip
Merge branch 'master' of git://sources.redhat.com/git/systemtap
Diffstat (limited to 'tapsets.cxx')
-rw-r--r--tapsets.cxx49
1 files changed, 22 insertions, 27 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index 766cb39f..6ef1e188 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -312,15 +312,6 @@ static bool null_die(Dwarf_Die *die)
}
-// PR 9941 introduces the need for a predicate
-
-int dwfl_report_offline_predicate (const char* modname, const char* filename)
-{
- if (pending_interrupts) { return -1; }
- return 1;
-}
-
-
enum
function_spec_type
{
@@ -601,34 +592,36 @@ struct dwarf_query : public base_query
struct dwarf_builder: public derived_probe_builder
{
- dwflpp *kern_dw;
+ map <string,dwflpp*> kern_dw;
map <string,dwflpp*> user_dw;
- dwarf_builder(): kern_dw(0) {}
+ dwarf_builder() {}
- dwflpp *get_kern_dw(systemtap_session& sess)
+ dwflpp *get_kern_dw(systemtap_session& sess, const string& module)
{
- if (!kern_dw)
- kern_dw = new dwflpp(sess);
- return kern_dw;
+ if (kern_dw.find(module) == kern_dw.end())
+ kern_dw[module] = new dwflpp(sess, module, true);
+ return kern_dw[module];
}
dwflpp *get_user_dw(systemtap_session& sess, const string& module)
{
if (user_dw.find(module) == user_dw.end())
- user_dw[module] = new dwflpp(sess, module);
+ user_dw[module] = new dwflpp(sess, module, false);
return user_dw[module];
}
/* NB: not virtual, so can be called from dtor too: */
void dwarf_build_no_more (bool verbose)
{
- if (kern_dw)
+ for (map<string,dwflpp*>::iterator udi = kern_dw.begin();
+ udi != kern_dw.end();
+ udi ++)
{
if (verbose)
- clog << "dwarf_builder releasing kernel dwflpp" << endl;
- delete kern_dw;
- kern_dw = 0;
+ clog << "dwarf_builder releasing kernel dwflpp " << udi->first << endl;
+ delete udi->second;
}
+ kern_dw.erase (kern_dw.begin(), kern_dw.end());
for (map<string,dwflpp*>::iterator udi = user_dw.begin();
udi != user_dw.end();
@@ -2721,7 +2714,7 @@ void dwarf_cast_expanding_visitor::visit_cast_op (cast_op* e)
if (module.find('/') == string::npos)
{
// kernel or kernel module target
- dw = db.get_kern_dw(s);
+ dw = db.get_kern_dw(s, module);
}
else
{
@@ -3453,11 +3446,13 @@ dwarf_builder::build(systemtap_session & sess,
dwflpp* dw = 0;
string module_name;
- if (has_null_param (parameters, TOK_KERNEL)
- || get_param (parameters, TOK_MODULE, module_name))
+ if (has_null_param (parameters, TOK_KERNEL))
+ {
+ dw = get_kern_dw(sess, "kernel");
+ }
+ else if (get_param (parameters, TOK_MODULE, module_name))
{
- // kernel or kernel module target
- dw = get_kern_dw(sess);
+ dw = get_kern_dw(sess, module_name);
}
else if (get_param (parameters, TOK_PROCESS, module_name))
{
@@ -5711,7 +5706,7 @@ tracepoint_builder::init_dw(systemtap_session& s)
if (s.verbose > 2)
clog << "Pass 2: using cached " << s.tracequery_path << endl;
- dw = new dwflpp(s, s.tracequery_path);
+ dw = new dwflpp(s, s.tracequery_path, false);
close(fd);
return true;
}
@@ -5736,7 +5731,7 @@ tracepoint_builder::init_dw(systemtap_session& s)
<< s.tracequery_path << "\"): " << strerror(errno) << endl;
}
- dw = new dwflpp(s, tracequery_ko);
+ dw = new dwflpp(s, tracequery_ko, false);
return true;
}