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 
13 typedef void *psaddr_t;
14 typedef pid_t lwpid_t;
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;
72     struct ps_prochandle *ph;
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 
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);
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 
137 extern td_err_e td_ta_clear_event(const td_thragent_t * ta_arg,
138 				  td_thr_events_t * event);
139 
140 extern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event);
141 
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 
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 
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 
160 #ifdef __cplusplus
161 }
162 #endif
163 
164 #endif
165