The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 1 | /* |
| 2 | * Copyright 2006 The Android Open Source Project |
| 3 | */ |
| 4 | |
| 5 | #ifndef _LIBTHREAD_DB__THREAD_DB_H |
| 6 | #define _LIBTHREAD_DB__THREAD_DB_H |
| 7 | |
| 8 | #include <pthread.h> |
| 9 | #include <signal.h> |
| 10 | #include <stdint.h> |
| 11 | #include <sys/types.h> |
| 12 | |
David 'Digit' Turner | 20783c1 | 2010-03-19 16:01:28 -0700 | [diff] [blame] | 13 | typedef void *psaddr_t; |
| 14 | typedef pid_t lwpid_t; |
The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 15 | |
| 16 | #define TD_THR_ANY_USER_FLAGS 0xffffffff |
| 17 | #define TD_THR_LOWEST_PRIORITY -20 |
| 18 | #define TD_SIGNO_MASK NULL |
| 19 | |
| 20 | /* td_err_e values */ |
| 21 | enum { |
| 22 | TD_OK, |
| 23 | TD_ERR, |
| 24 | TD_NOTHR, |
| 25 | TD_NOSV, |
| 26 | TD_NOLWP, |
| 27 | TD_BADPH, |
| 28 | TD_BADTH, |
| 29 | TD_BADSH, |
| 30 | TD_BADTA, |
| 31 | TD_BADKEY, |
| 32 | TD_NOMSG, |
| 33 | TD_NOFPREGS, |
| 34 | TD_NOLIBTHREAD, |
| 35 | TD_NOEVENT, |
| 36 | TD_NOCAPAB, |
| 37 | TD_DBERR, |
| 38 | TD_NOAPLIC, |
| 39 | TD_NOTSD, |
| 40 | TD_MALLOC, |
| 41 | TD_PARTIALREG, |
| 42 | TD_NOXREGS, |
| 43 | TD_VERSION |
| 44 | }; |
| 45 | |
| 46 | /* |
| 47 | * td_event_e values |
| 48 | * NOTE: There is a max of 32 events |
| 49 | */ |
| 50 | enum { |
| 51 | TD_CREATE, |
| 52 | TD_DEATH |
| 53 | }; |
| 54 | |
| 55 | /* td_thr_state_e values */ |
| 56 | enum { |
| 57 | TD_THR_ANY_STATE, |
| 58 | TD_THR_UNKNOWN, |
| 59 | TD_THR_SLEEP, |
| 60 | TD_THR_ZOMBIE |
| 61 | }; |
| 62 | |
| 63 | typedef int32_t td_err_e; |
| 64 | typedef uint32_t td_event_e; |
| 65 | typedef uint32_t td_notify_e; |
| 66 | typedef uint32_t td_thr_state_e; |
| 67 | typedef pthread_t thread_t; |
| 68 | |
| 69 | typedef struct |
| 70 | { |
| 71 | pid_t pid; |
David 'Digit' Turner | 20783c1 | 2010-03-19 16:01:28 -0700 | [diff] [blame] | 72 | struct ps_prochandle *ph; |
The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 73 | } td_thragent_t; |
| 74 | |
| 75 | typedef struct |
| 76 | { |
| 77 | pid_t pid; |
| 78 | pid_t tid; |
| 79 | } td_thrhandle_t; |
| 80 | |
| 81 | typedef struct |
| 82 | { |
| 83 | td_event_e event; |
| 84 | td_thrhandle_t const * th_p; |
| 85 | union { |
| 86 | void * data; |
| 87 | } msg; |
| 88 | } td_event_msg_t; |
| 89 | |
| 90 | typedef struct |
| 91 | { |
| 92 | uint32_t events; |
| 93 | } td_thr_events_t; |
| 94 | |
| 95 | typedef struct |
| 96 | { |
| 97 | union { |
| 98 | void * bptaddr; |
| 99 | } u; |
| 100 | } td_notify_t; |
| 101 | |
| 102 | typedef struct |
| 103 | { |
| 104 | td_thr_state_e ti_state; |
| 105 | thread_t ti_tid; // pthread's id for the thread |
| 106 | int32_t ti_lid; // the kernel's id for the thread |
| 107 | } td_thrinfo_t; |
| 108 | |
| 109 | |
| 110 | #define td_event_emptyset(set) \ |
| 111 | (set)->events = 0 |
| 112 | |
| 113 | #define td_event_fillset(set) \ |
| 114 | (set)->events = 0xffffffff |
| 115 | |
| 116 | #define td_event_addset(set, n) \ |
| 117 | (set)->events |= (1 << n) |
| 118 | |
| 119 | |
| 120 | typedef int td_thr_iter_f(td_thrhandle_t const *, void *); |
| 121 | |
| 122 | |
| 123 | struct ps_prochandle; |
| 124 | |
| 125 | #ifdef __cplusplus |
| 126 | extern "C"{ |
| 127 | #endif |
| 128 | |
David 'Digit' Turner | 20783c1 | 2010-03-19 16:01:28 -0700 | [diff] [blame] | 129 | extern td_err_e td_ta_new(struct ps_prochandle * proc_handle, td_thragent_t ** thread_agent); |
| 130 | |
| 131 | extern td_err_e td_ta_delete(td_thragent_t * ta); |
The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 132 | |
| 133 | extern td_err_e td_ta_set_event(td_thragent_t const * agent, td_thr_events_t * event); |
| 134 | |
| 135 | extern td_err_e td_ta_event_addr(td_thragent_t const * agent, td_event_e event, td_notify_t * notify); |
| 136 | |
David 'Digit' Turner | 20783c1 | 2010-03-19 16:01:28 -0700 | [diff] [blame] | 137 | extern td_err_e td_ta_clear_event(const td_thragent_t * ta_arg, |
| 138 | td_thr_events_t * event); |
| 139 | |
The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 140 | extern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event); |
| 141 | |
David 'Digit' Turner | 20783c1 | 2010-03-19 16:01:28 -0700 | [diff] [blame] | 142 | extern td_err_e td_ta_map_lwp2thr(td_thragent_t const * agent, lwpid_t lwpid, |
| 143 | td_thrhandle_t *th); |
| 144 | |
| 145 | extern td_err_e td_thr_get_info(td_thrhandle_t const * handle, |
| 146 | td_thrinfo_t * info); |
| 147 | |
| 148 | extern td_err_e td_thr_event_enable(td_thrhandle_t const * handle, |
| 149 | td_event_e event); |
| 150 | |
The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 151 | extern td_err_e td_ta_thr_iter(td_thragent_t const * agent, td_thr_iter_f * func, void * cookie, |
| 152 | td_thr_state_e state, int32_t prio, sigset_t * sigmask, uint32_t user_flags); |
| 153 | |
| 154 | extern char const ** td_symbol_list(void); |
| 155 | |
David 'Digit' Turner | 20783c1 | 2010-03-19 16:01:28 -0700 | [diff] [blame] | 156 | extern td_err_e td_thr_tls_get_addr(const td_thrhandle_t * th, |
| 157 | psaddr_t map_address, size_t offset, |
| 158 | psaddr_t * address); |
| 159 | |
The Android Open Source Project | 1dc9e47 | 2009-03-03 19:28:35 -0800 | [diff] [blame] | 160 | #ifdef __cplusplus |
| 161 | } |
| 162 | #endif |
| 163 | |
| 164 | #endif |