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