2 0a61c07d 2004-04-19 devnull defn labpc(l)
4 7284df18 2004-04-19 devnull complex Label l;
6 7284df18 2004-04-19 devnull return l.pc;
9 7284df18 2004-04-19 devnull defn label(l)
11 7284df18 2004-04-19 devnull complex Label l;
13 7284df18 2004-04-19 devnull if objtype == "386" then
14 7284df18 2004-04-19 devnull return {"PC", l.pc, "BX", l.bx, "SP", l.sp, "BP", l.bp, "SI", l.si, "DI", l.di};
15 7284df18 2004-04-19 devnull return {};
19 0a61c07d 2004-04-19 devnull defn labstk(l)
21 7284df18 2004-04-19 devnull _stk(label(l), 0);
24 0a61c07d 2004-04-19 devnull defn lablstk(l)
26 7284df18 2004-04-19 devnull _stk(label(l), 1);
29 0a61c07d 2004-04-19 devnull defn altfmt(A){
30 0a61c07d 2004-04-19 devnull local i, s, yes;
31 0a61c07d 2004-04-19 devnull complex Alt A;
33 0a61c07d 2004-04-19 devnull s = "alt(";
34 0a61c07d 2004-04-19 devnull s = s + "tag(*" + itoa(A.tag, "%x") + "=" + itoa(*A.tag, "%x") + ") ";
37 0a61c07d 2004-04-19 devnull while A.op != CHANEND && A.op != CHANNOBLK do{
38 0a61c07d 2004-04-19 devnull if A.op != CHANNOP then{
39 0a61c07d 2004-04-19 devnull if yes then s = s + " ";
40 0a61c07d 2004-04-19 devnull s = s + itoa(i, "%d");
41 0a61c07d 2004-04-19 devnull s = s + ":";
42 0a61c07d 2004-04-19 devnull if A.op == CHANSND then s = s + "send";
43 0a61c07d 2004-04-19 devnull if A.op == CHANRCV then s = s + "recv";
44 0a61c07d 2004-04-19 devnull s = s + "(channel(";
45 0a61c07d 2004-04-19 devnull s = s + itoa(A.c, "%x");
46 0a61c07d 2004-04-19 devnull s = s + "))";
49 0a61c07d 2004-04-19 devnull i = i + 1;
50 0a61c07d 2004-04-19 devnull A = (Alt)(A + sizeofAlt);
52 0a61c07d 2004-04-19 devnull if A.op==CHANNOBLK then{
53 0a61c07d 2004-04-19 devnull if yes then s = s + " ";
54 0a61c07d 2004-04-19 devnull s = s + "noblock";
56 0a61c07d 2004-04-19 devnull s = s + ")";
57 0a61c07d 2004-04-19 devnull return s;
60 0a61c07d 2004-04-19 devnull defn alt(A){
61 0a61c07d 2004-04-19 devnull print(altfmt(A), "\n");
64 0a61c07d 2004-04-19 devnull defn fnname(a){
65 0a61c07d 2004-04-19 devnull local sym, s;
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;
74 0a61c07d 2004-04-19 devnull return itoa(a, "%x");
77 0a61c07d 2004-04-19 devnull stkignorelist = {};
79 0a61c07d 2004-04-19 devnull defn stkignore(s){
80 0a61c07d 2004-04-19 devnull append stkignorelist, s;
83 0a61c07d 2004-04-19 devnull defn threadstkline(T){
84 c9896e2e 2004-05-23 devnull local stk, frame, pc, pc0, file, s, sym, i, stop, P, mainpid;
86 c9896e2e 2004-05-23 devnull if T.state == Running then {
87 c9896e2e 2004-05-23 devnull P = (Proc)T.proc;
88 c9896e2e 2004-05-23 devnull mainpid = pid;
89 c9896e2e 2004-05-23 devnull if mainpid != P.pid then setproc(P.pid);
90 7284df18 2004-04-19 devnull stk = strace({});
91 c9896e2e 2004-05-23 devnull if mainpid != P.pid then setproc(mainpid);
93 7284df18 2004-04-19 devnull stk = strace(label(T.sched));
95 0a61c07d 2004-04-19 devnull stop = 0;
96 0a61c07d 2004-04-19 devnull while stk && !stop do {
97 7284df18 2004-04-19 devnull frame = head stk;
98 7284df18 2004-04-19 devnull stk = tail stk;
99 7284df18 2004-04-19 devnull pc = frame[2];
100 7284df18 2004-04-19 devnull pc0 = frame[0];
101 0a61c07d 2004-04-19 devnull file = pcfile(pc);
102 2e965b33 2004-05-05 devnull if !regexp("plan9/src/lib9/", file)
103 7284df18 2004-04-19 devnull && !regexp("plan9/src/libthread/", file)
104 0a61c07d 2004-04-19 devnull && match(file, stkignore)==-1 then
105 0a61c07d 2004-04-19 devnull stop = 1;
107 0a61c07d 2004-04-19 devnull file = pcfile(pc);
108 0a61c07d 2004-04-19 devnull s = file+":"+itoa(pcline(pc), "%d");
109 0a61c07d 2004-04-19 devnull if pc0 != 0 then
110 0a61c07d 2004-04-19 devnull s = s + " "+fnname(pc0);
111 0a61c07d 2004-04-19 devnull return s;
114 0a61c07d 2004-04-19 devnull defn threadfmt(T){
115 0a61c07d 2004-04-19 devnull complex Thread T;
116 0a61c07d 2004-04-19 devnull local A, yes, i, P, s;
118 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
119 4fbe07e1 2004-09-23 devnull s = "t=(Thread)"+itoa(T, "%-10x")+" // ";
121 0a61c07d 2004-04-19 devnull if T.state == Running then
122 0a61c07d 2004-04-19 devnull s = s + "Running ";
123 0a61c07d 2004-04-19 devnull else if T.state == Ready then
124 0a61c07d 2004-04-19 devnull s = s + "Ready ";
125 0a61c07d 2004-04-19 devnull else if T.state == Rendezvous then
126 0a61c07d 2004-04-19 devnull s = s + "Rendez ";
128 0a61c07d 2004-04-19 devnull s = s + "Bad state "+itoa(T.state, "%x")+" ";
130 0a61c07d 2004-04-19 devnull A = (Alt)T.alt;
131 0a61c07d 2004-04-19 devnull if 1 then
132 0a61c07d 2004-04-19 devnull s = s + threadstkline(T);
133 0a61c07d 2004-04-19 devnull else if T.chan == Chanalt then
134 0a61c07d 2004-04-19 devnull s = s + altfmt(T.alt);
135 0a61c07d 2004-04-19 devnull else if T.chan == Chansend then
136 0a61c07d 2004-04-19 devnull s = s + "send(Channel("+itoa(A.c, "%x")+"))";
137 0a61c07d 2004-04-19 devnull else if T.chan == Chanrecv then
138 0a61c07d 2004-04-19 devnull s = s + "recv(Channel("+itoa(A.c, "%x")+"))";
140 0a61c07d 2004-04-19 devnull s = s + threadstkline(T);
142 0a61c07d 2004-04-19 devnull if T.moribund == 1 then
143 0a61c07d 2004-04-19 devnull s = s + " Moribund";
144 0a61c07d 2004-04-19 devnull if T.cmdname != 0 then
145 0a61c07d 2004-04-19 devnull s = s + " ["+*(T.cmdname\s)+"]";
146 0a61c07d 2004-04-19 devnull return s;
149 0a61c07d 2004-04-19 devnull defn thread(T){
150 0a61c07d 2004-04-19 devnull print(threadfmt(T), "\n");
153 0a61c07d 2004-04-19 devnull defn pthreads(P){
154 0a61c07d 2004-04-19 devnull complex Proc P;
155 0a61c07d 2004-04-19 devnull local T, Tq, mainpid;
157 0a61c07d 2004-04-19 devnull mainpid = pid;
158 0a61c07d 2004-04-19 devnull Tq = (Tqueue)P.threads;
159 0a61c07d 2004-04-19 devnull T = (Thread)Tq.$head;
160 0a61c07d 2004-04-19 devnull while T != 0 do{
161 0a61c07d 2004-04-19 devnull print("\t");
162 0a61c07d 2004-04-19 devnull thread(T);
163 7284df18 2004-04-19 devnull T = (Thread)T.nextt;
167 0a61c07d 2004-04-19 devnull defn threads(){
168 0a61c07d 2004-04-19 devnull local P;
169 7284df18 2004-04-19 devnull complex Pqueue _threadpq;
171 0a61c07d 2004-04-19 devnull P = (Proc)_threadpq.$head;
172 0a61c07d 2004-04-19 devnull while P != 0 do{
173 0a61c07d 2004-04-19 devnull if P != (Proc)_threadpq.$head then print("\n");
174 0a61c07d 2004-04-19 devnull lproc(P);
175 c73e7cf5 2004-04-20 devnull P = (Proc)P.next;
179 0a61c07d 2004-04-19 devnull defn stacks(){
180 0a61c07d 2004-04-19 devnull local P, mainpid;
181 c73e7cf5 2004-04-20 devnull complex Pqueue _threadpq;
183 7284df18 2004-04-19 devnull stkprefix = "";
184 0a61c07d 2004-04-19 devnull mainpid = pid;
185 0a61c07d 2004-04-19 devnull P = (Proc)_threadpq.$head;
186 0a61c07d 2004-04-19 devnull while P != 0 do{
187 0a61c07d 2004-04-19 devnull proc(P);
188 80e841ab 2004-09-17 devnull if mainpid != P.pid then setproc(P.pid);
189 0a61c07d 2004-04-19 devnull // setproc(P.pid);
190 0a61c07d 2004-04-19 devnull // if P.thread==0 then{
191 0a61c07d 2004-04-19 devnull // print("=== thread scheduler stack\n");
192 0a61c07d 2004-04-19 devnull // stk();
194 0a61c07d 2004-04-19 devnull // print("threadstks(", P\X, ")\n");
195 0a61c07d 2004-04-19 devnull threadstks(P);
196 80e841ab 2004-09-17 devnull if mainpid != P.pid then setproc(mainpid);
197 7284df18 2004-04-19 devnull P = (Proc)P.next;
198 0a61c07d 2004-04-19 devnull print("\n");
200 a796abef 2004-05-12 devnull // setproc(mainpid);
203 0a61c07d 2004-04-19 devnull defn stacksizes(){
204 0a61c07d 2004-04-19 devnull local P, T, Tq, top, sp, mainpid;
205 c73e7cf5 2004-04-20 devnull complex Pqueue _threadpq;
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 80e841ab 2004-09-17 devnull if mainpid != P.pid then setproc(P.pid);
212 0a61c07d 2004-04-19 devnull Tq = (Tqueue)P.threads;
213 0a61c07d 2004-04-19 devnull T = (Thread)Tq.$head;
214 0a61c07d 2004-04-19 devnull while T != 0 do{
215 0a61c07d 2004-04-19 devnull top = T.stk+T.stksize;
216 0a61c07d 2004-04-19 devnull if T.state==Running then {
217 0a61c07d 2004-04-19 devnull sp = *SP;
219 80e841ab 2004-09-17 devnull sp = T.sched.sp;
221 80e841ab 2004-09-17 devnull print(top-sp\D, " of ", T.stksize\D, " - 0x", top\X, " 0x", sp\X, " ", *T.stk\X, "\n");
222 7284df18 2004-04-19 devnull T = (Thread)T.nextt;
224 80e841ab 2004-09-17 devnull if mainpid != P.pid then setproc(mainpid);
225 0a61c07d 2004-04-19 devnull P = P.next;
227 a796abef 2004-05-12 devnull // setproc(mainpid);
230 0a61c07d 2004-04-19 devnull defn lproc(P){
231 0a61c07d 2004-04-19 devnull proc(P);
232 0a61c07d 2004-04-19 devnull pthreads(P);
235 c73e7cf5 2004-04-20 devnull threadstkignore = {
236 c73e7cf5 2004-04-20 devnull "plan9/src/libthread/",
237 2e965b33 2004-05-05 devnull "plan9/src/lib9/",
238 2e965b33 2004-05-05 devnull "plan9/src/lib9/(fmt|utf)/",
240 0a61c07d 2004-04-19 devnull defn threadstks(P){
241 0a61c07d 2004-04-19 devnull complex Proc P;
242 0a61c07d 2004-04-19 devnull local T, Tq, mainpid, pref, ign;
244 0a61c07d 2004-04-19 devnull mainpid = pid;
245 0a61c07d 2004-04-19 devnull pref = stkprefix;
246 0a61c07d 2004-04-19 devnull stkprefix = pref+"\t\t";
247 0a61c07d 2004-04-19 devnull ign = stkignore;
248 c73e7cf5 2004-04-20 devnull stkignore = threadstkignore;
249 a796abef 2004-05-12 devnull // setproc(P.pid);
250 0a61c07d 2004-04-19 devnull Tq = (Tqueue)P.threads;
251 0a61c07d 2004-04-19 devnull T = (Thread)Tq.$head;
252 0a61c07d 2004-04-19 devnull while T != 0 do{
253 0a61c07d 2004-04-19 devnull // print("=============================\n");
254 0a61c07d 2004-04-19 devnull // print(" thread(", T\X, ")\n");
255 0a61c07d 2004-04-19 devnull print("\t");
256 0a61c07d 2004-04-19 devnull thread(T);
257 0a61c07d 2004-04-19 devnull threadstk(T);
258 7284df18 2004-04-19 devnull T = (Thread)T.nextt;
259 0a61c07d 2004-04-19 devnull print("\n");
261 a796abef 2004-05-12 devnull // setproc(mainpid);
262 0a61c07d 2004-04-19 devnull stkprefix = pref;
263 0a61c07d 2004-04-19 devnull stkignore = ign;
266 0a61c07d 2004-04-19 devnull defn proc(P){
267 0a61c07d 2004-04-19 devnull complex Proc P;
269 0a61c07d 2004-04-19 devnull print("p=(Proc)", itoa(P, "%-10x"), " pid ", P.pid\D, " ");
270 0a61c07d 2004-04-19 devnull if P.thread==0 then
271 0a61c07d 2004-04-19 devnull print(" Sched");
273 0a61c07d 2004-04-19 devnull print(" Running");
274 0a61c07d 2004-04-19 devnull print("\n");
277 0a61c07d 2004-04-19 devnull defn procs(){
278 0a61c07d 2004-04-19 devnull local P;
279 c73e7cf5 2004-04-20 devnull complex Pqueue _threadpq;
281 0a61c07d 2004-04-19 devnull P = (Proc)_threadpq.$head;
282 0a61c07d 2004-04-19 devnull while P != 0 do{
283 0a61c07d 2004-04-19 devnull proc(P);
284 0a61c07d 2004-04-19 devnull P = P.next;
288 0a61c07d 2004-04-19 devnull defn threadlstk(T){
289 0a61c07d 2004-04-19 devnull complex Thread T;
290 0a61c07d 2004-04-19 devnull local P, mainpid;
292 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
293 a796abef 2004-05-12 devnull // mainpid = pid;
294 a796abef 2004-05-12 devnull // setproc(P.pid);
296 0a61c07d 2004-04-19 devnull if T.state == Running then{
298 0a61c07d 2004-04-19 devnull } else {
299 0a61c07d 2004-04-19 devnull lablstk(T.sched);
301 a796abef 2004-05-12 devnull // setproc(mainpid);
304 0a61c07d 2004-04-19 devnull defn threadstk(T){
305 0a61c07d 2004-04-19 devnull complex Thread T;
306 0a61c07d 2004-04-19 devnull local P, mainpid;
308 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
309 0a61c07d 2004-04-19 devnull mainpid = pid;
310 a796abef 2004-05-12 devnull // setproc(P.pid);
312 0a61c07d 2004-04-19 devnull if T.state == Running then{
313 c9896e2e 2004-05-23 devnull if P.pid != mainpid then
314 c9896e2e 2004-05-23 devnull setproc(P.pid);
316 c9896e2e 2004-05-23 devnull if P.pid != mainpid then
317 c9896e2e 2004-05-23 devnull setproc(mainpid);
318 0a61c07d 2004-04-19 devnull } else {
319 0a61c07d 2004-04-19 devnull labstk(T.sched);
321 a796abef 2004-05-12 devnull // setproc(mainpid);
324 0a61c07d 2004-04-19 devnull defn tqueue(Q) {
325 0a61c07d 2004-04-19 devnull complex Tqueue Q;
327 0a61c07d 2004-04-19 devnull while Q != 0 do {
328 0a61c07d 2004-04-19 devnull print(Q.$head\X, " ");
329 0a61c07d 2004-04-19 devnull Q = *(Q.$tail);
332 0a61c07d 2004-04-19 devnull print("#\n");
335 0a61c07d 2004-04-19 devnull defn channel(C) {
336 0a61c07d 2004-04-19 devnull complex Channel C;
337 0a61c07d 2004-04-19 devnull local i, p;
339 0a61c07d 2004-04-19 devnull print("channel ", C\X);
340 0a61c07d 2004-04-19 devnull if C.freed then {
341 0a61c07d 2004-04-19 devnull print(" (moribund)");
343 0a61c07d 2004-04-19 devnull print("\n");
344 0a61c07d 2004-04-19 devnull print("\telementsize=", C.e\D, " buffersize=", C.s, "\n");
345 0a61c07d 2004-04-19 devnull if C.s then {
346 0a61c07d 2004-04-19 devnull print("\t", C.n\D, " values in channel:\n");
347 0a61c07d 2004-04-19 devnull print("\t");
348 0a61c07d 2004-04-19 devnull p = C.v+C.e*(C.f%C.s);
349 0a61c07d 2004-04-19 devnull loop 1,C.n do {
350 0a61c07d 2004-04-19 devnull if C.e==4 then {
351 0a61c07d 2004-04-19 devnull print((*p)\X, " ");
353 0a61c07d 2004-04-19 devnull print("data(", (*p)\X, ") ");
355 0a61c07d 2004-04-19 devnull p = p+C.e;
356 0a61c07d 2004-04-19 devnull if p == C.v+C.s*C.e then {
357 0a61c07d 2004-04-19 devnull p = C.v;
361 0a61c07d 2004-04-19 devnull print("\n");
362 0a61c07d 2004-04-19 devnull print(C.nentry\D, " queue slots:\n");
364 0a61c07d 2004-04-19 devnull loop 1,C.nentry do {
365 0a61c07d 2004-04-19 devnull if C.qentry[i] then
366 0a61c07d 2004-04-19 devnull print("\t", altfmt(C.qentry[i]), "\n");
368 0a61c07d 2004-04-19 devnull print("\t<empty>\n");
373 c73e7cf5 2004-04-20 devnull defn polling() {
374 c73e7cf5 2004-04-20 devnull local i, c, t, p, pf;
376 c73e7cf5 2004-04-20 devnull p=(Poll)polls; pf=(struct_pollfd)pfd; loop 1,*npoll do {
377 c73e7cf5 2004-04-20 devnull print("\tfd ", pf.fd\D, " ");
378 c73e7cf5 2004-04-20 devnull if pf.events & 1 then
379 c73e7cf5 2004-04-20 devnull print("r");
380 c73e7cf5 2004-04-20 devnull else if pf.events & 2 then
381 c73e7cf5 2004-04-20 devnull print("w");
383 c73e7cf5 2004-04-20 devnull print(pf.events\D);
384 c73e7cf5 2004-04-20 devnull print(" chan Channel(", p.c\X, ")\n");
385 c73e7cf5 2004-04-20 devnull p = (Poll)(p+sizeofPoll);
386 c73e7cf5 2004-04-20 devnull pf = (struct_pollfd)(pf+sizeofstruct_pollfd);
389 c73e7cf5 2004-04-20 devnull c=sleepchan; t=sleeptime; loop 1,*nsleep do {
390 c73e7cf5 2004-04-20 devnull print("\tsleep ", *t\D, " Channel(", *c\X, ")\n");
396 0a61c07d 2004-04-19 devnull print(acidfile);