1 | #!/bin/sh |
---|
2 | # |
---|
3 | # This script lists what mythbackend is polling on. |
---|
4 | # |
---|
5 | PATH=/files2/home/ali/wk/myth:$PATH |
---|
6 | if [ -f /var/run/mythbackend.pid ]; then |
---|
7 | pid=`cat /var/run/mythbackend.pid` || exit 1 |
---|
8 | else |
---|
9 | echo Myth backend not running |
---|
10 | exit 1 |
---|
11 | fi |
---|
12 | if [ -d /proc/$pid/task ]; then |
---|
13 | polling=`fgrep -lx poll_schedule_timeout /proc/$pid/task/*/wchan | \ |
---|
14 | sed -e 's:.*/task/\([0-9]*\)/wchan:\1:'` |
---|
15 | else |
---|
16 | echo Myth backend not running |
---|
17 | exit 1 |
---|
18 | fi |
---|
19 | fds_to_list=`mktemp` |
---|
20 | for task in $polling; do |
---|
21 | read callno arg0 arg1 arg2 arg3 arg4 arg5 sp pc < /proc/$task/syscall |
---|
22 | # syscall numbers are in /usr/include/syscall.h |
---|
23 | # NB: We should support ppoll, epoll and pselect (and others?), |
---|
24 | # but mythbackend doesn't seem to use them. |
---|
25 | case $callno in |
---|
26 | 7) |
---|
27 | if [ "$arg0" = "0x0" ]; then |
---|
28 | fds=$arg0 |
---|
29 | else |
---|
30 | fds="[`read_mem -t pollfd $pid $arg0 $arg1`]" |
---|
31 | read_mem -t pollfd $pid $arg0 $arg1 | \ |
---|
32 | sed -n -e 's/.*{fd=\([1-9][0-9]*\),.*/\1/p' >> $fds_to_list |
---|
33 | fi |
---|
34 | echo $task: poll fds=$fds nfds=$arg1 |
---|
35 | ;; |
---|
36 | 23) |
---|
37 | if [ "$arg1" = "0x0" ]; then |
---|
38 | readfds=$arg1 |
---|
39 | else |
---|
40 | readfds=`read_mem -t fdset $pid $arg1 1` |
---|
41 | echo $readfds | sed -n -e 's/.*\[\(.*\)\].*/\1/p' | \ |
---|
42 | tr ' ' '\012' >> $fds_to_list |
---|
43 | fi |
---|
44 | if [ "$arg2" = "0x0" ]; then |
---|
45 | writefds=$arg2 |
---|
46 | else |
---|
47 | writefds=`read_mem -t fdset $pid $arg2 1` |
---|
48 | echo $writefds | sed -n -e 's/.*\[\(.*\)\].*/\1/p' | \ |
---|
49 | tr ' ' '\012' >> $fds_to_list |
---|
50 | fi |
---|
51 | if [ "$arg3" = "0x0" ]; then |
---|
52 | exceptfds=$arg3 |
---|
53 | else |
---|
54 | exceptfds=`read_mem -t fdset $pid $arg3 1` |
---|
55 | echo $exceptfds | sed -n -e 's/.*\[\(.*\)\].*/\1/p' | \ |
---|
56 | tr ' ' '\012' >> $fds_to_list |
---|
57 | fi |
---|
58 | echo $task: select nfds=$arg0 readfds=$readfds writefds=$writefds \ |
---|
59 | exceptfds=$exceptfds |
---|
60 | ;; |
---|
61 | 219) |
---|
62 | echo $task: restart_syscall |
---|
63 | ;; |
---|
64 | running) |
---|
65 | # task is no longer waiting in a syscall |
---|
66 | ;; |
---|
67 | *) |
---|
68 | echo $task: syscall no $callno |
---|
69 | ;; |
---|
70 | esac |
---|
71 | done |
---|
72 | fds=`sort -n -u $fds_to_list | tr '\012' ',' | sed -e 's/^,//' -e 's/,$//'` |
---|
73 | lsof -p $pid -a -d $fds |
---|
74 | rm $fds_to_list |
---|