1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #ifndef _THREAD_DB_H
21: #define _THREAD_DB_H 1
22:
23:
24:
25:
26: #include <pthread.h>
27: #include <stdint.h>
28: #include <sys/types.h>
29: #include <sys/procfs.h>
30:
31:
32:
33: typedef enum
34: {
35: TD_OK,
36: TD_ERR,
37: TD_NOTHR,
38: TD_NOSV,
39: TD_NOLWP,
40: TD_BADPH,
41: TD_BADTH,
42: TD_BADSH,
43: TD_BADTA,
44: TD_BADKEY,
45: TD_NOMSG,
46: TD_NOFPREGS,
47: TD_NOLIBTHREAD,
48: TD_NOEVENT,
49: TD_NOCAPAB,
50: TD_DBERR,
51: TD_NOAPLIC,
52: TD_NOTSD,
53: TD_MALLOC,
54: TD_PARTIALREG,
55: TD_NOXREGS,
56: TD_TLSDEFER,
57: TD_NOTALLOC = TD_TLSDEFER,
58: TD_VERSION,
59: TD_NOTLS
60: } td_err_e;
61:
62:
63:
64:
65: typedef enum
66: {
67: TD_THR_ANY_STATE,
68: TD_THR_UNKNOWN,
69: TD_THR_STOPPED,
70: TD_THR_RUN,
71: TD_THR_ACTIVE,
72: TD_THR_ZOMBIE,
73: TD_THR_SLEEP,
74: TD_THR_STOPPED_ASLEEP
75: } td_thr_state_e;
76:
77:
78:
79: typedef enum
80: {
81: TD_THR_ANY_TYPE,
82: TD_THR_USER,
83: TD_THR_SYSTEM
84: } td_thr_type_e;
85:
86:
87:
88:
89:
90: typedef struct td_thragent td_thragent_t;
91:
92:
93: typedef struct td_thrhandle
94: {
95: td_thragent_t *th_ta_p;
96: psaddr_t th_unique;
97: } td_thrhandle_t;
98:
99:
100:
101: struct link_map;
102:
103:
104:
105: #define TD_THR_ANY_USER_FLAGS 0xffffffff
106: #define TD_THR_LOWEST_PRIORITY -20
107: #define TD_SIGNO_MASK NULL
108:
109:
110: #define TD_EVENTSIZE 2
111: #define BT_UISHIFT 5
112: #define BT_NBIPUI (1 << BT_UISHIFT)
113: #define BT_UIMASK (BT_NBIPUI - 1)
114:
115:
116: typedef struct td_thr_events
117: {
118: uint32_t event_bits[TD_EVENTSIZE];
119: } td_thr_events_t;
120:
121:
122: #define __td_eventmask(n) \
123: (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
124: #define __td_eventword(n) \
125: ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
126:
127: #define td_event_emptyset(setp) \
128: do { \
129: int __i; \
130: for (__i = TD_EVENTSIZE; __i > 0; --__i) \
131: (setp)->event_bits[__i - 1] = 0; \
132: } while (0)
133:
134: #define td_event_fillset(setp) \
135: do { \
136: int __i; \
137: for (__i = TD_EVENTSIZE; __i > 0; --__i) \
138: (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff); \
139: } while (0)
140:
141: #define td_event_addset(setp, n) \
142: (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
143: #define td_event_delset(setp, n) \
144: (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
145: #define td_eventismember(setp, n) \
146: (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
147: #if TD_EVENTSIZE == 2
148: # define td_eventisempty(setp) \
149: (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
150: #else
151: # error "td_eventisempty must be changed to match TD_EVENTSIZE"
152: #endif
153:
154:
155: typedef enum
156: {
157: TD_ALL_EVENTS,
158: TD_EVENT_NONE = TD_ALL_EVENTS,
159: TD_READY,
160: TD_SLEEP,
161: TD_SWITCHTO,
162: TD_SWITCHFROM,
163: TD_LOCK_TRY,
164: TD_CATCHSIG,
165: TD_IDLE,
166: TD_CREATE,
167: TD_DEATH,
168: TD_PREEMPT,
169: TD_PRI_INHERIT,
170: TD_REAP,
171: TD_CONCURRENCY,
172: TD_TIMEOUT,
173: TD_MIN_EVENT_NUM = TD_READY,
174: TD_MAX_EVENT_NUM = TD_TIMEOUT,
175: TD_EVENTS_ENABLE = 31
176: } td_event_e;
177:
178:
179: typedef enum
180: {
181: NOTIFY_BPT,
182: NOTIFY_AUTOBPT,
183:
184: NOTIFY_SYSCALL
185: } td_notify_e;
186:
187:
188: typedef struct td_notify
189: {
190: td_notify_e type;
191: union
192: {
193: psaddr_t bptaddr;
194: int syscallno;
195: } u;
196: } td_notify_t;
197:
198:
199: typedef struct td_event_msg
200: {
201: td_event_e event;
202: const td_thrhandle_t *th_p;
203: union
204: {
205: # if 0
206: td_synchandle_t *sh;
207: #endif
208: uintptr_t data;
209: } msg;
210: } td_event_msg_t;
211:
212:
213: typedef struct
214: {
215: td_thr_events_t eventmask;
216: td_event_e eventnum;
217: void *eventdata;
218: } td_eventbuf_t;
219:
220:
221:
222: typedef struct td_ta_stats
223: {
224: int nthreads;
225: int r_concurrency;
226: int nrunnable_num;
227: int nrunnable_den;
228: int a_concurrency_num;
229: int a_concurrency_den;
230: int nlwps_num;
231:
232: int nlwps_den;
233:
234: int nidle_num;
235:
236: int nidle_den;
237:
238: } td_ta_stats_t;
239:
240:
241:
242:
243: typedef pthread_t thread_t;
244: typedef pthread_key_t thread_key_t;
245:
246:
247:
248: typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
249:
250:
251: typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
252:
253:
254:
255:
256: struct ps_prochandle;
257:
258:
259:
260: typedef struct td_thrinfo
261: {
262: td_thragent_t *ti_ta_p;
263: unsigned int ti_user_flags;
264: thread_t ti_tid;
265:
266: char *ti_tls;
267: psaddr_t ti_startfunc;
268:
269: psaddr_t ti_stkbase;
270: long int ti_stksize;
271: psaddr_t ti_ro_area;
272: int ti_ro_size;
273: td_thr_state_e ti_state;
274: unsigned char ti_db_suspended;
275: td_thr_type_e ti_type;
276:
277: intptr_t ti_pc;
278: intptr_t ti_sp;
279: short int ti_flags;
280: int ti_pri;
281: lwpid_t ti_lid;
282: sigset_t ti_sigmask;
283: unsigned char ti_traceme;
284:
285: unsigned char ti_preemptflag;
286: unsigned char ti_pirecflag;
287: sigset_t ti_pending;
288: td_thr_events_t ti_events;
289: } td_thrinfo_t;
290:
291:
292:
293:
294:
295:
296: extern td_err_e td_init (void);
297:
298:
299: extern td_err_e td_log (void);
300:
301:
302: extern const char **td_symbol_list (void);
303:
304:
305: extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
306:
307:
308: extern td_err_e td_ta_delete (td_thragent_t *__ta);
309:
310:
311: extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
312:
313:
314:
315: extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
316: struct ps_prochandle **__ph);
317:
318:
319:
320: extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
321: td_thrhandle_t *__th);
322:
323:
324:
325: extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
326: td_thrhandle_t *__th);
327:
328:
329:
330:
331: extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
332: td_thr_iter_f *__callback, void *__cbdata_p,
333: td_thr_state_e __state, int __ti_pri,
334: sigset_t *__ti_sigmask_p,
335: unsigned int __ti_user_flags);
336:
337:
338: extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
339: void *__p);
340:
341:
342:
343: extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
344: td_event_e __event, td_notify_t *__ptr);
345:
346:
347: extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
348: td_thr_events_t *__event);
349:
350:
351: extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
352: td_thr_events_t *__event);
353:
354:
355: extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
356: td_event_msg_t *__msg);
357:
358:
359:
360: extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
361:
362:
363:
364: extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
365:
366:
367: extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
368:
369:
370: extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
371: td_ta_stats_t *__statsp);
372:
373:
374:
375: extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
376:
377:
378: extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
379: td_thrinfo_t *__infop);
380:
381:
382: extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
383: prfpregset_t *__regset);
384:
385:
386: extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
387: prgregset_t __gregs);
388:
389:
390: extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
391:
392:
393: extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
394:
395:
396: extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
397: const prfpregset_t *__fpregs);
398:
399:
400: extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
401: prgregset_t __gregs);
402:
403:
404: extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
405: const void *__addr);
406:
407:
408:
409: extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
410: unsigned long int __modid,
411: psaddr_t *__base);
412:
413:
414: extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
415: psaddr_t __map_address, size_t __offset,
416: psaddr_t *__address);
417:
418:
419:
420: extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
421:
422:
423: extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
424: td_thr_events_t *__event);
425:
426:
427: extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
428: td_thr_events_t *__event);
429:
430:
431: extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
432: td_event_msg_t *__msg);
433:
434:
435:
436: extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
437:
438:
439:
440: extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
441: unsigned char __n, const sigset_t *__ss);
442:
443:
444: extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
445: const sigset_t *__ss);
446:
447:
448:
449: extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
450: const thread_key_t __tk, void **__data);
451:
452:
453:
454: extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
455:
456:
457: extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
458:
459: #endif