include("/sys/src/libthread/syms."+objtype); defn labstk(l) { if objtype == "386" then _stk(longjmp, *l, linkreg(0), 0); else _stk(*(l+4), *l, linkreg(0), 0); } defn lablstk(l) { if objtype == "386" then _stk(longjmp, *l, linkreg(0), 1); else _stk(*(l+4), *l, linkreg(0), 1); } defn thread(T){ complex Thread T; local A, yes, i, P; P = (Proc)T.proc; if T.cmdname != 0 then{ print(" ", *(T.cmdname\s), ":\n"); } print(" ", T\X, " ", T.id); if T.state == Running then{ print(" Running "); } else if T.state == Runnable then{ print(" Runnable "); } else if T.state == Rendezvous then{ if T.call == Callalt then{ print(" alt("); A = (Alt)T.alt; i = 0; yes = 0; while A.op != 0 do{ if A.op != 3 then{ if yes then print(", "); print(i\D); if A.op == 1 then print("S"); if A.op == 2 then print("R"); if A.op == 3 then print("-"); else print("/channel(", A.c\X, ")"); yes = 1; } i = i + 1; A = (Alt)(A + sizeofAlt); } print(")"); } else if T.call == Callsnd then{ A = (Alt)T.alt; print(" send(Channel(", A.c\X, "))"); } else if T.call == Callrcv then{ A = (Alt)T.alt; print(" recv(Channel(", A.c\X, "))"); } } else { print(" Bad State: ", T.state\X); } if T.exiting == 1 then{ print(" (Exiting)"); } print("\n"); } defn pthreads(P){ complex Proc P; local T, Tq; mainpid = pid; setproc(P.pid); Tq = (Tqueue)P.threads; T = (Thread)Tq.$head; while T != 0 do{ thread(T); T = T.nextt; } setproc(mainpid); } defn threads(){ local P; P = (Proc)pq.$head; while P != 0 do{ if P != (Proc)pq.$head then print("\n"); lproc(P); P = P.next; } } defn stacks(){ local P; P = (Proc)pq.$head; while P != 0 do{ print("=========================================================\n"); proc(P); threadstks(P); P = P.next; } } defn lproc(P){ proc(P); pthreads(P); } defn threadstks(P){ complex Proc P; local T, Tq; mainpid = pid; setproc(P.pid); Tq = (Tqueue)P.threads; T = (Thread)Tq.$head; while T != 0 do{ print("=============================\n"); thread(T); print("\n"); threadstk(T); T = T.nextt; } setproc(mainpid); } defn proc(P){ complex Proc P; print("Proc *p=", P\X, ", p->pid=", P.pid\D); if P.blocked then{ print(", p->state=Rendez, p->tag=", P\X); }else{ print(", p->state=Running"); } print("\n"); } defn procs(){ local P; P = (Proc)pq.$head; while P != 0 do{ proc(P); P = P.next; } } defn threadlstk(T){ complex Thread T; local P, mainpid; P = (Proc)T.proc; mainpid = pid; setproc(P.pid); if T.state == Running then{ lstk(); } else { lablstk(T.env); } setproc(mainpid); } defn threadstk(T){ complex Thread T; local P, mainpid; P = (Proc)T.proc; mainpid = pid; setproc(P.pid); if T.state == Running then{ stk(); } else { labstk(T.env); } setproc(mainpid); } defn channel(C) { complex Channel C; Channel(C); } print("/sys/lib/acid/thread");