summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordsmith <dsmith>2007-03-19 21:14:21 +0000
committerdsmith <dsmith>2007-03-19 21:14:21 +0000
commitab655cf8ec35ab47a38d95182dfe07a0e380681a (patch)
tree64be89f5afc184d87d2b4f2764abc6fc7047ec73
parentdc499f36287a8c960f2ccf0d1940b52a8cc62c84 (diff)
downloadsystemtap-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--ChangeLog10
-rw-r--r--tapsets.cxx7
-rw-r--r--translate.cxx8
3 files changed, 23 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index f81d6e15..19318d35 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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++)
{