summaryrefslogtreecommitdiffstats
path: root/testsuite/systemtap.examples/process/sleepingBeauties.stp
diff options
context:
space:
mode:
authorDave Brolley <brolley@redhat.com>2008-08-08 15:15:19 -0400
committerDave Brolley <brolley@redhat.com>2008-08-08 15:15:19 -0400
commit71906647386a9684086b0542318b536d95ae089c (patch)
treefb0348d7bb34095e95ad830da8e832bad9187a55 /testsuite/systemtap.examples/process/sleepingBeauties.stp
parentd5658775da9fa0ac792eb3f874df9f7c4d60de7e (diff)
parentf1118e1032612170cae8cd979cd529722ad95fdb (diff)
downloadsystemtap-steved-71906647386a9684086b0542318b536d95ae089c.tar.gz
systemtap-steved-71906647386a9684086b0542318b536d95ae089c.tar.xz
systemtap-steved-71906647386a9684086b0542318b536d95ae089c.zip
Merge branch 'master' of ssh://sources.redhat.com/git/systemtap
Conflicts: ChangeLog testsuite/ChangeLog
Diffstat (limited to 'testsuite/systemtap.examples/process/sleepingBeauties.stp')
-rw-r--r--testsuite/systemtap.examples/process/sleepingBeauties.stp58
1 files changed, 58 insertions, 0 deletions
diff --git a/testsuite/systemtap.examples/process/sleepingBeauties.stp b/testsuite/systemtap.examples/process/sleepingBeauties.stp
new file mode 100644
index 00000000..64c563a3
--- /dev/null
+++ b/testsuite/systemtap.examples/process/sleepingBeauties.stp
@@ -0,0 +1,58 @@
+#! /usr/bin/stap
+
+function time () { return gettimeofday_ms() }
+global time_name = "ms"
+global boredom = 10 # in time units
+global name, back, backtime, bored
+
+/* Note: the order that the probes are listed should not matter.
+ However, the following order for
+ probe kernel.function("wait_for_completion").return and
+ probe kernel.function("wait_for_completion").call
+ avoids have the kretprobe stuff in the backtrace.
+ for more information see:
+ http://sources.redhat.com/bugzilla/show_bug.cgi?id=6436
+*/
+
+
+probe kernel.function("wait_for_completion").return
+{
+ t=tid()
+
+ if ([t] in bored) {
+ patience = time() - backtime[t]
+ printf ("thread %d (%s) bored for %d %s\n",
+ t, name[t], patience, time_name)
+ }
+
+ delete bored[t]
+ delete back[t]
+ delete name[t]
+ delete backtime[t]
+}
+
+
+probe kernel.function("wait_for_completion").call
+{
+ t=tid()
+ back[t]=backtrace()
+ name[t]=execname()
+ backtime[t]=time()
+ delete bored[t]
+}
+
+
+probe timer.profile {
+ foreach (tid+ in back) {
+ if ([tid] in bored) continue
+
+ patience = time() - backtime[tid]
+ if (patience >= boredom) {
+ printf ("thread %d (%s) impatient after %d %s\n",
+ tid, name[tid], patience, time_name)
+ print_stack (back[tid])
+ printf ("\n")
+ bored[tid] = 1 # defer further reports to wakeup
+ }
+ }
+}