// runtime library definitions
if objtype=="mips2" then objtype="mips";

include("/sys/src/alef/lib/"+objtype+"/acid");

defn
pchan(addr)
{
	local l, n;

	complex Chan addr;

	if addr.sva then
		print("Sender waiting: buffer ", addr.sva, "\n");
	else
		print("No sender\n");

	if addr.rva then
		print("Receiver waiting: buffer ", addr.rva, "\n");
	else
		print("No receiver\n");

	if addr.async then {
		n = 0;
		l = addr.qh;
		while l do {
			n = n+1;
			l = l.next;
		}
		print("Async channel\n\t", n\D, " messsages queued\n\t");
		l = addr.free;
		while l do {
			n = n+1;
			l = l.next;
		}
		print(n\D, " free buffers\n");
	}
		
	if addr.selt then {
		l = "send";
		if addr.selt then
			l = "receive";
		print("In select ", l, ": task ", addr.selt\X, "\n");
		labstk(addr.selt);
	}
}

defn
tdb()
{
	local ta, tq;

	// Private proc tdb pointer
	ta = *{	0x7fffe000,
		0x0ffdf000,
		0xbfff5000 }[match(objtype, {"mips", "sparc", "386"})];

	complex Tdb ta;

	print("tdb ", ta.ntask, " tasks:");
 	if *ta then
		print("locked\n");
	else
		print("unlocked\n");

	if ta.ctask then {
		print("current task ", ta.ctask, "\n");
		Task(ta.ctask);
	}
	else
		print("proc is idle\n");

	tq = (Task)ta.runhd;
	if tq == 0 then
		return {};

	print("Tasks ready to run:\n");
	while tq != 0 do {
		print("Task(", tq, ")\n");
		tq = tq.link;		
	}
}

defn
lselect(addr)
{
	local c;

	complex Task addr;
	complex Chan c;

	c = addr.slist;
	if c == 0 then {
		print("No select pending\n");
		return {};
	}
	while c do {
		print("pchan(", c\X, ")\n");
		c = c.sellink;
	}
}

defn
pqlock(addr)
{
	local t;

	complex QLock addr;

	if *addr then
		print("QLock is under modification\n");
	if addr.used == 0 then
		return {};

	print("QLock is held\n");
	t = addr.queue;
	complex Task t;
	if t == 0 then {
		print("No tasks waiting\n");
		return {};
	}
	print("Tasks waiting:\n");
	while t do {
		print("Task(", t, ")\n");
		tq = tq.qlink;		
	}
}

srcpath = {
	"./",
	"/sys/src/alef/lib/port/",
	"/sys/src/alef/lib/p9/",
	"/sys/src/alef/lib/"+objtype+"/"
};

defn labstk(l)
{
	if objtype == "386" then
		_stk(ALEF_switch, *l, linkreg(0), 0);
	else
		_stk(*(l+4), *l, linkreg(0), 0);
}

print(acidfile);

include("/sys/src/alef/lib/port/acid."+objtype);
include("/sys/src/alef/lib/p9/acid."+objtype);
