summaryrefslogtreecommitdiffstats
path: root/tapsets.cxx
diff options
context:
space:
mode:
authorfche <fche>2007-03-29 20:39:55 +0000
committerfche <fche>2007-03-29 20:39:55 +0000
commitc48cb0cc9acae74fde12b47597f7adc9bbd15ab5 (patch)
treece02014bdaf476aef98b2bcb0aede518247fd306 /tapsets.cxx
parent05fb7de14d0001dd35689ec3ff1cc737220dfc73 (diff)
downloadsystemtap-steved-c48cb0cc9acae74fde12b47597f7adc9bbd15ab5.tar.gz
systemtap-steved-c48cb0cc9acae74fde12b47597f7adc9bbd15ab5.tar.xz
systemtap-steved-c48cb0cc9acae74fde12b47597f7adc9bbd15ab5.zip
2007-03-29 Frank Ch. Eigler <fche@redhat.com>
* tapsets.cxx (dwarf_derived_probe emit_module_init): Correct handling of kprobe registration errors in the middle of a sequence.
Diffstat (limited to 'tapsets.cxx')
-rw-r--r--tapsets.cxx7
1 files changed, 6 insertions, 1 deletions
diff --git a/tapsets.cxx b/tapsets.cxx
index 463cbf68..e6bc7a47 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -3805,10 +3805,15 @@ dwarf_derived_probe_group::emit_module_init (systemtap_session& s)
s.op->newline() << "sdp->u.kp.pre_handler = &enter_kprobe_probe;";
s.op->newline() << "rc = register_kprobe (& sdp->u.kp);";
s.op->newline(-1) << "}";
- s.op->newline() << "if (rc) for (j=i-1; j>=0; j--) {"; // partial rollback
+ s.op->newline() << "if (rc) {";
+ s.op->newline(1) << "for (j=i-1; j>=0; j--) {"; // partial rollback
s.op->newline(1) << "struct stap_dwarf_probe *sdp2 = & stap_dwarf_probes[j];";
s.op->newline() << "if (sdp2->return_p) unregister_kretprobe (&sdp2->u.krp);";
s.op->newline() << "else unregister_kprobe (&sdp2->u.kp);";
+ // NB: we don't have to clear sdp2->registered_p, since the module_exit code is
+ // not run for this early-abort case.
+ s.op->newline(-1) << "}";
+ s.op->newline() << "break;"; // don't attempt to register any more probes
s.op->newline(-1) << "}";
s.op->newline() << "else sdp->registered_p = 1;";
s.op->newline(-1) << "}"; // for loop