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