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