111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * Copyright 2006 The Android Open Source Project 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LIBTHREAD_DB__THREAD_DB_H 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _LIBTHREAD_DB__THREAD_DB_H 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <pthread.h> 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <signal.h> 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stdint.h> 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sys/types.h> 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef void *psaddr_t; 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef pid_t lwpid_t; 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define TD_THR_ANY_USER_FLAGS 0xffffffff 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define TD_THR_LOWEST_PRIORITY -20 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define TD_SIGNO_MASK NULL 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* td_err_e values */ 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertenum { 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_OK, 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_ERR, 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOTHR, 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOSV, 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOLWP, 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_BADPH, 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_BADTH, 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_BADSH, 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_BADTA, 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_BADKEY, 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOMSG, 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOFPREGS, 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOLIBTHREAD, 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOEVENT, 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOCAPAB, 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_DBERR, 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOAPLIC, 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOTSD, 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_MALLOC, 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_PARTIALREG, 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_NOXREGS, 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_VERSION 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * td_event_e values 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert * NOTE: There is a max of 32 events 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */ 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertenum { 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_CREATE, 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_DEATH 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/* td_thr_state_e values */ 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertenum { 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_THR_ANY_STATE, 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_THR_UNKNOWN, 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_THR_SLEEP, 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert TD_THR_ZOMBIE 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int32_t td_err_e; 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef uint32_t td_event_e; 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef uint32_t td_notify_e; 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef uint32_t td_thr_state_e; 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef pthread_t thread_t; 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pid_t pid; 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert struct ps_prochandle *ph; 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} td_thragent_t; 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pid_t pid; 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pid_t tid; 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} td_thrhandle_t; 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_event_e event; 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_thrhandle_t const * th_p; 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert union { 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void * data; 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } msg; 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} td_event_msg_t; 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert uint32_t events; 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} td_thr_events_t; 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert union { 9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void * bptaddr; 9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } u; 10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} td_notify_t; 10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef struct 10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_thr_state_e ti_state; 10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert thread_t ti_tid; // pthread's id for the thread 10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert int32_t ti_lid; // the kernel's id for the thread 10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} td_thrinfo_t; 10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define td_event_emptyset(set) \ 11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (set)->events = 0 11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define td_event_fillset(set) \ 11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (set)->events = 0xffffffff 11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define td_event_addset(set, n) \ 11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert (set)->events |= (1 << n) 11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef int td_thr_iter_f(td_thrhandle_t const *, void *); 12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct ps_prochandle; 12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __cplusplus 12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern "C"{ 12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_new(struct ps_prochandle * proc_handle, td_thragent_t ** thread_agent); 13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_delete(td_thragent_t * ta); 13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_set_event(td_thragent_t const * agent, td_thr_events_t * event); 13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_event_addr(td_thragent_t const * agent, td_event_e event, td_notify_t * notify); 13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_clear_event(const td_thragent_t * ta_arg, 13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_thr_events_t * event); 13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event); 14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_map_lwp2thr(td_thragent_t const * agent, lwpid_t lwpid, 14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_thrhandle_t *th); 14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_thr_get_info(td_thrhandle_t const * handle, 14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_thrinfo_t * info); 14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_thr_event_enable(td_thrhandle_t const * handle, 14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_event_e event); 15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_ta_thr_iter(td_thragent_t const * agent, td_thr_iter_f * func, void * cookie, 15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert td_thr_state_e state, int32_t prio, sigset_t * sigmask, uint32_t user_flags); 15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern char const ** td_symbol_list(void); 15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertextern td_err_e td_thr_tls_get_addr(const td_thrhandle_t * th, 15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert psaddr_t map_address, size_t offset, 15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert psaddr_t * address); 15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef __cplusplus 16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif 165