]> sourceware.org Git - systemtap.git/commitdiff
2007-03-19 David Smith <dsmith@redhat.com>
authordsmith <dsmith>
Mon, 19 Mar 2007 21:14:21 +0000 (21:14 +0000)
committerdsmith <dsmith>
Mon, 19 Mar 2007 21:14:21 +0000 (21:14 +0000)
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.

ChangeLog
tapsets.cxx
translate.cxx

index f81d6e15e8065feec7da7441f372754b98ab542c..19318d3576d1e35dc1c74f5d398fb3f511375af4 100644 (file)
--- 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
index 54388f5be11bd2cba0876e7fe1023349acd41e71..eb66f2bc298a1f6d5a15fc492de8a6a1919271f6 100644 (file)
@@ -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);
index 3653037383c6d1d0398caf0a368e8210c9e0be98..89a961e31cf266e8bf19bcbf43f6c7fb2bad41d1 100644 (file)
@@ -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++)
     {
This page took 0.050552 seconds and 5 git commands to generate.