1/* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef _LIBTHREAD_DB__THREAD_DB_H 18#define _LIBTHREAD_DB__THREAD_DB_H 19 20#include <pthread.h> 21#include <signal.h> 22#include <stdint.h> 23#include <sys/types.h> 24 25typedef void *psaddr_t; 26#define HAVE_PSADDR_T 1 27 28typedef pid_t lwpid_t; 29#define HAVE_LWPID_T 1 30 31#define TD_THR_ANY_USER_FLAGS 0xffffffff 32#define TD_THR_LOWEST_PRIORITY -20 33#define TD_SIGNO_MASK NULL 34 35/* td_err_e values */ 36enum { 37 TD_OK, 38 TD_ERR, 39 TD_NOTHR, 40 TD_NOSV, 41 TD_NOLWP, 42 TD_BADPH, 43 TD_BADTH, 44 TD_BADSH, 45 TD_BADTA, 46 TD_BADKEY, 47 TD_NOMSG, 48 TD_NOFPREGS, 49 TD_NOLIBTHREAD, 50 TD_NOEVENT, 51 TD_NOCAPAB, 52 TD_DBERR, 53 TD_NOAPLIC, 54 TD_NOTSD, 55 TD_MALLOC, 56 TD_PARTIALREG, 57 TD_NOXREGS, 58 TD_VERSION 59}; 60 61/* 62 * td_event_e values 63 * NOTE: There is a max of 32 events 64 */ 65enum { 66 TD_CREATE, 67 TD_DEATH 68}; 69 70/* td_thr_state_e values */ 71enum { 72 TD_THR_ANY_STATE, 73 TD_THR_UNKNOWN, 74 TD_THR_SLEEP, 75 TD_THR_ZOMBIE 76}; 77 78typedef int32_t td_err_e; 79typedef uint32_t td_event_e; 80typedef uint32_t td_notify_e; 81typedef uint32_t td_thr_state_e; 82typedef pthread_t thread_t; 83 84typedef struct 85{ 86 pid_t pid; 87 struct ps_prochandle *ph; 88} td_thragent_t; 89 90typedef struct 91{ 92 pid_t pid; 93 pid_t tid; 94} td_thrhandle_t; 95 96typedef struct 97{ 98 td_event_e event; 99 td_thrhandle_t const * th_p; 100 union { 101 void * data; 102 } msg; 103} td_event_msg_t; 104 105typedef struct 106{ 107 uint32_t events; 108} td_thr_events_t; 109 110typedef struct 111{ 112 union { 113 void * bptaddr; 114 } u; 115} td_notify_t; 116 117typedef struct 118{ 119 td_thr_state_e ti_state; 120 thread_t ti_tid; // pthread's id for the thread 121 int32_t ti_lid; // the kernel's id for the thread 122} td_thrinfo_t; 123 124 125#define td_event_emptyset(set) \ 126 (set)->events = 0 127 128#define td_event_fillset(set) \ 129 (set)->events = 0xffffffff 130 131#define td_event_addset(set, n) \ 132 (set)->events |= (1 << n) 133 134 135typedef int td_thr_iter_f(td_thrhandle_t const *, void *); 136 137 138struct ps_prochandle; 139 140#ifdef __cplusplus 141extern "C"{ 142#endif 143 144extern td_err_e td_ta_new(struct ps_prochandle * proc_handle, td_thragent_t ** thread_agent); 145 146extern td_err_e td_ta_delete(td_thragent_t * ta); 147 148extern td_err_e td_ta_set_event(td_thragent_t const * agent, td_thr_events_t * event); 149 150extern td_err_e td_ta_event_addr(td_thragent_t const * agent, td_event_e event, td_notify_t * notify); 151 152extern td_err_e td_ta_clear_event(const td_thragent_t * ta_arg, 153 td_thr_events_t * event); 154 155extern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event); 156 157extern td_err_e td_ta_map_lwp2thr(td_thragent_t const * agent, lwpid_t lwpid, 158 td_thrhandle_t *th); 159 160extern td_err_e td_thr_get_info(td_thrhandle_t const * handle, 161 td_thrinfo_t * info); 162 163extern td_err_e td_thr_event_enable(td_thrhandle_t const * handle, 164 td_event_e event); 165 166extern td_err_e td_ta_thr_iter(td_thragent_t const * agent, td_thr_iter_f * func, void * cookie, 167 td_thr_state_e state, int32_t prio, sigset_t * sigmask, uint32_t user_flags); 168 169extern char const ** td_symbol_list(void); 170 171extern td_err_e td_thr_event_enable(td_thrhandle_t const * handle, td_event_e event); 172 173extern td_err_e td_thr_get_info(td_thrhandle_t const * handle, td_thrinfo_t * info); 174 175extern td_err_e td_thr_tls_get_addr(const td_thrhandle_t * th, 176 psaddr_t map_address, size_t offset, 177 psaddr_t * address); 178 179#ifdef __cplusplus 180} 181#endif 182 183#endif 184