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