// 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);
