| // support for acme; acid must be run with /acme/acid/$cputype/Acid | 
 |  | 
 |  | 
 | defn w(*code) | 
 | { | 
 | 	local dir; | 
 |  | 
 | 	printto("/tmp/acme.acid", eval code); | 
 | 	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-stk'("+itoa(pid)+")'"); | 
 | } | 
 |  | 
 | defn procstk(pid, name) | 
 | { | 
 | 	local dir; | 
 |  | 
 | 	printto("/tmp/acme.acid", stk()); | 
 | 	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-'"+name+"("+itoa(pid)+")'"); | 
 | } | 
 |  | 
 | defn taskstk(tid, name) | 
 | { | 
 | 	local dir; | 
 |  | 
 | 	printto("/tmp/acme.acid", threadstk(tid)); | 
 | 	rc("cat /tmp/acme.acid | wnew -d "+"Acid/-"+name+"'("+itoa(pid)+")'"); | 
 | } | 
 |  | 
 | defn _stk(pc, sp, link, dolocals) | 
 | { | 
 | 	local stk; | 
 |  | 
 | 	print("At pc:", pc, ":", fmt(pc, 'a'), " "); | 
 | 	pfl(pc); | 
 |  | 
 | 	stk = strace(pc, sp, link); | 
 |  | 
 | 	while stk do { | 
 | 		frame = head stk; | 
 | 		print(fmt(frame[0], 'a'), "("); | 
 | 		params(frame[2], frame[0]); | 
 | 		print(") "); | 
 | 		print("\n\tcalled from ", fmt(frame[1], 'a'), " "); | 
 | 		pfl(frame[1]); | 
 | 		stk = tail stk; | 
 | 		if dolocals then | 
 | 			locals(frame[3], frame[0]); | 
 | 	} | 
 | } | 
 |  | 
 | //defn _stk(pc, sp, dolocals) | 
 | //{ | 
 | //	w(__stk(pc, sp, dolocals)); | 
 | //} | 
 |  | 
 |  | 
 | defn params(param, name) | 
 | { | 
 | 	while param do { | 
 | 		sym = head param; | 
 | 		print("*", fmt(name, 'a'), ":", sym[0], "=", sym[1]); | 
 | 		param = tail param; | 
 | 		if param then | 
 | 			print (","); | 
 | 	}	 | 
 | } | 
 |  | 
 | defn locals(l, name) | 
 | { | 
 | 	local sym; | 
 |  | 
 | 	while l do { | 
 | 		sym = head l; | 
 | 		print("\t*", fmt(name, 'a'), ":", sym[0], "=", sym[1], "\n"); | 
 | 		l = tail l; | 
 | 	}	 | 
 | } | 
 |  | 
 | defn bptab()					// print a table of breakpoints | 
 | { | 
 | 	local lst, addr; | 
 |  | 
 | 	lst = bplist; | 
 | 	while lst do { | 
 | 		addr = head lst; | 
 | 		print("\tbpdel(", fmt(addr, 'a'), ")\n"); | 
 | 		lst = tail lst; | 
 | 	} | 
 | } | 
 |  | 
 | defn procs()			// print status of processes | 
 | { | 
 | 	local c, lst, cpid; | 
 |  | 
 | 	cpid = pid; | 
 | 	lst = proclist; | 
 | 	while lst do { | 
 | 		np = head lst; | 
 | 		setproc(np); | 
 | 		if np == cpid then | 
 | 			print(">"); | 
 | 		print("\t", "setproc(", np, ")\t", status(np), " at ", fmt(*PC, 'a'), "\n"); | 
 | 		lst = tail lst; | 
 | 	} | 
 | 	pid = cpid; | 
 | 	if pid != 0 then | 
 | 		setproc(pid); | 
 | } | 
 |  | 
 | defn allstacks()			// print stacks of processes and threads | 
 | { | 
 | 	complex Proc P; | 
 | 	local T, Tq; | 
 | 	local c, lst, cpid; | 
 |  | 
 | 	cpid = pid; | 
 | 	P = (Proc)pq.$head; | 
 | 	while P != 0 do{ | 
 | 		Tq = (Tqueue)P.threads; | 
 | 		T = (Thread)Tq.$head; | 
 | 		setproc(P.pid); | 
 | 		while T != 0 do{ | 
 | 			if(T.cmdname == 0) then taskstk(T, "unknown"); | 
 | 			else taskstk(T, *(T.cmdname\s)); | 
 | 			T = T.nextt; | 
 | 		} | 
 | 		P = P.next; | 
 | 	} | 
 | 	pid = cpid; | 
 | 	if pid != 0 then | 
 | 		setproc(pid); | 
 | } | 
 |  | 
 | print(acidfile); |