Blame


1 d89ce51a 2005-02-11 devnull //
2 d89ce51a 2005-02-11 devnull // pthread-specific access functions
3 d89ce51a 2005-02-11 devnull // avoid complicated libthread_db interface
4 d89ce51a 2005-02-11 devnull //
5 0a61c07d 2004-04-19 devnull
6 2a931b72 2005-02-11 devnull include("pthread-"+systype+"-"+objtype);
7 d89ce51a 2005-02-11 devnull
8 d89ce51a 2005-02-11 devnull // pick apart system mcontext_t structures
9 d89ce51a 2005-02-11 devnull defn mcontext(m)
10 0a61c07d 2004-04-19 devnull {
11 d89ce51a 2005-02-11 devnull complex mcontext_t m;
12 7284df18 2004-04-19 devnull
13 d89ce51a 2005-02-11 devnull if systype == "linux" then {
14 d89ce51a 2005-02-11 devnull m = m\X;
15 d89ce51a 2005-02-11 devnull return {"PC", m[14], "SP", m[7], "BP", m[6]};
16 d89ce51a 2005-02-11 devnull } else if systype == "freebsd" then {
17 d89ce51a 2005-02-11 devnull return {"PC", m.mc_eip, "SP", m.mc_esp, "BP", m.mc_ebp};
18 d89ce51a 2005-02-11 devnull } else
19 d89ce51a 2005-02-11 devnull error("do not know how to read mcontext_t on system "+systype);
20 0a61c07d 2004-04-19 devnull }
21 0a61c07d 2004-04-19 devnull
22 d89ce51a 2005-02-11 devnull //
23 d89ce51a 2005-02-11 devnull // plan 9 thread library support
24 d89ce51a 2005-02-11 devnull //
25 d89ce51a 2005-02-11 devnull defn context(c)
26 d89ce51a 2005-02-11 devnull {
27 d89ce51a 2005-02-11 devnull c = (Context)c;
28 d89ce51a 2005-02-11 devnull return mcontext(c.uc.uc_mcontext);
29 d89ce51a 2005-02-11 devnull }
30 7284df18 2004-04-19 devnull
31 d89ce51a 2005-02-11 devnull defn contextstk(c)
32 0a61c07d 2004-04-19 devnull {
33 d89ce51a 2005-02-11 devnull _stk(context(c), 0);
34 0a61c07d 2004-04-19 devnull }
35 0a61c07d 2004-04-19 devnull
36 d89ce51a 2005-02-11 devnull defn contextlstk(c)
37 0a61c07d 2004-04-19 devnull {
38 d89ce51a 2005-02-11 devnull _stk(context(c), 1);
39 0a61c07d 2004-04-19 devnull }
40 0a61c07d 2004-04-19 devnull
41 0a61c07d 2004-04-19 devnull defn altfmt(A){
42 0a61c07d 2004-04-19 devnull local i, s, yes;
43 0a61c07d 2004-04-19 devnull complex Alt A;
44 0a61c07d 2004-04-19 devnull
45 0a61c07d 2004-04-19 devnull s = "alt(";
46 2a931b72 2005-02-11 devnull s = s + "tag(*" + itoa(A.tag, "%#x") + "=" + itoa(*A.tag, "%#x") + ") ";
47 0a61c07d 2004-04-19 devnull i = 0;
48 0a61c07d 2004-04-19 devnull yes = 0;
49 0a61c07d 2004-04-19 devnull while A.op != CHANEND && A.op != CHANNOBLK do{
50 0a61c07d 2004-04-19 devnull if A.op != CHANNOP then{
51 0a61c07d 2004-04-19 devnull if yes then s = s + " ";
52 0a61c07d 2004-04-19 devnull s = s + itoa(i, "%d");
53 0a61c07d 2004-04-19 devnull s = s + ":";
54 0a61c07d 2004-04-19 devnull if A.op == CHANSND then s = s + "send";
55 0a61c07d 2004-04-19 devnull if A.op == CHANRCV then s = s + "recv";
56 0a61c07d 2004-04-19 devnull s = s + "(channel(";
57 2a931b72 2005-02-11 devnull s = s + itoa(A.c, "%#x");
58 0a61c07d 2004-04-19 devnull s = s + "))";
59 0a61c07d 2004-04-19 devnull yes = 1;
60 0a61c07d 2004-04-19 devnull }
61 0a61c07d 2004-04-19 devnull i = i + 1;
62 0a61c07d 2004-04-19 devnull A = (Alt)(A + sizeofAlt);
63 0a61c07d 2004-04-19 devnull }
64 0a61c07d 2004-04-19 devnull if A.op==CHANNOBLK then{
65 0a61c07d 2004-04-19 devnull if yes then s = s + " ";
66 0a61c07d 2004-04-19 devnull s = s + "noblock";
67 0a61c07d 2004-04-19 devnull }
68 0a61c07d 2004-04-19 devnull s = s + ")";
69 0a61c07d 2004-04-19 devnull return s;
70 0a61c07d 2004-04-19 devnull }
71 0a61c07d 2004-04-19 devnull
72 0a61c07d 2004-04-19 devnull defn alt(A){
73 0a61c07d 2004-04-19 devnull print(altfmt(A), "\n");
74 0a61c07d 2004-04-19 devnull }
75 0a61c07d 2004-04-19 devnull
76 d89ce51a 2005-02-11 devnull defn channel(C) {
77 d89ce51a 2005-02-11 devnull complex Channel C;
78 d89ce51a 2005-02-11 devnull local i, p;
79 d89ce51a 2005-02-11 devnull
80 d89ce51a 2005-02-11 devnull print("channel ", C\X, " // ", *(C.name\s));
81 d89ce51a 2005-02-11 devnull if C.freed then {
82 d89ce51a 2005-02-11 devnull print(" (moribund)");
83 d89ce51a 2005-02-11 devnull }
84 d89ce51a 2005-02-11 devnull print("\n");
85 d89ce51a 2005-02-11 devnull print("\telemsize=", C.elemsize\D, " bufsize=", C.bufsize, "\n");
86 d89ce51a 2005-02-11 devnull if C.bufsize then {
87 d89ce51a 2005-02-11 devnull print("\t", C.nbuf\D, " values in channel:\n");
88 d89ce51a 2005-02-11 devnull print("\t");
89 d89ce51a 2005-02-11 devnull p = C.buf+C.off*C.elemsize;
90 d89ce51a 2005-02-11 devnull loop 1,C.nbuf do {
91 d89ce51a 2005-02-11 devnull if C.elemsize==4 then {
92 d89ce51a 2005-02-11 devnull print(*p\X, " ");
93 d89ce51a 2005-02-11 devnull }else {
94 d89ce51a 2005-02-11 devnull print("data(", p\X, ") ");
95 d89ce51a 2005-02-11 devnull }
96 d89ce51a 2005-02-11 devnull p = p+C.elemsize;
97 d89ce51a 2005-02-11 devnull if p == C.buf+C.bufsize*C.elemsize then {
98 d89ce51a 2005-02-11 devnull p = C.buf;
99 d89ce51a 2005-02-11 devnull }
100 d89ce51a 2005-02-11 devnull }
101 d89ce51a 2005-02-11 devnull }
102 d89ce51a 2005-02-11 devnull print("\n");
103 d89ce51a 2005-02-11 devnull print(" senders:\n");
104 d89ce51a 2005-02-11 devnull _altarray(C.asend);
105 d89ce51a 2005-02-11 devnull print(" recvers:\n");
106 d89ce51a 2005-02-11 devnull _altarray(C.arecv);
107 d89ce51a 2005-02-11 devnull }
108 d89ce51a 2005-02-11 devnull
109 d89ce51a 2005-02-11 devnull defn _altarray(aa)
110 d89ce51a 2005-02-11 devnull {
111 d89ce51a 2005-02-11 devnull local i, a, t;
112 d89ce51a 2005-02-11 devnull
113 d89ce51a 2005-02-11 devnull i = 0;
114 d89ce51a 2005-02-11 devnull aa = (_Altarray)aa;
115 d89ce51a 2005-02-11 devnull while i < aa.n do {
116 d89ce51a 2005-02-11 devnull a = (Alt)aa.a[i];
117 d89ce51a 2005-02-11 devnull print("\t"+threadstkline(a.thread)+"\n");
118 d89ce51a 2005-02-11 devnull i++;
119 d89ce51a 2005-02-11 devnull }
120 d89ce51a 2005-02-11 devnull }
121 d89ce51a 2005-02-11 devnull
122 0a61c07d 2004-04-19 devnull defn fnname(a){
123 0a61c07d 2004-04-19 devnull local sym, s;
124 0a61c07d 2004-04-19 devnull
125 0a61c07d 2004-04-19 devnull s = symbols;
126 0a61c07d 2004-04-19 devnull while s do {
127 0a61c07d 2004-04-19 devnull sym = head s;
128 0a61c07d 2004-04-19 devnull if sym[2] == a then
129 0a61c07d 2004-04-19 devnull return sym[0];
130 0a61c07d 2004-04-19 devnull s = tail s;
131 0a61c07d 2004-04-19 devnull }
132 2a931b72 2005-02-11 devnull return itoa(a, "%#x");
133 0a61c07d 2004-04-19 devnull }
134 0a61c07d 2004-04-19 devnull
135 0a61c07d 2004-04-19 devnull stkignorelist = {};
136 0a61c07d 2004-04-19 devnull defn stkignore(s){
137 0a61c07d 2004-04-19 devnull append stkignorelist, s;
138 0a61c07d 2004-04-19 devnull }
139 0a61c07d 2004-04-19 devnull
140 0a61c07d 2004-04-19 devnull defn threadstkline(T){
141 c9896e2e 2004-05-23 devnull local stk, frame, pc, pc0, file, s, sym, i, stop, P, mainpid;
142 0a61c07d 2004-04-19 devnull
143 d89ce51a 2005-02-11 devnull T = (_Thread)T;
144 d89ce51a 2005-02-11 devnull P = (Proc)T.proc;
145 d89ce51a 2005-02-11 devnull if P.thread == T then {
146 c9896e2e 2004-05-23 devnull mainpid = pid;
147 2a931b72 2005-02-11 devnull setproc(pthread2tid(P.osprocid));
148 7284df18 2004-04-19 devnull stk = strace({});
149 d89ce51a 2005-02-11 devnull setproc(mainpid);
150 c9896e2e 2004-05-23 devnull } else
151 d89ce51a 2005-02-11 devnull stk = strace(context(T.context));
152 7284df18 2004-04-19 devnull
153 0a61c07d 2004-04-19 devnull stop = 0;
154 0a61c07d 2004-04-19 devnull while stk && !stop do {
155 7284df18 2004-04-19 devnull frame = head stk;
156 7284df18 2004-04-19 devnull stk = tail stk;
157 7284df18 2004-04-19 devnull pc = frame[2];
158 7284df18 2004-04-19 devnull pc0 = frame[0];
159 0a61c07d 2004-04-19 devnull file = pcfile(pc);
160 2e965b33 2004-05-05 devnull if !regexp("plan9/src/lib9/", file)
161 7284df18 2004-04-19 devnull && !regexp("plan9/src/libthread/", file)
162 d89ce51a 2005-02-11 devnull && file != "?file?"
163 0a61c07d 2004-04-19 devnull && match(file, stkignore)==-1 then
164 0a61c07d 2004-04-19 devnull stop = 1;
165 0a61c07d 2004-04-19 devnull }
166 0a61c07d 2004-04-19 devnull file = pcfile(pc);
167 0a61c07d 2004-04-19 devnull s = file+":"+itoa(pcline(pc), "%d");
168 0a61c07d 2004-04-19 devnull if pc0 != 0 then
169 0a61c07d 2004-04-19 devnull s = s + " "+fnname(pc0);
170 0a61c07d 2004-04-19 devnull return s;
171 0a61c07d 2004-04-19 devnull }
172 0a61c07d 2004-04-19 devnull
173 0a61c07d 2004-04-19 devnull defn threadfmt(T){
174 d89ce51a 2005-02-11 devnull complex _Thread T;
175 d89ce51a 2005-02-11 devnull local P, s, name;
176 0a61c07d 2004-04-19 devnull
177 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
178 2a931b72 2005-02-11 devnull s = "t=(_Thread)"+itoa(T, "%#-10x")+" // ";
179 0a61c07d 2004-04-19 devnull
180 d89ce51a 2005-02-11 devnull if P.thread == T then
181 0a61c07d 2004-04-19 devnull s = s + "Running ";
182 0a61c07d 2004-04-19 devnull else
183 d89ce51a 2005-02-11 devnull s = s + "Sleeping ";
184 d89ce51a 2005-02-11 devnull s = s + threadstkline(T);
185 0a61c07d 2004-04-19 devnull
186 d89ce51a 2005-02-11 devnull name = T+392; // T+offsetof(_Thread, name);
187 d89ce51a 2005-02-11 devnull if *(name\b) != 0 then
188 d89ce51a 2005-02-11 devnull s = s + " ["+*(name\s)+"]";
189 0a61c07d 2004-04-19 devnull return s;
190 0a61c07d 2004-04-19 devnull }
191 0a61c07d 2004-04-19 devnull
192 0a61c07d 2004-04-19 devnull defn thread(T){
193 0a61c07d 2004-04-19 devnull print(threadfmt(T), "\n");
194 0a61c07d 2004-04-19 devnull }
195 0a61c07d 2004-04-19 devnull
196 d89ce51a 2005-02-11 devnull defn procthreads(P){
197 0a61c07d 2004-04-19 devnull complex Proc P;
198 d89ce51a 2005-02-11 devnull local T;
199 0a61c07d 2004-04-19 devnull
200 d89ce51a 2005-02-11 devnull T = (_Thread)P.allthreads.$head;
201 0a61c07d 2004-04-19 devnull while T != 0 do{
202 0a61c07d 2004-04-19 devnull print("\t");
203 0a61c07d 2004-04-19 devnull thread(T);
204 d89ce51a 2005-02-11 devnull T = (_Thread)T.allnext;
205 0a61c07d 2004-04-19 devnull }
206 0a61c07d 2004-04-19 devnull }
207 0a61c07d 2004-04-19 devnull
208 d89ce51a 2005-02-11 devnull defn prociter(x) {
209 0a61c07d 2004-04-19 devnull local P;
210 c73e7cf5 2004-04-20 devnull
211 d89ce51a 2005-02-11 devnull P = (Proc)*_threadprocs;
212 0a61c07d 2004-04-19 devnull while P != 0 do{
213 d89ce51a 2005-02-11 devnull if P != (Proc)*_threadprocs then print("\n");
214 d89ce51a 2005-02-11 devnull proc(P);
215 d89ce51a 2005-02-11 devnull if x == 1 then
216 d89ce51a 2005-02-11 devnull procthreads(P);
217 d89ce51a 2005-02-11 devnull if x == 2 then
218 d89ce51a 2005-02-11 devnull threadstks(P);
219 c73e7cf5 2004-04-20 devnull P = (Proc)P.next;
220 0a61c07d 2004-04-19 devnull }
221 0a61c07d 2004-04-19 devnull }
222 0a61c07d 2004-04-19 devnull
223 d89ce51a 2005-02-11 devnull defn procs() {
224 d89ce51a 2005-02-11 devnull prociter(0);
225 0a61c07d 2004-04-19 devnull }
226 0a61c07d 2004-04-19 devnull
227 d89ce51a 2005-02-11 devnull defn threads() {
228 d89ce51a 2005-02-11 devnull prociter(1);
229 0a61c07d 2004-04-19 devnull }
230 0a61c07d 2004-04-19 devnull
231 d89ce51a 2005-02-11 devnull defn stacks() {
232 d89ce51a 2005-02-11 devnull prociter(2);
233 0a61c07d 2004-04-19 devnull }
234 0a61c07d 2004-04-19 devnull
235 c73e7cf5 2004-04-20 devnull threadstkignore = {
236 c73e7cf5 2004-04-20 devnull "plan9/src/libthread/",
237 2e965b33 2004-05-05 devnull "plan9/src/lib9/",
238 2e965b33 2004-05-05 devnull "plan9/src/lib9/(fmt|utf)/",
239 c73e7cf5 2004-04-20 devnull };
240 0a61c07d 2004-04-19 devnull defn threadstks(P){
241 0a61c07d 2004-04-19 devnull complex Proc P;
242 d89ce51a 2005-02-11 devnull local T, mainpid, pref, ign;
243 0a61c07d 2004-04-19 devnull
244 0a61c07d 2004-04-19 devnull pref = stkprefix;
245 0a61c07d 2004-04-19 devnull stkprefix = pref+"\t\t";
246 0a61c07d 2004-04-19 devnull ign = stkignore;
247 c73e7cf5 2004-04-20 devnull stkignore = threadstkignore;
248 d89ce51a 2005-02-11 devnull T = (_Thread)P.allthreads.$head;
249 0a61c07d 2004-04-19 devnull while T != 0 do{
250 0a61c07d 2004-04-19 devnull print("\t");
251 0a61c07d 2004-04-19 devnull thread(T);
252 0a61c07d 2004-04-19 devnull threadstk(T);
253 d89ce51a 2005-02-11 devnull T = (_Thread)T.allnext;
254 0a61c07d 2004-04-19 devnull print("\n");
255 0a61c07d 2004-04-19 devnull }
256 0a61c07d 2004-04-19 devnull stkprefix = pref;
257 0a61c07d 2004-04-19 devnull stkignore = ign;
258 0a61c07d 2004-04-19 devnull }
259 0a61c07d 2004-04-19 devnull
260 0a61c07d 2004-04-19 devnull defn proc(P){
261 0a61c07d 2004-04-19 devnull complex Proc P;
262 0a61c07d 2004-04-19 devnull
263 2a931b72 2005-02-11 devnull print("p=(Proc)", itoa(P, "%#-10x"), " // pthread ", P.osprocid\X, " pid ", pthread2tid(P.osprocid)\D, " ");
264 0a61c07d 2004-04-19 devnull if P.thread==0 then
265 0a61c07d 2004-04-19 devnull print(" Sched");
266 0a61c07d 2004-04-19 devnull else
267 0a61c07d 2004-04-19 devnull print(" Running");
268 0a61c07d 2004-04-19 devnull print("\n");
269 0a61c07d 2004-04-19 devnull }
270 0a61c07d 2004-04-19 devnull
271 0a61c07d 2004-04-19 devnull defn threadlstk(T){
272 d89ce51a 2005-02-11 devnull complex _Thread T;
273 0a61c07d 2004-04-19 devnull local P, mainpid;
274 0a61c07d 2004-04-19 devnull
275 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
276 d89ce51a 2005-02-11 devnull mainpid = pid;
277 2a931b72 2005-02-11 devnull setproc(pthread2tid(P.osprocid));
278 0a61c07d 2004-04-19 devnull
279 d89ce51a 2005-02-11 devnull if P.thread == T then
280 0a61c07d 2004-04-19 devnull lstk();
281 d89ce51a 2005-02-11 devnull else
282 d89ce51a 2005-02-11 devnull contextlstk(T.context);
283 d89ce51a 2005-02-11 devnull setproc(mainpid);
284 0a61c07d 2004-04-19 devnull }
285 0a61c07d 2004-04-19 devnull
286 0a61c07d 2004-04-19 devnull defn threadstk(T){
287 d89ce51a 2005-02-11 devnull complex _Thread T;
288 0a61c07d 2004-04-19 devnull local P, mainpid;
289 0a61c07d 2004-04-19 devnull
290 0a61c07d 2004-04-19 devnull P = (Proc)T.proc;
291 0a61c07d 2004-04-19 devnull mainpid = pid;
292 2a931b72 2005-02-11 devnull setproc(pthread2tid(P.osprocid));
293 0a61c07d 2004-04-19 devnull
294 d89ce51a 2005-02-11 devnull if P.thread == T then
295 0a61c07d 2004-04-19 devnull stk();
296 d89ce51a 2005-02-11 devnull else
297 d89ce51a 2005-02-11 devnull contextstk(T.context);
298 0a61c07d 2004-04-19 devnull
299 d89ce51a 2005-02-11 devnull setproc(mainpid);
300 0a61c07d 2004-04-19 devnull }
301 0a61c07d 2004-04-19 devnull
302 0a61c07d 2004-04-19 devnull print(acidfile);