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