summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStan Cox <scox@redhat.com>2009-03-24 16:13:18 -0400
committerStan Cox <scox@redhat.com>2009-03-24 16:15:50 -0400
commit8d200822a397e6e286905e4d79d9b9695c835bd4 (patch)
tree1401629bc940721b200bd49fb8163432e0dd405c
parent49b50ec6c2b45456d33d3fa145ccd3adfe4c528b (diff)
parentccc11a14c5117fcee425d53f00f0b871ac727728 (diff)
downloadsystemtap-steved-8d200822a397e6e286905e4d79d9b9695c835bd4.tar.gz
systemtap-steved-8d200822a397e6e286905e4d79d9b9695c835bd4.tar.xz
systemtap-steved-8d200822a397e6e286905e4d79d9b9695c835bd4.zip
Remove debugging line.
* dtrace: Remove debugging line.
-rw-r--r--runtime/itrace.c3
-rw-r--r--runtime/task_finder.c45
-rw-r--r--tapsets.cxx5
-rw-r--r--translate.cxx4
4 files changed, 35 insertions, 22 deletions
diff --git a/runtime/itrace.c b/runtime/itrace.c
index 618cbff0..97ba427e 100644
--- a/runtime/itrace.c
+++ b/runtime/itrace.c
@@ -340,7 +340,8 @@ static int usr_itrace_init(int single_step, pid_t tid, struct stap_itrace_probe
put_task_struct(tsk);
rcu_read_unlock();
- printk(KERN_INFO "usr_itrace_init: completed for tid = %d\n", tid);
+ if (debug)
+ printk(KERN_INFO "usr_itrace_init: completed for tid = %d\n", tid);
return 0;
}
diff --git a/runtime/task_finder.c b/runtime/task_finder.c
index 3f4908cb..7949a81f 100644
--- a/runtime/task_finder.c
+++ b/runtime/task_finder.c
@@ -39,15 +39,23 @@ static atomic_t __stp_attach_count = ATOMIC_INIT (0);
#define debug_task_finder_attach() (atomic_inc(&__stp_attach_count))
#define debug_task_finder_detach() (atomic_dec(&__stp_attach_count))
+#ifdef DEBUG_TASK_FINDER_PRINTK
+#define debug_task_finder_report() (printk(KERN_ERR \
+ "%s:%d attach count: %d, inuse count: %d\n", \
+ __FUNCTION__, __LINE__, \
+ atomic_read(&__stp_attach_count), \
+ atomic_read(&__stp_inuse_count)))
+#else
#define debug_task_finder_report() (_stp_dbug(__FUNCTION__, __LINE__, \
"attach count: %d, inuse count: %d\n", \
atomic_read(&__stp_attach_count), \
atomic_read(&__stp_inuse_count)))
+#endif /* !DEBUG_TASK_FINDER_PRINTK */
#else
#define debug_task_finder_attach() /* empty */
#define debug_task_finder_detach() /* empty */
#define debug_task_finder_report() /* empty */
-#endif
+#endif /* !DEBUG_TASK_FINDER */
typedef int (*stap_task_finder_callback)(struct stap_task_finder_target *tgt,
struct task_struct *tsk,
@@ -280,11 +288,15 @@ stap_utrace_detach(struct task_struct *tsk,
break;
case -ESRCH: /* REAP callback already begun */
case -EALREADY: /* DEATH callback already begun */
- rc = 0; /* ignore these errors*/
+ rc = 0; /* ignore these errors */
+ break;
+ case -EINPROGRESS:
+ debug_task_finder_detach();
+ rc = 0;
break;
default:
rc = -rc;
- _stp_error("utrace_detach returned error %d on pid %d",
+ _stp_error("utrace_control returned error %d on pid %d",
rc, tsk->pid);
break;
}
@@ -298,7 +310,6 @@ stap_utrace_detach_ops(struct utrace_engine_ops *ops)
{
struct task_struct *grp, *tsk;
struct utrace_attached_engine *engine;
- int rc = 0;
pid_t pid = 0;
// Notice we're not calling get_task_mm() in this loop. In
@@ -324,11 +335,12 @@ stap_utrace_detach_ops(struct utrace_engine_ops *ops)
continue;
#endif
- rc = stap_utrace_detach(tsk, ops);
- if (rc != 0)
- goto udo_err;
+ /* Notice we're purposefully ignoring errors from
+ * stap_utrace_detach(). Even if we got an error on
+ * this task, we need to keep detaching from other
+ * tasks. */
+ (void) stap_utrace_detach(tsk, ops);
} while_each_thread(grp, tsk);
-udo_err:
rcu_read_unlock();
debug_task_finder_report();
}
@@ -475,7 +487,7 @@ __stp_utrace_attach(struct task_struct *tsk,
* ref.
*/
rc = utrace_barrier(tsk, engine);
- if (rc != 0)
+ if (rc != -ESRCH && rc != -EALREADY)
_stp_error("utrace_barrier returned error %d on pid %d",
rc, (int)tsk->pid);
}
@@ -494,7 +506,7 @@ __stp_utrace_attach(struct task_struct *tsk,
}
}
- else
+ else if (rc != -ESRCH && rc != -EALREADY)
_stp_error("utrace_set_events2 returned error %d on pid %d",
rc, (int)tsk->pid);
utrace_engine_put(engine);
@@ -869,11 +881,12 @@ __stp_utrace_task_finder_target_quiesce(enum utrace_resume_action action,
* a stale task pointer, if we have an engine ref.
*/
rc = utrace_barrier(tsk, engine);
- if (rc != 0)
+ if (rc == 0)
+ rc = utrace_set_events(tsk, engine,
+ __STP_ATTACHED_TASK_BASE_EVENTS(tgt));
+ else if (rc != -ESRCH && rc != -EALREADY)
_stp_error("utrace_barrier returned error %d on pid %d",
rc, (int)tsk->pid);
- rc = utrace_set_events(tsk, engine,
- __STP_ATTACHED_TASK_BASE_EVENTS(tgt));
}
if (rc != 0)
_stp_error("utrace_set_events returned error %d on pid %d",
@@ -1032,7 +1045,6 @@ __stp_utrace_task_finder_target_syscall_entry(enum utrace_resume_action action,
static void
__stp_call_vm_callbacks_with_vma(struct stap_task_finder_target *tgt,
struct task_struct *tsk,
- int map_p,
struct vm_area_struct *vma)
{
char *mmpath_buf;
@@ -1059,7 +1071,7 @@ __stp_call_vm_callbacks_with_vma(struct stap_task_finder_target *tgt,
rc, (int)tsk->pid);
}
else {
- __stp_call_vm_callbacks(tgt, tsk, map_p, mmpath,
+ __stp_call_vm_callbacks(tgt, tsk, 1, mmpath,
vma->vm_start, vma->vm_end,
(vma->vm_pgoff << PAGE_SHIFT));
}
@@ -1152,7 +1164,7 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
down_read(&mm->mmap_sem);
vma = __stp_find_file_based_vma(mm, rv);
if (vma != NULL) {
- __stp_call_vm_callbacks_with_vma(tgt, tsk, 0, vma);
+ __stp_call_vm_callbacks_with_vma(tgt, tsk, vma);
}
up_read(&mm->mmap_sem);
mmput(mm);
@@ -1225,7 +1237,6 @@ __stp_utrace_task_finder_target_syscall_exit(enum utrace_resume_action action,
&& vma->vm_end <= entry->vm_end) {
__stp_call_vm_callbacks_with_vma(tgt,
tsk,
- 1,
vma);
if (vma->vm_end >= entry->vm_end)
break;
diff --git a/tapsets.cxx b/tapsets.cxx
index 3a181cb3..c36a1aa0 100644
--- a/tapsets.cxx
+++ b/tapsets.cxx
@@ -603,7 +603,8 @@ typedef tr1::unordered_map<string,Dwarf_Die> cu_function_cache_t;
typedef tr1::unordered_map<string,cu_function_cache_t*> mod_cu_function_cache_t; // module:cu -> function -> die
#else
struct stringhash {
- size_t operator() (const string& s) const { hash<const char*> h; return h(s.c_str()); }
+ // __gnu_cxx:: is needed because our own hash.h has an ambiguous hash<> decl too.
+ size_t operator() (const string& s) const { __gnu_cxx::hash<const char*> h; return h(s.c_str()); }
};
typedef hash_map<string,Dwarf_Die,stringhash> cu_function_cache_t;
@@ -5022,7 +5023,7 @@ void dwarf_cast_expanding_visitor::visit_cast_op (cast_op* e)
string code;
exp_type type = pe_long;
- size_t mod_end = -1;
+ size_t mod_end = ~0;
do
{
// split the module string by ':' for alternatives
diff --git a/translate.cxx b/translate.cxx
index 40bb82c2..798d52fe 100644
--- a/translate.cxx
+++ b/translate.cxx
@@ -4826,7 +4826,7 @@ emit_symbol_data (systemtap_session& s)
if (pending_interrupts) return;
off = dwfl_getmodules (dwfl, &dump_unwindsyms, (void *) &ctx, 0);
}
- while (off > 0);
+ while (off > 0 && !ctx.undone_unwindsym_modules.empty());
dwfl_assert("dwfl_getmodules", off == 0);
}
dwfl_end(dwfl);
@@ -4864,7 +4864,7 @@ emit_symbol_data (systemtap_session& s)
if (pending_interrupts) return;
off = dwfl_getmodules (dwfl, &dump_unwindsyms, (void *) &ctx, 0);
}
- while (off > 0);
+ while (off > 0 && !ctx.undone_unwindsym_modules.empty());
dwfl_assert("dwfl_getmodules", off == 0);
}
dwfl_end(dwfl);