summaryrefslogtreecommitdiffstats
path: root/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp
diff options
context:
space:
mode:
Diffstat (limited to 'stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp')
-rwxr-xr-xstap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp44
1 files changed, 44 insertions, 0 deletions
diff --git a/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp
new file mode 100755
index 0000000..8f2b414
--- /dev/null
+++ b/stap_tutorial-1.0/examples/cmd-eval/cmd-eval-futexes.stp
@@ -0,0 +1,44 @@
+#!/usr/bin/env stap
+
+global target_pids, target_execs
+global thread_thislock, thread_blocktime
+global FUTEX_WAIT = 0, FUTEX_WAKE = 1
+global lock_waits
+
+probe process.exec_complete {
+ if (success && (ppid() in target_pids || pid() == target()))
+ target_pids[pid()] = kernel_string($filename)
+}
+
+probe syscall.futex {
+ if (!(pid() in target_pids)) next
+
+ if (op != FUTEX_WAIT) next # ignore originators of WAKE events
+
+ t = tid()
+ thread_thislock[t] = $uaddr
+ thread_blocktime[t] = gettimeofday_us()
+}
+
+probe syscall.futex.return {
+ if (!(pid() in target_pids)) next
+
+ if (op != FUTEX_WAIT) next # ignore originators of WAKE events
+
+ t = tid()
+ ts = thread_blocktime[t]
+ if (ts) {
+ elapsed = gettimeofday_us() - ts
+ lock_waits[pid(), thread_thislock[t]] <<< elapsed
+ delete thread_blocktime[t]
+ delete thread_thislock[t]
+ }
+}
+
+probe end {
+ foreach ([pid, lock] in lock_waits)
+ printf ("%s[%d] lock %p contended %5d times, %9d avg us\n",
+ target_pids[pid], pid, lock,
+ @count(lock_waits[pid, lock]),
+ @avg(lock_waits[pid, lock]))
+}