123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- #ifndef _THREAD_DB_H
- #define _THREAD_DB_H 1
- #include <pthread.h>
- #include <stdint.h>
- #include <sys/types.h>
- #include <sys/procfs.h>
- typedef enum
- {
- TD_OK,
- TD_ERR,
- TD_NOTHR,
- TD_NOSV,
- TD_NOLWP,
- TD_BADPH,
- TD_BADTH,
- TD_BADSH,
- TD_BADTA,
- TD_BADKEY,
- TD_NOMSG,
- TD_NOFPREGS,
- TD_NOLIBTHREAD,
- TD_NOEVENT,
- TD_NOCAPAB,
- TD_DBERR,
- TD_NOAPLIC,
- TD_NOTSD,
- TD_MALLOC,
- TD_PARTIALREG,
- TD_NOXREGS,
- TD_TLSDEFER,
- TD_NOTALLOC = TD_TLSDEFER,
- TD_VERSION,
- TD_NOTLS
- } td_err_e;
- typedef enum
- {
- TD_THR_ANY_STATE,
- TD_THR_UNKNOWN,
- TD_THR_STOPPED,
- TD_THR_RUN,
- TD_THR_ACTIVE,
- TD_THR_ZOMBIE,
- TD_THR_SLEEP,
- TD_THR_STOPPED_ASLEEP
- } td_thr_state_e;
- typedef enum
- {
- TD_THR_ANY_TYPE,
- TD_THR_USER,
- TD_THR_SYSTEM
- } td_thr_type_e;
- typedef struct td_thragent td_thragent_t;
- typedef struct td_thrhandle
- {
- td_thragent_t *th_ta_p;
- psaddr_t th_unique;
- } td_thrhandle_t;
- struct link_map;
- #define TD_THR_ANY_USER_FLAGS 0xffffffff
- #define TD_THR_LOWEST_PRIORITY -20
- #define TD_SIGNO_MASK NULL
- #define TD_EVENTSIZE 2
- #define BT_UISHIFT 5
- #define BT_NBIPUI (1 << BT_UISHIFT)
- #define BT_UIMASK (BT_NBIPUI - 1)
- typedef struct td_thr_events
- {
- uint32_t event_bits[TD_EVENTSIZE];
- } td_thr_events_t;
- #define __td_eventmask(n) \
- (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
- #define __td_eventword(n) \
- ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
- #define td_event_emptyset(setp) \
- do { \
- int __i; \
- for (__i = TD_EVENTSIZE; __i > 0; --__i) \
- (setp)->event_bits[__i - 1] = 0; \
- } while (0)
- #define td_event_fillset(setp) \
- do { \
- int __i; \
- for (__i = TD_EVENTSIZE; __i > 0; --__i) \
- (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff); \
- } while (0)
- #define td_event_addset(setp, n) \
- (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
- #define td_event_delset(setp, n) \
- (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
- #define td_eventismember(setp, n) \
- (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
- #if TD_EVENTSIZE == 2
- # define td_eventisempty(setp) \
- (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
- #else
- # error "td_eventisempty must be changed to match TD_EVENTSIZE"
- #endif
- typedef enum
- {
- TD_ALL_EVENTS,
- TD_EVENT_NONE = TD_ALL_EVENTS,
- TD_READY,
- TD_SLEEP,
- TD_SWITCHTO,
- TD_SWITCHFROM,
- TD_LOCK_TRY,
- TD_CATCHSIG,
- TD_IDLE,
- TD_CREATE,
- TD_DEATH,
- TD_PREEMPT,
- TD_PRI_INHERIT,
- TD_REAP,
- TD_CONCURRENCY,
- TD_TIMEOUT,
- TD_MIN_EVENT_NUM = TD_READY,
- TD_MAX_EVENT_NUM = TD_TIMEOUT,
- TD_EVENTS_ENABLE = 31
- } td_event_e;
- typedef enum
- {
- NOTIFY_BPT,
- NOTIFY_AUTOBPT,
- NOTIFY_SYSCALL
- } td_notify_e;
- typedef struct td_notify
- {
- td_notify_e type;
- union
- {
- psaddr_t bptaddr;
- int syscallno;
- } u;
- } td_notify_t;
- typedef struct td_event_msg
- {
- td_event_e event;
- const td_thrhandle_t *th_p;
- union
- {
- # if 0
- td_synchandle_t *sh;
- #endif
- uintptr_t data;
- } msg;
- } td_event_msg_t;
- typedef struct
- {
- td_thr_events_t eventmask;
- td_event_e eventnum;
- void *eventdata;
- } td_eventbuf_t;
- typedef struct td_ta_stats
- {
- int nthreads;
- int r_concurrency;
- int nrunnable_num;
- int nrunnable_den;
- int a_concurrency_num;
- int a_concurrency_den;
- int nlwps_num;
- int nlwps_den;
- int nidle_num;
- int nidle_den;
- } td_ta_stats_t;
- typedef pthread_t thread_t;
- typedef pthread_key_t thread_key_t;
- typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
- typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
- struct ps_prochandle;
- typedef struct td_thrinfo
- {
- td_thragent_t *ti_ta_p;
- unsigned int ti_user_flags;
- thread_t ti_tid;
- char *ti_tls;
- psaddr_t ti_startfunc;
- psaddr_t ti_stkbase;
- long int ti_stksize;
- psaddr_t ti_ro_area;
- int ti_ro_size;
- td_thr_state_e ti_state;
- unsigned char ti_db_suspended;
- td_thr_type_e ti_type;
- intptr_t ti_pc;
- intptr_t ti_sp;
- short int ti_flags;
- int ti_pri;
- lwpid_t ti_lid;
- sigset_t ti_sigmask;
- unsigned char ti_traceme;
- unsigned char ti_preemptflag;
- unsigned char ti_pirecflag;
- sigset_t ti_pending;
- td_thr_events_t ti_events;
- } td_thrinfo_t;
- extern td_err_e td_init (void);
- extern td_err_e td_log (void);
- extern const char **td_symbol_list (void);
- extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
- extern td_err_e td_ta_delete (td_thragent_t *__ta);
- extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
- extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
- struct ps_prochandle **__ph);
- extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
- td_thrhandle_t *__th);
- extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
- td_thrhandle_t *__th);
- extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
- td_thr_iter_f *__callback, void *__cbdata_p,
- td_thr_state_e __state, int __ti_pri,
- sigset_t *__ti_sigmask_p,
- unsigned int __ti_user_flags);
- extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
- void *__p);
- extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
- td_event_e __event, td_notify_t *__ptr);
- extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
- td_thr_events_t *__event);
- extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
- td_thr_events_t *__event);
- extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
- td_event_msg_t *__msg);
- extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
- extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
- extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
- extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
- td_ta_stats_t *__statsp);
- extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
- extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
- td_thrinfo_t *__infop);
- extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
- prfpregset_t *__regset);
- extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
- prgregset_t __gregs);
- extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
- extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
- extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
- const prfpregset_t *__fpregs);
- extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
- prgregset_t __gregs);
- extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
- const void *__addr);
- extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
- unsigned long int __modid,
- psaddr_t *__base);
- extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
- psaddr_t __map_address, size_t __offset,
- psaddr_t *__address);
- extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
- extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
- td_thr_events_t *__event);
- extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
- td_thr_events_t *__event);
- extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
- td_event_msg_t *__msg);
- extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
- extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
- unsigned char __n, const sigset_t *__ss);
- extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
- const sigset_t *__ss);
- extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
- const thread_key_t __tk, void **__data);
- extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
- extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
- #endif
|