Blame


1 0a61c07d 2004-04-19 devnull
2 0a61c07d 2004-04-19 devnull defn labpc(l)
3 0a61c07d 2004-04-19 devnull {
4 0a61c07d 2004-04-19 devnull if objtype == "386" then
5 0a61c07d 2004-04-19 devnull return longjmp;
6 0a61c07d 2004-04-19 devnull return *(l+4);
7 0a61c07d 2004-04-19 devnull }
8 0a61c07d 2004-04-19 devnull
9 0a61c07d 2004-04-19 devnull defn labsp(l)
10 0a61c07d 2004-04-19 devnull {
11 0a61c07d 2004-04-19 devnull return *l;
12 0a61c07d 2004-04-19 devnull }
13 0a61c07d 2004-04-19 devnull
14 0a61c07d 2004-04-19 devnull defn labstk(l)
15 0a61c07d 2004-04-19 devnull {
16 0a61c07d 2004-04-19 devnull _stk(labpc(l), labsp(l), 0, 0);
17 0a61c07d 2004-04-19 devnull }
18 0a61c07d 2004-04-19 devnull
19 0a61c07d 2004-04-19 devnull defn lablstk(l)
20 0a61c07d 2004-04-19 devnull {
21 0a61c07d 2004-04-19 devnull _stk(labpc(l), labsp(l), 0, 1);
22 0a61c07d 2004-04-19 devnull }
23 0a61c07d 2004-04-19 devnull
24 0a61c07d 2004-04-19 devnull defn altfmt(A){
25 0a61c07d 2004-04-19 devnull local i, s, yes;
26 0a61c07d 2004-04-19 devnull complex Alt A;
27 0a61c07d 2004-04-19 devnull
28 0a61c07d 2004-04-19 devnull s = "alt(";
29 0a61c07d 2004-04-19 devnull s = s + "tag(*" + itoa(A.tag, "%x") + "=" + itoa(*A.tag, "%x") + ") ";
30 0a61c07d 2004-04-19 devnull i = 0;
31 0a61c07d 2004-04-19 devnull yes = 0;
32 0a61c07d 2004-04-19 devnull while A.op != CHANEND && A.op != CHANNOBLK do{
33 0a61c07d 2004-04-19 devnull if A.op != CHANNOP then{
34 0a61c07d 2004-04-19 devnull if yes then s = s + " ";
35 0a61c07d 2004-04-19 devnull s = s + itoa(i, "%d");
36 0a61c07d 2004-04-19 devnull s = s + ":";
37 0a61c07d 2004-04-19 devnull if A.op == CHANSND then s = s + "send";
38 0a61c07d 2004-04-19 devnull if A.op == CHANRCV then s = s + "recv";
39 0a61c07d 2004-04-19 devnull s = s + "(channel(";
40 0a61c07d 2004-04-19 devnull s = s + itoa(A.c, "%x");
41 0a61c07d 2004-04-19 devnull s = s + "))";
42 0a61c07d 2004-04-19 devnull yes = 1;
43 0a61c07d 2004-04-19 devnull }
44 0a61c07d 2004-04-19 devnull i = i + 1;
45 0a61c07d 2004-04-19 devnull A = (Alt)(A + sizeofAlt);
46 0a61c07d 2004-04-19 devnull }
47 0a61c07d 2004-04-19 devnull if A.op==CHANNOBLK then{
48 0a61c07d 2004-04-19 devnull if yes then s = s + " ";
49 0a61c07d 2004-04-19 devnull s = s + "noblock";
50 0a61c07d 2004-04-19 devnull }
51 0a61c07d 2004-04-19 devnull s = s + ")";
52 0a61c07d 2004-04-19 devnull return s;
53 0a61c07d 2004-04-19 devnull }
54 0a61c07d 2004-04-19 devnull
55 0a61c07d 2004-04-19 devnull defn alt(A){
56 0a61c07d 2004-04-19 devnull print(altfmt(A), "\n");
57 0a61c07d 2004-04-19 devnull }
58 0a61c07d 2004-04-19 devnull
59 0a61c07d 2004-04-19 devnull threadignsrc = {
60 0a61c07d 2004-04-19 devnull "^/sys/src/libc",
61 0a61c07d 2004-04-19 devnull "^/sys/src/libthread",
62 0a61c07d 2004-04-19 devnull };
63 0a61c07d 2004-04-19 devnull
64 0a61c07d 2004-04-19 devnull defn fnname(a){
65 0a61c07d 2004-04-19 devnull local sym, s;
66 0a61c07d 2004-04-19 devnull
67 0a61c07d 2004-04-19 devnull s = symbols;
68 0a61c07d 2004-04-19 devnull while s do {
69 0a61c07d 2004-04-19 devnull sym = head s;
70 0a61c07d 2004-04-19 devnull if sym[2] == a then
71 0a61c07d 2004-04-19 devnull return sym[0];
72 0a61c07d 2004-04-19 devnull s = tail s;
73 0a61c07d 2004-04-19 devnull }
74 0a61c07d 2004-04-19 devnull return itoa(a, "%x");
75 0a61c07d 2004-04-19 devnull }
76 0a61c07d 2004-04-19 devnull
77 0a61c07d 2004-04-19 devnull stkignorelist = {};
78 0a61c07d 2004-04-19 devnull
79 0a61c07d 2004-04-19 devnull defn stkignore(s){
80 0a61c07d 2004-04-19 devnull append stkignorelist, s;
81 0a61c07d 2004-04-19 devnull }
82 0a61c07d 2004-04-19 devnull
83 0a61c07d 2004-04-19 devnull defn threadstkline(T){
84 0a61c07d 2004-04-19 devnull local stk, frame, pc, pc0, file, lastpc0, s, sym, i, stop;
85 0a61c07d 2004-04-19 devnull
86 0a61c07d 2004-04-19 devnull if T.state == Running then{
87 0a61c07d 2004-04-19 devnull pc = *PC;
88 0a61c07d 2004-04-19 devnull stk = strace(*PC, *SP, linkreg(0));
89 0a61c07d 2004-04-19 devnull }else{
90 0a61c07d 2004-04-19 devnull pc = labpc(T.sched);
91 0a61c07d 2004-04-19 devnull stk = strace(labpc(T.sched), labsp(T.sched), 0);
92 0a61c07d 2004-04-19 devnull }
93 0a61c07d 2004-04-19 devnull lastpc0 = 0;
94 0a61c07d 2004-04-19 devnull pc0 = 0;
95 0a61c07d 2004-04-19 devnull stop = 0;
96 0a61c07d 2004-04-19 devnull while stk && !stop do {
97 0a61c07d 2004-04-19 devnull file = pcfile(pc);
98 0a61c07d 2004-04-19 devnull if !regexp("^/sys/src/libc/", file)
99 0a61c07d 2004-04-19 devnull && !regexp("^/sys/src/libthread/", file)
100 0a61c07d 2004-04-19 devnull && match(file, stkignore)==-1 then
101 0a61c07d 2004-04-19 devnull stop = 1;
102 0a61c07d 2004-04-19 devnull else{
103 0a61c07d 2004-04-19 devnull lastpc0 = pc0;
104 0a61c07d 2004-04-19 devnull frame = head stk;
105 0a61c07d 2004-04-19 devnull stk = tail stk;
106 0a61c07d 2004-04-19 devnull nextframe = head stk;
107 0a61c07d 2004-04-19 devnull pc = frame[1];
108 0a61c07d 2004-04-19 devnull pc0 = nextframe[0];
109 0a61c07d 2004-04-19 devnull }
110 0a61c07d 2004-04-19 devnull }
111 0a61c07d 2004-04-19 devnull file = pcfile(pc);
112 0a61c07d 2004-04-19 devnull s = file+":"+itoa(pcline(pc), "%d");
113 0a61c07d 2004-04-19 devnull if pc0 != 0 then
114 0a61c07d 2004-04-19 devnull s = s + " "+fnname(pc0);
115 0a61c07d 2004-04-19 devnull return s;
116 0a61c07d 2004-04-19 devnull }
117 0a61c07d 2004-04-19 devnull
118 0a61c07d 2004-04-19 devnull defn threadfmt(T){
119 0a61c07d 2004-04-19 devnull complex Thread T;
120 0a61c07d 2004-04-19 devnull local A, yes, i, P, s;
121 0a61c07d 2004-04-19 devnull
122 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
123 0a61c07d 2004-04-19 devnull s = "t=(Thread)"+itoa(T, "%-10x")+" ";
124 0a61c07d 2004-04-19 devnull
125 0a61c07d 2004-04-19 devnull if T.state == Running then
126 0a61c07d 2004-04-19 devnull s = s + "Running ";
127 0a61c07d 2004-04-19 devnull else if T.state == Ready then
128 0a61c07d 2004-04-19 devnull s = s + "Ready ";
129 0a61c07d 2004-04-19 devnull else if T.state == Rendezvous then
130 0a61c07d 2004-04-19 devnull s = s + "Rendez ";
131 0a61c07d 2004-04-19 devnull else
132 0a61c07d 2004-04-19 devnull s = s + "Bad state "+itoa(T.state, "%x")+" ";
133 0a61c07d 2004-04-19 devnull
134 0a61c07d 2004-04-19 devnull A = (Alt)T.alt;
135 0a61c07d 2004-04-19 devnull if 1 then
136 0a61c07d 2004-04-19 devnull s = s + threadstkline(T);
137 0a61c07d 2004-04-19 devnull else if T.chan == Chanalt then
138 0a61c07d 2004-04-19 devnull s = s + altfmt(T.alt);
139 0a61c07d 2004-04-19 devnull else if T.chan == Chansend then
140 0a61c07d 2004-04-19 devnull s = s + "send(Channel("+itoa(A.c, "%x")+"))";
141 0a61c07d 2004-04-19 devnull else if T.chan == Chanrecv then
142 0a61c07d 2004-04-19 devnull s = s + "recv(Channel("+itoa(A.c, "%x")+"))";
143 0a61c07d 2004-04-19 devnull else
144 0a61c07d 2004-04-19 devnull s = s + threadstkline(T);
145 0a61c07d 2004-04-19 devnull
146 0a61c07d 2004-04-19 devnull if T.moribund == 1 then
147 0a61c07d 2004-04-19 devnull s = s + " Moribund";
148 0a61c07d 2004-04-19 devnull if T.cmdname != 0 then
149 0a61c07d 2004-04-19 devnull s = s + " ["+*(T.cmdname\s)+"]";
150 0a61c07d 2004-04-19 devnull return s;
151 0a61c07d 2004-04-19 devnull }
152 0a61c07d 2004-04-19 devnull
153 0a61c07d 2004-04-19 devnull defn thread(T){
154 0a61c07d 2004-04-19 devnull print(threadfmt(T), "\n");
155 0a61c07d 2004-04-19 devnull }
156 0a61c07d 2004-04-19 devnull
157 0a61c07d 2004-04-19 devnull defn pthreads(P){
158 0a61c07d 2004-04-19 devnull complex Proc P;
159 0a61c07d 2004-04-19 devnull local T, Tq, mainpid;
160 0a61c07d 2004-04-19 devnull
161 0a61c07d 2004-04-19 devnull mainpid = pid;
162 0a61c07d 2004-04-19 devnull setproc(P.pid);
163 0a61c07d 2004-04-19 devnull Tq = (Tqueue)P.threads;
164 0a61c07d 2004-04-19 devnull T = (Thread)Tq.$head;
165 0a61c07d 2004-04-19 devnull while T != 0 do{
166 0a61c07d 2004-04-19 devnull print("\t");
167 0a61c07d 2004-04-19 devnull thread(T);
168 0a61c07d 2004-04-19 devnull T = T.nextt;
169 0a61c07d 2004-04-19 devnull }
170 0a61c07d 2004-04-19 devnull setproc(mainpid);
171 0a61c07d 2004-04-19 devnull }
172 0a61c07d 2004-04-19 devnull
173 0a61c07d 2004-04-19 devnull defn threads(){
174 0a61c07d 2004-04-19 devnull local P;
175 0a61c07d 2004-04-19 devnull
176 0a61c07d 2004-04-19 devnull P = (Proc)_threadpq.$head;
177 0a61c07d 2004-04-19 devnull while P != 0 do{
178 0a61c07d 2004-04-19 devnull if P != (Proc)_threadpq.$head then print("\n");
179 0a61c07d 2004-04-19 devnull lproc(P);
180 0a61c07d 2004-04-19 devnull P = P.next;
181 0a61c07d 2004-04-19 devnull }
182 0a61c07d 2004-04-19 devnull }
183 0a61c07d 2004-04-19 devnull
184 0a61c07d 2004-04-19 devnull defn stacks(){
185 0a61c07d 2004-04-19 devnull local P, mainpid;
186 0a61c07d 2004-04-19 devnull
187 0a61c07d 2004-04-19 devnull mainpid = pid;
188 0a61c07d 2004-04-19 devnull P = (Proc)_threadpq.$head;
189 0a61c07d 2004-04-19 devnull while P != 0 do{
190 0a61c07d 2004-04-19 devnull proc(P);
191 0a61c07d 2004-04-19 devnull // setproc(P.pid);
192 0a61c07d 2004-04-19 devnull // if P.thread==0 then{
193 0a61c07d 2004-04-19 devnull // print("=== thread scheduler stack\n");
194 0a61c07d 2004-04-19 devnull // stk();
195 0a61c07d 2004-04-19 devnull // }
196 0a61c07d 2004-04-19 devnull // print("threadstks(", P\X, ")\n");
197 0a61c07d 2004-04-19 devnull threadstks(P);
198 0a61c07d 2004-04-19 devnull P = P.next;
199 0a61c07d 2004-04-19 devnull print("\n");
200 0a61c07d 2004-04-19 devnull }
201 0a61c07d 2004-04-19 devnull setproc(mainpid);
202 0a61c07d 2004-04-19 devnull }
203 0a61c07d 2004-04-19 devnull
204 0a61c07d 2004-04-19 devnull defn stacksizes(){
205 0a61c07d 2004-04-19 devnull local P, T, Tq, top, sp, mainpid;
206 0a61c07d 2004-04-19 devnull
207 0a61c07d 2004-04-19 devnull mainpid = pid;
208 0a61c07d 2004-04-19 devnull P = (Proc)_threadpq.$head;
209 0a61c07d 2004-04-19 devnull while P != 0 do{
210 0a61c07d 2004-04-19 devnull P = (Proc)P;
211 0a61c07d 2004-04-19 devnull Tq = (Tqueue)P.threads;
212 0a61c07d 2004-04-19 devnull T = (Thread)Tq.$head;
213 0a61c07d 2004-04-19 devnull while T != 0 do{
214 0a61c07d 2004-04-19 devnull top = T.stk+T.stksize;
215 0a61c07d 2004-04-19 devnull if T.state==Running then {
216 0a61c07d 2004-04-19 devnull sp = *SP;
217 0a61c07d 2004-04-19 devnull }else{
218 0a61c07d 2004-04-19 devnull sp = *(T.sched);
219 0a61c07d 2004-04-19 devnull }
220 0a61c07d 2004-04-19 devnull sp = *(T.sched);
221 0a61c07d 2004-04-19 devnull print(top-sp\D, "\n");
222 0a61c07d 2004-04-19 devnull T = T.nextt;
223 0a61c07d 2004-04-19 devnull }
224 0a61c07d 2004-04-19 devnull P = P.next;
225 0a61c07d 2004-04-19 devnull }
226 0a61c07d 2004-04-19 devnull setproc(mainpid);
227 0a61c07d 2004-04-19 devnull }
228 0a61c07d 2004-04-19 devnull
229 0a61c07d 2004-04-19 devnull defn lproc(P){
230 0a61c07d 2004-04-19 devnull proc(P);
231 0a61c07d 2004-04-19 devnull pthreads(P);
232 0a61c07d 2004-04-19 devnull }
233 0a61c07d 2004-04-19 devnull
234 0a61c07d 2004-04-19 devnull defn threadstks(P){
235 0a61c07d 2004-04-19 devnull complex Proc P;
236 0a61c07d 2004-04-19 devnull local T, Tq, mainpid, pref, ign;
237 0a61c07d 2004-04-19 devnull
238 0a61c07d 2004-04-19 devnull mainpid = pid;
239 0a61c07d 2004-04-19 devnull pref = stkprefix;
240 0a61c07d 2004-04-19 devnull stkprefix = pref+"\t\t";
241 0a61c07d 2004-04-19 devnull ign = stkignore;
242 0a61c07d 2004-04-19 devnull stkignore = {
243 0a61c07d 2004-04-19 devnull "^/sys/src/libthread/",
244 0a61c07d 2004-04-19 devnull "^/sys/src/libc/(386|arm|alpha|sparc|power|mips)/"
245 0a61c07d 2004-04-19 devnull };
246 0a61c07d 2004-04-19 devnull setproc(P.pid);
247 0a61c07d 2004-04-19 devnull Tq = (Tqueue)P.threads;
248 0a61c07d 2004-04-19 devnull T = (Thread)Tq.$head;
249 0a61c07d 2004-04-19 devnull while T != 0 do{
250 0a61c07d 2004-04-19 devnull // print("=============================\n");
251 0a61c07d 2004-04-19 devnull // print(" thread(", T\X, ")\n");
252 0a61c07d 2004-04-19 devnull print("\t");
253 0a61c07d 2004-04-19 devnull thread(T);
254 0a61c07d 2004-04-19 devnull threadstk(T);
255 0a61c07d 2004-04-19 devnull T = T.nextt;
256 0a61c07d 2004-04-19 devnull print("\n");
257 0a61c07d 2004-04-19 devnull }
258 0a61c07d 2004-04-19 devnull setproc(mainpid);
259 0a61c07d 2004-04-19 devnull stkprefix = pref;
260 0a61c07d 2004-04-19 devnull stkignore = ign;
261 0a61c07d 2004-04-19 devnull }
262 0a61c07d 2004-04-19 devnull
263 0a61c07d 2004-04-19 devnull defn proc(P){
264 0a61c07d 2004-04-19 devnull complex Proc P;
265 0a61c07d 2004-04-19 devnull
266 0a61c07d 2004-04-19 devnull print("p=(Proc)", itoa(P, "%-10x"), " pid ", P.pid\D, " ");
267 0a61c07d 2004-04-19 devnull if P.thread==0 then
268 0a61c07d 2004-04-19 devnull print(" Sched");
269 0a61c07d 2004-04-19 devnull else
270 0a61c07d 2004-04-19 devnull print(" Running");
271 0a61c07d 2004-04-19 devnull print("\n");
272 0a61c07d 2004-04-19 devnull }
273 0a61c07d 2004-04-19 devnull
274 0a61c07d 2004-04-19 devnull defn procs(){
275 0a61c07d 2004-04-19 devnull local P;
276 0a61c07d 2004-04-19 devnull
277 0a61c07d 2004-04-19 devnull P = (Proc)_threadpq.$head;
278 0a61c07d 2004-04-19 devnull while P != 0 do{
279 0a61c07d 2004-04-19 devnull proc(P);
280 0a61c07d 2004-04-19 devnull P = P.next;
281 0a61c07d 2004-04-19 devnull }
282 0a61c07d 2004-04-19 devnull }
283 0a61c07d 2004-04-19 devnull
284 0a61c07d 2004-04-19 devnull defn threadlstk(T){
285 0a61c07d 2004-04-19 devnull complex Thread T;
286 0a61c07d 2004-04-19 devnull local P, mainpid;
287 0a61c07d 2004-04-19 devnull
288 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
289 0a61c07d 2004-04-19 devnull mainpid = pid;
290 0a61c07d 2004-04-19 devnull setproc(P.pid);
291 0a61c07d 2004-04-19 devnull
292 0a61c07d 2004-04-19 devnull if T.state == Running then{
293 0a61c07d 2004-04-19 devnull lstk();
294 0a61c07d 2004-04-19 devnull } else {
295 0a61c07d 2004-04-19 devnull lablstk(T.sched);
296 0a61c07d 2004-04-19 devnull }
297 0a61c07d 2004-04-19 devnull setproc(mainpid);
298 0a61c07d 2004-04-19 devnull }
299 0a61c07d 2004-04-19 devnull
300 0a61c07d 2004-04-19 devnull defn threadstk(T){
301 0a61c07d 2004-04-19 devnull complex Thread T;
302 0a61c07d 2004-04-19 devnull local P, mainpid;
303 0a61c07d 2004-04-19 devnull
304 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
305 0a61c07d 2004-04-19 devnull mainpid = pid;
306 0a61c07d 2004-04-19 devnull setproc(P.pid);
307 0a61c07d 2004-04-19 devnull
308 0a61c07d 2004-04-19 devnull if T.state == Running then{
309 0a61c07d 2004-04-19 devnull stk();
310 0a61c07d 2004-04-19 devnull } else {
311 0a61c07d 2004-04-19 devnull labstk(T.sched);
312 0a61c07d 2004-04-19 devnull }
313 0a61c07d 2004-04-19 devnull setproc(mainpid);
314 0a61c07d 2004-04-19 devnull }
315 0a61c07d 2004-04-19 devnull
316 0a61c07d 2004-04-19 devnull defn tqueue(Q) {
317 0a61c07d 2004-04-19 devnull complex Tqueue Q;
318 0a61c07d 2004-04-19 devnull
319 0a61c07d 2004-04-19 devnull while Q != 0 do {
320 0a61c07d 2004-04-19 devnull print(Q.$head\X, " ");
321 0a61c07d 2004-04-19 devnull Q = *(Q.$tail);
322 0a61c07d 2004-04-19 devnull
323 0a61c07d 2004-04-19 devnull }
324 0a61c07d 2004-04-19 devnull print("#\n");
325 0a61c07d 2004-04-19 devnull }
326 0a61c07d 2004-04-19 devnull
327 0a61c07d 2004-04-19 devnull defn channel(C) {
328 0a61c07d 2004-04-19 devnull complex Channel C;
329 0a61c07d 2004-04-19 devnull local i, p;
330 0a61c07d 2004-04-19 devnull
331 0a61c07d 2004-04-19 devnull print("channel ", C\X);
332 0a61c07d 2004-04-19 devnull if C.freed then {
333 0a61c07d 2004-04-19 devnull print(" (moribund)");
334 0a61c07d 2004-04-19 devnull }
335 0a61c07d 2004-04-19 devnull print("\n");
336 0a61c07d 2004-04-19 devnull print("\telementsize=", C.e\D, " buffersize=", C.s, "\n");
337 0a61c07d 2004-04-19 devnull if C.s then {
338 0a61c07d 2004-04-19 devnull print("\t", C.n\D, " values in channel:\n");
339 0a61c07d 2004-04-19 devnull print("\t");
340 0a61c07d 2004-04-19 devnull p = C.v+C.e*(C.f%C.s);
341 0a61c07d 2004-04-19 devnull loop 1,C.n do {
342 0a61c07d 2004-04-19 devnull if C.e==4 then {
343 0a61c07d 2004-04-19 devnull print((*p)\X, " ");
344 0a61c07d 2004-04-19 devnull }else {
345 0a61c07d 2004-04-19 devnull print("data(", (*p)\X, ") ");
346 0a61c07d 2004-04-19 devnull }
347 0a61c07d 2004-04-19 devnull p = p+C.e;
348 0a61c07d 2004-04-19 devnull if p == C.v+C.s*C.e then {
349 0a61c07d 2004-04-19 devnull p = C.v;
350 0a61c07d 2004-04-19 devnull }
351 0a61c07d 2004-04-19 devnull }
352 0a61c07d 2004-04-19 devnull }
353 0a61c07d 2004-04-19 devnull print("\n");
354 0a61c07d 2004-04-19 devnull print(C.nentry\D, " queue slots:\n");
355 0a61c07d 2004-04-19 devnull i=0;
356 0a61c07d 2004-04-19 devnull loop 1,C.nentry do {
357 0a61c07d 2004-04-19 devnull if C.qentry[i] then
358 0a61c07d 2004-04-19 devnull print("\t", altfmt(C.qentry[i]), "\n");
359 0a61c07d 2004-04-19 devnull else
360 0a61c07d 2004-04-19 devnull print("\t<empty>\n");
361 0a61c07d 2004-04-19 devnull i=i+1;
362 0a61c07d 2004-04-19 devnull }
363 0a61c07d 2004-04-19 devnull }
364 0a61c07d 2004-04-19 devnull
365 0a61c07d 2004-04-19 devnull print(acidfile);