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