diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | tapsets.cxx | 9 |
2 files changed, 8 insertions, 6 deletions
@@ -1,3 +1,8 @@ +2008-09-02 Frank Ch. Eigler <fche@elastic.org> + + * tapsets.cxx (uprobe..emit_module_init): Leave dying-uprobe + loop as early as possible. + 2008-09-02 Stan Cox <scox@redhat.com> * elaborate.cxx (add_global_var_display): Simplify token use. diff --git a/tapsets.cxx b/tapsets.cxx index 4cda930f..4fa53a88 100644 --- a/tapsets.cxx +++ b/tapsets.cxx @@ -6790,9 +6790,8 @@ uprobe_derived_probe_group::emit_module_decls (systemtap_session& s) // unregister old uprobe s.op->newline(-1) << "} else if (!register_p && " << "sup->spec_index == spec_index && " // a u[ret]probe set up for this probe point - << "((sups->return_p && sup->urp.u.pid == tsk->tgid) ||" // dying uretprobe - << "(!sups->return_p && sup->up.pid == tsk->tgid))) {"; // dying uprobe - // XXX: or just check sup->spec_index == spec_index? + << "((sups->return_p && sup->urp.u.pid == tsk->tgid && sup->urp.u.vaddr == relocation + sups->address) ||" // dying uretprobe + << "(!sups->return_p && sup->up.pid == tsk->tgid && sup->up.vaddr == relocation + sups->address))) {"; // dying uprobe s.op->newline() << "if (sups->return_p) {"; s.op->newline(1) << "#ifdef DEBUG_UPROBES"; s.op->newline() << "printk (KERN_WARNING \"uretprobe unregister pid %d addr %p\\n\", sup->up.pid, (void*) sup->up.vaddr);"; @@ -6806,9 +6805,7 @@ uprobe_derived_probe_group::emit_module_decls (systemtap_session& s) s.op->newline(-1) << "}"; s.op->newline(1) << "sup->spec_index = -1;"; s.op->newline() << "handled_p = 1;"; - // XXX: Do we need to keep searching the array for other processes, or - // can we break just like for the register-new case? - + s.op->newline() << "break;"; // exit to-free slot search s.op->newline(-1) << "}"; // if/else s.op->newline(-1) << "}"; // stap_uprobes[] loop |