diff options
author | David Smith <dsmith@redhat.com> | 2008-08-08 12:26:02 -0500 |
---|---|---|
committer | David Smith <dsmith@redhat.com> | 2008-08-08 12:26:02 -0500 |
commit | a9a23c6ec198c08057989d6c3fc08b8865681bc4 (patch) | |
tree | 2d28417ab9a45f3200dcda7acdf84998c9c2b383 /testsuite/systemtap.examples/process/sleepingBeauties.stp | |
parent | 9963b5fc7945ce939aaa8027ca71927cb77a55ff (diff) | |
parent | 751f828801e9bd4739d03a31a77e84c91e075b4e (diff) | |
download | systemtap-steved-a9a23c6ec198c08057989d6c3fc08b8865681bc4.tar.gz systemtap-steved-a9a23c6ec198c08057989d6c3fc08b8865681bc4.tar.xz systemtap-steved-a9a23c6ec198c08057989d6c3fc08b8865681bc4.zip |
Merge branch 'master' of ssh://sources.redhat.com/git/systemtap into work
Diffstat (limited to 'testsuite/systemtap.examples/process/sleepingBeauties.stp')
-rw-r--r-- | testsuite/systemtap.examples/process/sleepingBeauties.stp | 58 |
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 + } + } +} |