Add minimal support for post-mortem (core dump) debugging of multi-LWP
[dragonfly/netmp.git] / tools / tools / vop_table / vop_table.tcl
blob50f5be2c0438f7d10ed95d330bc615cb0bd1fff0
1 #!/bin/sh
3 proc do_file {file} {
4 global names ops op
5 set f [open $file]
7 set s 0
9 while {[gets $f a] >= 0} {
10 if {$s == 0} {
11 if {[regexp {struct[ ]*vnodeopv_entry_desc} "$a"]} {
12 regsub {.*vnodeopv_entry_desc[ ]*} $a {} a
13 regsub {\[.*} $a {} a
14 regsub {_entries} $a {} a
15 set name $a
16 set names($a) 0
17 set s 1
19 continue
21 if {$s == 1} {
22 if {[regexp {NULL} "$a"]} {
23 set s 0
24 continue
26 if {![regexp {vop.*_desc} "$a"]} continue
27 regsub -all {[,&]} $a " " a
28 set b [lindex $a 0]
29 #puts "$name>> [lindex $b 0] >> [lindex $b 3]"
30 set o [lindex $b 0]
31 regsub {_desc} $o "" o
32 set ops($o) 0
33 set op([list $name $o]) [lindex $b 3]
34 continue
36 puts "$s>> $a"
38 close $f
41 set fi [open "|find [glob /usr/src/sys/*fs /usr/src/sys/gnu/*fs] /usr/src/sys/kern -type f -name *.c -print | xargs grep VNODEOP_SET" ]
42 while {[gets $fi a] >= 0} {
43 puts stderr $a
44 if {[regexp {#define} $a]} continue
45 if {[regexp {mallocfs} $a]} continue
46 do_file [lindex [split $a :] 0]
48 close $fi
50 puts {<HTML>
51 <HEAD></HEAD><BODY>
52 <TABLE BORDER WIDTH="100%" NOSAVE>
55 set opn [lsort [array names ops]]
56 set a [lsort [array names names]]
58 set tbn default_vnodeop
59 foreach i $a {
60 if {$i == "default_vnodeop"} continue
61 lappend tbn $i
64 foreach i $opn {
65 if {$i == "vop_default"} continue
66 regsub "vop_" $i "" i
67 lappend fl [format "%12s" $i]
70 lappend fl [format "%12s" default]
72 puts {<TR>}
73 puts {<TD>}
74 puts {</TD>}
75 puts "<TR>"
76 puts "<TD></TD>"
77 foreach j $fl {
78 puts "<TD>"
80 for {set i 0} {$i < 12} {incr i} {
81 puts "[string index $j $i]<BR>"
83 puts "</TD>"
85 puts "</TR>"
87 set fnames(vop_defaultop) *
88 set fnames(vop_nolock) nl
89 set fnames(vop_noislocked) ni
90 set fnames(vop_nounlock) nu
91 set fnames(vop_stdlock) sl
92 set fnames(vop_stdislocked) si
93 set fnames(vop_stdunlock) su
94 set fnames(vop_einval) I
95 set fnames(vop_enotty) T
96 set fnames(vop_null) -
97 set fnames(vop_eopnotsupp) S
98 set fnames(ufs_missingop) M
99 set fnames(vop_nopoll) np
100 set fnames(vop_nostrategy) ns
101 set fnames(vop_revoke) vr
102 set fnames(vfs_cache_lookup) cl
103 set fnames(vop_stdpathconf) pc
104 set fnames(vop_stdbwrite) bw
106 set fn 0
107 set nop(aa) 0
108 unset nop(aa)
109 foreach i $tbn {
110 puts {<TR>}
111 puts "<TD>$i</TD>"
112 foreach j $opn {
113 if {$j == "vop_default"} continue
114 if {![info exists op([list $i $j])]} {
115 puts "<TD></TD>"
116 continue
118 set t $op([list $i $j])
120 set c "#00ddd0"
121 if {[info exists fnames($t)]} {
122 set t $fnames($t)
123 } else {
124 if {![info exists nop($t)]} {
125 incr fn
126 set nop($t) $fn
127 set nfn($fn) $t
128 set use($fn) 0
130 incr use($nop($t))
131 set t "<FONT SIZE=-1>$nop($t)</FONT>"
132 set c "#00ffd0"
134 puts "<TD BGCOLOR=\"$c\">$t</TD>"
136 set j vop_default
137 if {![info exists op([list $i $j])]} {
138 puts "<TD></TD>"
139 continue
141 puts "<TD>$op([list $i $j])</TD>"
143 puts "</TR>"
145 puts "</TABLE>"
146 puts "<HR>"
147 puts {<PRE>}
148 foreach i [lsort [array names fnames]] {
149 puts [format "%-2s %s" $fnames($i) $i]
151 puts {
152 </PRE>
154 puts "<HR>"
155 puts "<HR>"
156 puts {<TABLE BORDER NOSAVE>}
157 set m 8
158 for {set i 1} {$i <= $fn} {incr i $m} {
159 puts "<TR>"
160 for {set j 0} {$j < $m} {incr j} {
161 set k [expr $i + $j]
162 if {$k <= $fn} {
163 #puts "<TD>$k</TD><TD><FONT SIZE=-1>$nfn($k)/$use($k)</FONT></TD>"
164 puts "<TD>$k</TD><TD><FONT SIZE=-1>$nfn($k)</FONT></TD>"
167 puts "</TR>"
169 puts "</TABLE>"
171 puts "</TABLE>"
172 puts "</BODY>"
173 puts "</HTML>"