henesyinit from p9f0ed2a895 years agoHistory
189 lines · 2.9 KB · Text
RawDownload
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");