diff options
author | dsmith <dsmith> | 2007-03-19 21:14:21 +0000 |
---|---|---|
committer | dsmith <dsmith> | 2007-03-19 21:14:21 +0000 |
commit | ab655cf8ec35ab47a38d95182dfe07a0e380681a (patch) | |
tree | 64be89f5afc184d87d2b4f2764abc6fc7047ec73 | |
parent | dc499f36287a8c960f2ccf0d1940b52a8cc62c84 (diff) | |
download | systemtap-steved-ab655cf8ec35ab47a38d95182dfe07a0e380681a.tar.gz systemtap-steved-ab655cf8ec35ab47a38d95182dfe07a0e380681a.tar.xz systemtap-steved-ab655cf8ec35ab47a38d95182dfe07a0e380681a.zip |
2007-03-19 David Smith <dsmith@redhat.com>
PR 4146 (partial fix)
* tapsets.cxx (all_session_groups): Added note about stating that
begin probes should be registered (actually run) first and end
probes should be unregistered (run) last.
* translate.cxx (c_unparser::emit_module_exit): Process probe
group vector in reverse order so that probe groups will get
unregistered in the reverse order that they were registered.
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | tapsets.cxx | 7 | ||||
-rw-r--r-- | translate.cxx | 8 |
3 files changed, 23 insertions, 2 deletions
@@ -1,3 +1,13 @@ +2007-03-19 David Smith <dsmith@redhat.com> + + PR 4146 (partial fix) + * tapsets.cxx (all_session_groups): Added note about stating that + begin probes should be registered (actually run) first and end + probes should be unregistered (run) last. + * translate.cxx (c_unparser::emit_module_exit): Process probe + group vector in reverse order so that probe groups will get + unregistered in the reverse order that they were registered. + 2007-03-19 Frank Ch. Eigler <fche@elastic.org> * buildrun.cxx (compile_pass): Emit kbuild-time autoconf widgets diff --git a/tapsets.cxx b/tapsets.cxx index 54388f5b..eb66f2bc 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -5419,6 +5419,13 @@ all_session_groups(systemtap_session& s) { vector<derived_probe_group*> g; #define DOONE(x) if (s. x##_derived_probes) g.push_back (s. x##_derived_probes) + + // Note that order *is* important here. We want to make sure we + // register (actually run) begin probes before any other probe type + // is run. Similarly, when unregistering probes, we want to + // unregister (actually run) end probes after every other probe type + // has be unregistered. To do the latter, + // c_unparser::emit_module_exit() will run this list backwards. DOONE(be); DOONE(dwarf); DOONE(timer); diff --git a/translate.cxx b/translate.cxx index 36530373..89a961e3 100644 --- a/translate.cxx +++ b/translate.cxx @@ -1201,9 +1201,13 @@ c_unparser::emit_module_exit () // XXX: might like to have an escape hatch, in case some probe is // genuinely stuck somehow + // Notice we're processing the derived_probe_group list in reverse + // order. This ensures that probes get unregistered in reverse + // order of the way they were registered. vector<derived_probe_group*> g = all_session_groups (*session); - for (unsigned i=0; i<g.size(); i++) - g[i]->emit_module_exit (*session); // NB: runs "end" probes + for (vector<derived_probe_group*>::reverse_iterator i = g.rbegin(); + i != g.rend(); i++) + (*i)->emit_module_exit (*session); // NB: runs "end" probes for (unsigned i=0; i<session->globals.size(); i++) { |