thread_db.h
001:
002:
003:
004:
005:
006:
007:
008:
009:
010:
011:
012:
013:
014:
015:
016:
017:
018:
019:
020: #ifndef _THREAD_DB_H
021: #define _THREAD_DB_H 1
022:
023:
024:
025:
026: #include <pthread.h>
027: #include <stdint.h>
028: #include <sys/types.h>
029: #include <sys/procfs.h>
030:
031:
032:
033: typedef enum
034: {
035: TD_OK,
036: TD_ERR,
037: TD_NOTHR,
038: TD_NOSV,
039: TD_NOLWP,
040: TD_BADPH,
041: TD_BADTH,
042: TD_BADSH,
043: TD_BADTA,
044: TD_BADKEY,
045: TD_NOMSG,
046: TD_NOFPREGS,
047: TD_NOLIBTHREAD,
048: TD_NOEVENT,
049: TD_NOCAPAB,
050: TD_DBERR,
051: TD_NOAPLIC,
052: TD_NOTSD,
053: TD_MALLOC,
054: TD_PARTIALREG,
055: TD_NOXREGS,
056: TD_TLSDEFER,
057: TD_NOTALLOC = TD_TLSDEFER,
058: TD_VERSION,
059: TD_NOTLS
060: } td_err_e;
061:
062:
063:
064:
065: typedef enum
066: {
067: TD_THR_ANY_STATE,
068: TD_THR_UNKNOWN,
069: TD_THR_STOPPED,
070: TD_THR_RUN,
071: TD_THR_ACTIVE,
072: TD_THR_ZOMBIE,
073: TD_THR_SLEEP,
074: TD_THR_STOPPED_ASLEEP
075: } td_thr_state_e;
076:
077:
078:
079: typedef enum
080: {
081: TD_THR_ANY_TYPE,
082: TD_THR_USER,
083: TD_THR_SYSTEM
084: } td_thr_type_e;
085:
086:
087:
088:
089:
090: typedef struct td_thragent td_thragent_t;
091:
092:
093: typedef struct td_thrhandle
094: {
095: td_thragent_t *th_ta_p;
096: psaddr_t th_unique;
097: } td_thrhandle_t;
098:
099:
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
460:
© Andrew Scott 2006 -
2024,
All Rights Reserved