1951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
2951a39d68df598db08dfced8b4707755864a0492Ying Wang * Copyright 2006 The Android Open Source Project
3951a39d68df598db08dfced8b4707755864a0492Ying Wang */
4951a39d68df598db08dfced8b4707755864a0492Ying Wang
5951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifndef _LIBTHREAD_DB__THREAD_DB_H
6951a39d68df598db08dfced8b4707755864a0492Ying Wang#define _LIBTHREAD_DB__THREAD_DB_H
7951a39d68df598db08dfced8b4707755864a0492Ying Wang
8951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <pthread.h>
9951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <signal.h>
10951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <stdint.h>
11951a39d68df598db08dfced8b4707755864a0492Ying Wang#include <sys/types.h>
12951a39d68df598db08dfced8b4707755864a0492Ying Wang
13951a39d68df598db08dfced8b4707755864a0492Ying Wang
14951a39d68df598db08dfced8b4707755864a0492Ying Wang#define TD_THR_ANY_USER_FLAGS       0xffffffff
15951a39d68df598db08dfced8b4707755864a0492Ying Wang#define TD_THR_LOWEST_PRIORITY      -20
16951a39d68df598db08dfced8b4707755864a0492Ying Wang#define TD_SIGNO_MASK               NULL
17951a39d68df598db08dfced8b4707755864a0492Ying Wang
18951a39d68df598db08dfced8b4707755864a0492Ying Wang/* td_err_e values */
19951a39d68df598db08dfced8b4707755864a0492Ying Wangenum {
20951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_OK,
21951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_ERR,
22951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOTHR,
23951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOSV,
24951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOLWP,
25951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_BADPH,
26951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_BADTH,
27951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_BADSH,
28951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_BADTA,
29951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_BADKEY,
30951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOMSG,
31951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOFPREGS,
32951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOLIBTHREAD,
33951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOEVENT,
34951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOCAPAB,
35951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_DBERR,
36951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOAPLIC,
37951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOTSD,
38951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_MALLOC,
39951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_PARTIALREG,
40951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_NOXREGS,
41951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_VERSION
42951a39d68df598db08dfced8b4707755864a0492Ying Wang};
43951a39d68df598db08dfced8b4707755864a0492Ying Wang
44951a39d68df598db08dfced8b4707755864a0492Ying Wang/*
45951a39d68df598db08dfced8b4707755864a0492Ying Wang * td_event_e values
46951a39d68df598db08dfced8b4707755864a0492Ying Wang * NOTE: There is a max of 32 events
47951a39d68df598db08dfced8b4707755864a0492Ying Wang */
48951a39d68df598db08dfced8b4707755864a0492Ying Wangenum {
49951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_CREATE,
50951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_DEATH
51951a39d68df598db08dfced8b4707755864a0492Ying Wang};
52951a39d68df598db08dfced8b4707755864a0492Ying Wang
53951a39d68df598db08dfced8b4707755864a0492Ying Wang/* td_thr_state_e values */
54951a39d68df598db08dfced8b4707755864a0492Ying Wangenum {
55951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_THR_ANY_STATE,
56951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_THR_UNKNOWN,
57951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_THR_SLEEP,
58951a39d68df598db08dfced8b4707755864a0492Ying Wang    TD_THR_ZOMBIE
59951a39d68df598db08dfced8b4707755864a0492Ying Wang};
60951a39d68df598db08dfced8b4707755864a0492Ying Wang
61951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef int32_t td_err_e;
62951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef uint32_t td_event_e;
63951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef uint32_t td_notify_e;
64951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef uint32_t td_thr_state_e;
65951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef pthread_t thread_t;
66951a39d68df598db08dfced8b4707755864a0492Ying Wang
67951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct
68951a39d68df598db08dfced8b4707755864a0492Ying Wang{
69951a39d68df598db08dfced8b4707755864a0492Ying Wang    pid_t pid;
70951a39d68df598db08dfced8b4707755864a0492Ying Wang} td_thragent_t;
71951a39d68df598db08dfced8b4707755864a0492Ying Wang
72951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct
73951a39d68df598db08dfced8b4707755864a0492Ying Wang{
74951a39d68df598db08dfced8b4707755864a0492Ying Wang    pid_t pid;
75951a39d68df598db08dfced8b4707755864a0492Ying Wang    pid_t tid;
76951a39d68df598db08dfced8b4707755864a0492Ying Wang} td_thrhandle_t;
77951a39d68df598db08dfced8b4707755864a0492Ying Wang
78951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct
79951a39d68df598db08dfced8b4707755864a0492Ying Wang{
80951a39d68df598db08dfced8b4707755864a0492Ying Wang    td_event_e event;
81951a39d68df598db08dfced8b4707755864a0492Ying Wang    td_thrhandle_t const * th_p;
82951a39d68df598db08dfced8b4707755864a0492Ying Wang    union {
83951a39d68df598db08dfced8b4707755864a0492Ying Wang        void * data;
84951a39d68df598db08dfced8b4707755864a0492Ying Wang    } msg;
85951a39d68df598db08dfced8b4707755864a0492Ying Wang} td_event_msg_t;
86951a39d68df598db08dfced8b4707755864a0492Ying Wang
87951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct
88951a39d68df598db08dfced8b4707755864a0492Ying Wang{
89951a39d68df598db08dfced8b4707755864a0492Ying Wang    uint32_t events;
90951a39d68df598db08dfced8b4707755864a0492Ying Wang} td_thr_events_t;
91951a39d68df598db08dfced8b4707755864a0492Ying Wang
92951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct
93951a39d68df598db08dfced8b4707755864a0492Ying Wang{
94951a39d68df598db08dfced8b4707755864a0492Ying Wang    union {
95951a39d68df598db08dfced8b4707755864a0492Ying Wang        void * bptaddr;
96951a39d68df598db08dfced8b4707755864a0492Ying Wang    } u;
97951a39d68df598db08dfced8b4707755864a0492Ying Wang} td_notify_t;
98951a39d68df598db08dfced8b4707755864a0492Ying Wang
99951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef struct
100951a39d68df598db08dfced8b4707755864a0492Ying Wang{
101951a39d68df598db08dfced8b4707755864a0492Ying Wang    td_thr_state_e ti_state;
102951a39d68df598db08dfced8b4707755864a0492Ying Wang    thread_t ti_tid; // pthread's id for the thread
103951a39d68df598db08dfced8b4707755864a0492Ying Wang    int32_t ti_lid; // the kernel's id for the thread
104951a39d68df598db08dfced8b4707755864a0492Ying Wang} td_thrinfo_t;
105951a39d68df598db08dfced8b4707755864a0492Ying Wang
106951a39d68df598db08dfced8b4707755864a0492Ying Wang
107951a39d68df598db08dfced8b4707755864a0492Ying Wang#define td_event_emptyset(set) \
108951a39d68df598db08dfced8b4707755864a0492Ying Wang    (set)->events = 0
109951a39d68df598db08dfced8b4707755864a0492Ying Wang
110951a39d68df598db08dfced8b4707755864a0492Ying Wang#define td_event_fillset(set) \
111951a39d68df598db08dfced8b4707755864a0492Ying Wang    (set)->events = 0xffffffff
112951a39d68df598db08dfced8b4707755864a0492Ying Wang
113951a39d68df598db08dfced8b4707755864a0492Ying Wang#define td_event_addset(set, n) \
114951a39d68df598db08dfced8b4707755864a0492Ying Wang    (set)->events |= (1 << n)
115951a39d68df598db08dfced8b4707755864a0492Ying Wang
116951a39d68df598db08dfced8b4707755864a0492Ying Wang
117951a39d68df598db08dfced8b4707755864a0492Ying Wangtypedef int td_thr_iter_f(td_thrhandle_t const *, void *);
118951a39d68df598db08dfced8b4707755864a0492Ying Wang
119951a39d68df598db08dfced8b4707755864a0492Ying Wang
120951a39d68df598db08dfced8b4707755864a0492Ying Wangstruct ps_prochandle;
121951a39d68df598db08dfced8b4707755864a0492Ying Wang
122951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef __cplusplus
123951a39d68df598db08dfced8b4707755864a0492Ying Wangextern "C"{
124951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
125951a39d68df598db08dfced8b4707755864a0492Ying Wang
126951a39d68df598db08dfced8b4707755864a0492Ying Wangextern td_err_e td_ta_new(struct ps_prochandle const * proc_handle, td_thragent_t ** thread_agent);
127951a39d68df598db08dfced8b4707755864a0492Ying Wang
128951a39d68df598db08dfced8b4707755864a0492Ying Wangextern td_err_e td_ta_set_event(td_thragent_t const * agent, td_thr_events_t * event);
129951a39d68df598db08dfced8b4707755864a0492Ying Wang
130951a39d68df598db08dfced8b4707755864a0492Ying Wangextern td_err_e td_ta_event_addr(td_thragent_t const * agent, td_event_e event, td_notify_t * notify);
131951a39d68df598db08dfced8b4707755864a0492Ying Wang
132951a39d68df598db08dfced8b4707755864a0492Ying Wangextern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event);
133951a39d68df598db08dfced8b4707755864a0492Ying Wang
134951a39d68df598db08dfced8b4707755864a0492Ying Wangextern td_err_e td_ta_thr_iter(td_thragent_t const * agent, td_thr_iter_f * func, void * cookie,
135951a39d68df598db08dfced8b4707755864a0492Ying Wang                               td_thr_state_e state, int32_t prio, sigset_t * sigmask, uint32_t user_flags);
136951a39d68df598db08dfced8b4707755864a0492Ying Wang
137951a39d68df598db08dfced8b4707755864a0492Ying Wangextern char const ** td_symbol_list(void);
138951a39d68df598db08dfced8b4707755864a0492Ying Wang
139951a39d68df598db08dfced8b4707755864a0492Ying Wang#ifdef __cplusplus
140951a39d68df598db08dfced8b4707755864a0492Ying Wang}
141951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
142951a39d68df598db08dfced8b4707755864a0492Ying Wang
143951a39d68df598db08dfced8b4707755864a0492Ying Wang#endif
144