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 -
            2025, 
            All Rights Reserved