xref: /utopia/UTPA2-700.0.x/projects/tools/lint/mips-linux-gnu_include/thread_db.h (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi /* thread_db.h -- interface to libthread_db.so library for debugging -lpthread
2*53ee8cc1Swenshuai.xi    Copyright (C) 1999,2001,2002,2003 Free Software Foundation, Inc.
3*53ee8cc1Swenshuai.xi    This file is part of the GNU C Library.
4*53ee8cc1Swenshuai.xi 
5*53ee8cc1Swenshuai.xi    The GNU C Library is free software; you can redistribute it and/or
6*53ee8cc1Swenshuai.xi    modify it under the terms of the GNU Lesser General Public
7*53ee8cc1Swenshuai.xi    License as published by the Free Software Foundation; either
8*53ee8cc1Swenshuai.xi    version 2.1 of the License, or (at your option) any later version.
9*53ee8cc1Swenshuai.xi 
10*53ee8cc1Swenshuai.xi    The GNU C Library is distributed in the hope that it will be useful,
11*53ee8cc1Swenshuai.xi    but WITHOUT ANY WARRANTY; without even the implied warranty of
12*53ee8cc1Swenshuai.xi    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13*53ee8cc1Swenshuai.xi    Lesser General Public License for more details.
14*53ee8cc1Swenshuai.xi 
15*53ee8cc1Swenshuai.xi    You should have received a copy of the GNU Lesser General Public
16*53ee8cc1Swenshuai.xi    License along with the GNU C Library; if not, write to the Free
17*53ee8cc1Swenshuai.xi    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18*53ee8cc1Swenshuai.xi    02111-1307 USA.  */
19*53ee8cc1Swenshuai.xi 
20*53ee8cc1Swenshuai.xi #ifndef _THREAD_DB_H
21*53ee8cc1Swenshuai.xi #define _THREAD_DB_H	1
22*53ee8cc1Swenshuai.xi 
23*53ee8cc1Swenshuai.xi /* This is the debugger interface for the NPTL library.  It is
24*53ee8cc1Swenshuai.xi    modelled closely after the interface with same names in Solaris
25*53ee8cc1Swenshuai.xi    with the goal to share the same code in the debugger.  */
26*53ee8cc1Swenshuai.xi #include <pthread.h>
27*53ee8cc1Swenshuai.xi #include <stdint.h>
28*53ee8cc1Swenshuai.xi #include <sys/types.h>
29*53ee8cc1Swenshuai.xi #include <sys/procfs.h>
30*53ee8cc1Swenshuai.xi 
31*53ee8cc1Swenshuai.xi 
32*53ee8cc1Swenshuai.xi /* Error codes of the library.  */
33*53ee8cc1Swenshuai.xi typedef enum
34*53ee8cc1Swenshuai.xi {
35*53ee8cc1Swenshuai.xi   TD_OK,	  /* No error.  */
36*53ee8cc1Swenshuai.xi   TD_ERR,	  /* No further specified error.  */
37*53ee8cc1Swenshuai.xi   TD_NOTHR,	  /* No matching thread found.  */
38*53ee8cc1Swenshuai.xi   TD_NOSV,	  /* No matching synchronization handle found.  */
39*53ee8cc1Swenshuai.xi   TD_NOLWP,	  /* No matching light-weighted process found.  */
40*53ee8cc1Swenshuai.xi   TD_BADPH,	  /* Invalid process handle.  */
41*53ee8cc1Swenshuai.xi   TD_BADTH,	  /* Invalid thread handle.  */
42*53ee8cc1Swenshuai.xi   TD_BADSH,	  /* Invalid synchronization handle.  */
43*53ee8cc1Swenshuai.xi   TD_BADTA,	  /* Invalid thread agent.  */
44*53ee8cc1Swenshuai.xi   TD_BADKEY,	  /* Invalid key.  */
45*53ee8cc1Swenshuai.xi   TD_NOMSG,	  /* No event available.  */
46*53ee8cc1Swenshuai.xi   TD_NOFPREGS,	  /* No floating-point register content available.  */
47*53ee8cc1Swenshuai.xi   TD_NOLIBTHREAD, /* Application not linked with thread library.  */
48*53ee8cc1Swenshuai.xi   TD_NOEVENT,	  /* Requested event is not supported.  */
49*53ee8cc1Swenshuai.xi   TD_NOCAPAB,	  /* Capability not available.  */
50*53ee8cc1Swenshuai.xi   TD_DBERR,	  /* Internal debug library error.  */
51*53ee8cc1Swenshuai.xi   TD_NOAPLIC,	  /* Operation is not applicable.  */
52*53ee8cc1Swenshuai.xi   TD_NOTSD,	  /* No thread-specific data available.  */
53*53ee8cc1Swenshuai.xi   TD_MALLOC,	  /* Out of memory.  */
54*53ee8cc1Swenshuai.xi   TD_PARTIALREG,  /* Not entire register set was read or written.  */
55*53ee8cc1Swenshuai.xi   TD_NOXREGS,	  /* X register set not available for given thread.  */
56*53ee8cc1Swenshuai.xi   TD_TLSDEFER,	  /* Thread has not yet allocated TLS for given module.  */
57*53ee8cc1Swenshuai.xi   TD_NOTALLOC = TD_TLSDEFER,
58*53ee8cc1Swenshuai.xi   TD_VERSION,	  /* Version if libpthread and libthread_db do not match.  */
59*53ee8cc1Swenshuai.xi   TD_NOTLS	  /* There is no TLS segment in the given module.  */
60*53ee8cc1Swenshuai.xi } td_err_e;
61*53ee8cc1Swenshuai.xi 
62*53ee8cc1Swenshuai.xi 
63*53ee8cc1Swenshuai.xi /* Possible thread states.  TD_THR_ANY_STATE is a pseudo-state used to
64*53ee8cc1Swenshuai.xi    select threads regardless of state in td_ta_thr_iter().  */
65*53ee8cc1Swenshuai.xi typedef enum
66*53ee8cc1Swenshuai.xi {
67*53ee8cc1Swenshuai.xi   TD_THR_ANY_STATE,
68*53ee8cc1Swenshuai.xi   TD_THR_UNKNOWN,
69*53ee8cc1Swenshuai.xi   TD_THR_STOPPED,
70*53ee8cc1Swenshuai.xi   TD_THR_RUN,
71*53ee8cc1Swenshuai.xi   TD_THR_ACTIVE,
72*53ee8cc1Swenshuai.xi   TD_THR_ZOMBIE,
73*53ee8cc1Swenshuai.xi   TD_THR_SLEEP,
74*53ee8cc1Swenshuai.xi   TD_THR_STOPPED_ASLEEP
75*53ee8cc1Swenshuai.xi } td_thr_state_e;
76*53ee8cc1Swenshuai.xi 
77*53ee8cc1Swenshuai.xi /* Thread type: user or system.  TD_THR_ANY_TYPE is a pseudo-type used
78*53ee8cc1Swenshuai.xi    to select threads regardless of type in td_ta_thr_iter().  */
79*53ee8cc1Swenshuai.xi typedef enum
80*53ee8cc1Swenshuai.xi {
81*53ee8cc1Swenshuai.xi   TD_THR_ANY_TYPE,
82*53ee8cc1Swenshuai.xi   TD_THR_USER,
83*53ee8cc1Swenshuai.xi   TD_THR_SYSTEM
84*53ee8cc1Swenshuai.xi } td_thr_type_e;
85*53ee8cc1Swenshuai.xi 
86*53ee8cc1Swenshuai.xi 
87*53ee8cc1Swenshuai.xi /* Types of the debugging library.  */
88*53ee8cc1Swenshuai.xi 
89*53ee8cc1Swenshuai.xi /* Handle for a process.  This type is opaque.  */
90*53ee8cc1Swenshuai.xi typedef struct td_thragent td_thragent_t;
91*53ee8cc1Swenshuai.xi 
92*53ee8cc1Swenshuai.xi /* The actual thread handle type.  This is also opaque.  */
93*53ee8cc1Swenshuai.xi typedef struct td_thrhandle
94*53ee8cc1Swenshuai.xi {
95*53ee8cc1Swenshuai.xi   td_thragent_t *th_ta_p;
96*53ee8cc1Swenshuai.xi   psaddr_t th_unique;
97*53ee8cc1Swenshuai.xi } td_thrhandle_t;
98*53ee8cc1Swenshuai.xi 
99*53ee8cc1Swenshuai.xi 
100*53ee8cc1Swenshuai.xi /* Forward declaration of a type defined by and for the dynamic linker.  */
101*53ee8cc1Swenshuai.xi struct link_map;
102*53ee8cc1Swenshuai.xi 
103*53ee8cc1Swenshuai.xi 
104*53ee8cc1Swenshuai.xi /* Flags for `td_ta_thr_iter'.  */
105*53ee8cc1Swenshuai.xi #define TD_THR_ANY_USER_FLAGS	0xffffffff
106*53ee8cc1Swenshuai.xi #define TD_THR_LOWEST_PRIORITY	-20
107*53ee8cc1Swenshuai.xi #define TD_SIGNO_MASK		NULL
108*53ee8cc1Swenshuai.xi 
109*53ee8cc1Swenshuai.xi 
110*53ee8cc1Swenshuai.xi #define TD_EVENTSIZE	2
111*53ee8cc1Swenshuai.xi #define BT_UISHIFT	5 /* log base 2 of BT_NBIPUI, to extract word index */
112*53ee8cc1Swenshuai.xi #define BT_NBIPUI	(1 << BT_UISHIFT)       /* n bits per uint */
113*53ee8cc1Swenshuai.xi #define BT_UIMASK	(BT_NBIPUI - 1)         /* to extract bit index */
114*53ee8cc1Swenshuai.xi 
115*53ee8cc1Swenshuai.xi /* Bitmask of enabled events. */
116*53ee8cc1Swenshuai.xi typedef struct td_thr_events
117*53ee8cc1Swenshuai.xi {
118*53ee8cc1Swenshuai.xi   uint32_t event_bits[TD_EVENTSIZE];
119*53ee8cc1Swenshuai.xi } td_thr_events_t;
120*53ee8cc1Swenshuai.xi 
121*53ee8cc1Swenshuai.xi /* Event set manipulation macros. */
122*53ee8cc1Swenshuai.xi #define __td_eventmask(n) \
123*53ee8cc1Swenshuai.xi   (UINT32_C (1) << (((n) - 1) & BT_UIMASK))
124*53ee8cc1Swenshuai.xi #define __td_eventword(n) \
125*53ee8cc1Swenshuai.xi   ((UINT32_C ((n) - 1)) >> BT_UISHIFT)
126*53ee8cc1Swenshuai.xi 
127*53ee8cc1Swenshuai.xi #define td_event_emptyset(setp) \
128*53ee8cc1Swenshuai.xi   do {									      \
129*53ee8cc1Swenshuai.xi     int __i;								      \
130*53ee8cc1Swenshuai.xi     for (__i = TD_EVENTSIZE; __i > 0; --__i)				      \
131*53ee8cc1Swenshuai.xi       (setp)->event_bits[__i - 1] = 0;					      \
132*53ee8cc1Swenshuai.xi   } while (0)
133*53ee8cc1Swenshuai.xi 
134*53ee8cc1Swenshuai.xi #define td_event_fillset(setp) \
135*53ee8cc1Swenshuai.xi   do {									      \
136*53ee8cc1Swenshuai.xi     int __i;								      \
137*53ee8cc1Swenshuai.xi     for (__i = TD_EVENTSIZE; __i > 0; --__i)				      \
138*53ee8cc1Swenshuai.xi       (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff);		      \
139*53ee8cc1Swenshuai.xi   } while (0)
140*53ee8cc1Swenshuai.xi 
141*53ee8cc1Swenshuai.xi #define td_event_addset(setp, n) \
142*53ee8cc1Swenshuai.xi   (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))
143*53ee8cc1Swenshuai.xi #define td_event_delset(setp, n) \
144*53ee8cc1Swenshuai.xi   (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))
145*53ee8cc1Swenshuai.xi #define td_eventismember(setp, n) \
146*53ee8cc1Swenshuai.xi   (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))
147*53ee8cc1Swenshuai.xi #if TD_EVENTSIZE == 2
148*53ee8cc1Swenshuai.xi # define td_eventisempty(setp) \
149*53ee8cc1Swenshuai.xi   (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))
150*53ee8cc1Swenshuai.xi #else
151*53ee8cc1Swenshuai.xi # error "td_eventisempty must be changed to match TD_EVENTSIZE"
152*53ee8cc1Swenshuai.xi #endif
153*53ee8cc1Swenshuai.xi 
154*53ee8cc1Swenshuai.xi /* Events reportable by the thread implementation.  */
155*53ee8cc1Swenshuai.xi typedef enum
156*53ee8cc1Swenshuai.xi {
157*53ee8cc1Swenshuai.xi   TD_ALL_EVENTS,		 /* Pseudo-event number.  */
158*53ee8cc1Swenshuai.xi   TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context.  */
159*53ee8cc1Swenshuai.xi   TD_READY,			 /* Is executable now. */
160*53ee8cc1Swenshuai.xi   TD_SLEEP,			 /* Blocked in a synchronization obj.  */
161*53ee8cc1Swenshuai.xi   TD_SWITCHTO,			 /* Now assigned to a process.  */
162*53ee8cc1Swenshuai.xi   TD_SWITCHFROM,		 /* Not anymore assigned to a process.  */
163*53ee8cc1Swenshuai.xi   TD_LOCK_TRY,			 /* Trying to get an unavailable lock.  */
164*53ee8cc1Swenshuai.xi   TD_CATCHSIG,			 /* Signal posted to the thread.  */
165*53ee8cc1Swenshuai.xi   TD_IDLE,			 /* Process getting idle.  */
166*53ee8cc1Swenshuai.xi   TD_CREATE,			 /* New thread created.  */
167*53ee8cc1Swenshuai.xi   TD_DEATH,			 /* Thread terminated.  */
168*53ee8cc1Swenshuai.xi   TD_PREEMPT,			 /* Preempted.  */
169*53ee8cc1Swenshuai.xi   TD_PRI_INHERIT,		 /* Inherited elevated priority.  */
170*53ee8cc1Swenshuai.xi   TD_REAP,			 /* Reaped.  */
171*53ee8cc1Swenshuai.xi   TD_CONCURRENCY,		 /* Number of processes changing.  */
172*53ee8cc1Swenshuai.xi   TD_TIMEOUT,			 /* Conditional variable wait timed out.  */
173*53ee8cc1Swenshuai.xi   TD_MIN_EVENT_NUM = TD_READY,
174*53ee8cc1Swenshuai.xi   TD_MAX_EVENT_NUM = TD_TIMEOUT,
175*53ee8cc1Swenshuai.xi   TD_EVENTS_ENABLE = 31		/* Event reporting enabled.  */
176*53ee8cc1Swenshuai.xi } td_event_e;
177*53ee8cc1Swenshuai.xi 
178*53ee8cc1Swenshuai.xi /* Values representing the different ways events are reported.  */
179*53ee8cc1Swenshuai.xi typedef enum
180*53ee8cc1Swenshuai.xi {
181*53ee8cc1Swenshuai.xi   NOTIFY_BPT,			/* User must insert breakpoint at u.bptaddr. */
182*53ee8cc1Swenshuai.xi   NOTIFY_AUTOBPT,		/* Breakpoint at u.bptaddr is automatically
183*53ee8cc1Swenshuai.xi 				   inserted.  */
184*53ee8cc1Swenshuai.xi   NOTIFY_SYSCALL		/* System call u.syscallno will be invoked.  */
185*53ee8cc1Swenshuai.xi } td_notify_e;
186*53ee8cc1Swenshuai.xi 
187*53ee8cc1Swenshuai.xi /* Description how event type is reported.  */
188*53ee8cc1Swenshuai.xi typedef struct td_notify
189*53ee8cc1Swenshuai.xi {
190*53ee8cc1Swenshuai.xi   td_notify_e type;		/* Way the event is reported.  */
191*53ee8cc1Swenshuai.xi   union
192*53ee8cc1Swenshuai.xi   {
193*53ee8cc1Swenshuai.xi     psaddr_t bptaddr;		/* Address of breakpoint.  */
194*53ee8cc1Swenshuai.xi     int syscallno;		/* Number of system call used.  */
195*53ee8cc1Swenshuai.xi   } u;
196*53ee8cc1Swenshuai.xi } td_notify_t;
197*53ee8cc1Swenshuai.xi 
198*53ee8cc1Swenshuai.xi /* Structure used to report event.  */
199*53ee8cc1Swenshuai.xi typedef struct td_event_msg
200*53ee8cc1Swenshuai.xi {
201*53ee8cc1Swenshuai.xi   td_event_e event;		/* Event type being reported.  */
202*53ee8cc1Swenshuai.xi   const td_thrhandle_t *th_p;	/* Thread reporting the event.  */
203*53ee8cc1Swenshuai.xi   union
204*53ee8cc1Swenshuai.xi   {
205*53ee8cc1Swenshuai.xi # if 0
206*53ee8cc1Swenshuai.xi     td_synchandle_t *sh;	/* Handle of synchronization object.  */
207*53ee8cc1Swenshuai.xi #endif
208*53ee8cc1Swenshuai.xi     uintptr_t data;		/* Event specific data.  */
209*53ee8cc1Swenshuai.xi   } msg;
210*53ee8cc1Swenshuai.xi } td_event_msg_t;
211*53ee8cc1Swenshuai.xi 
212*53ee8cc1Swenshuai.xi /* Structure containing event data available in each thread structure.  */
213*53ee8cc1Swenshuai.xi typedef struct
214*53ee8cc1Swenshuai.xi {
215*53ee8cc1Swenshuai.xi   td_thr_events_t eventmask;	/* Mask of enabled events.  */
216*53ee8cc1Swenshuai.xi   td_event_e eventnum;		/* Number of last event.  */
217*53ee8cc1Swenshuai.xi   void *eventdata;		/* Data associated with event.  */
218*53ee8cc1Swenshuai.xi } td_eventbuf_t;
219*53ee8cc1Swenshuai.xi 
220*53ee8cc1Swenshuai.xi 
221*53ee8cc1Swenshuai.xi /* Gathered statistics about the process.  */
222*53ee8cc1Swenshuai.xi typedef struct td_ta_stats
223*53ee8cc1Swenshuai.xi {
224*53ee8cc1Swenshuai.xi   int nthreads;       		/* Total number of threads in use.  */
225*53ee8cc1Swenshuai.xi   int r_concurrency;		/* Concurrency level requested by user.  */
226*53ee8cc1Swenshuai.xi   int nrunnable_num;		/* Average runnable threads, numerator.  */
227*53ee8cc1Swenshuai.xi   int nrunnable_den;		/* Average runnable threads, denominator.  */
228*53ee8cc1Swenshuai.xi   int a_concurrency_num;	/* Achieved concurrency level, numerator.  */
229*53ee8cc1Swenshuai.xi   int a_concurrency_den;	/* Achieved concurrency level, denominator.  */
230*53ee8cc1Swenshuai.xi   int nlwps_num;		/* Average number of processes in use,
231*53ee8cc1Swenshuai.xi 				   numerator.  */
232*53ee8cc1Swenshuai.xi   int nlwps_den;		/* Average number of processes in use,
233*53ee8cc1Swenshuai.xi 				   denominator.  */
234*53ee8cc1Swenshuai.xi   int nidle_num;		/* Average number of idling processes,
235*53ee8cc1Swenshuai.xi 				   numerator.  */
236*53ee8cc1Swenshuai.xi   int nidle_den;		/* Average number of idling processes,
237*53ee8cc1Swenshuai.xi 				   denominator.  */
238*53ee8cc1Swenshuai.xi } td_ta_stats_t;
239*53ee8cc1Swenshuai.xi 
240*53ee8cc1Swenshuai.xi 
241*53ee8cc1Swenshuai.xi /* Since Sun's library is based on Solaris threads we have to define a few
242*53ee8cc1Swenshuai.xi    types to map them to POSIX threads.  */
243*53ee8cc1Swenshuai.xi typedef pthread_t thread_t;
244*53ee8cc1Swenshuai.xi typedef pthread_key_t thread_key_t;
245*53ee8cc1Swenshuai.xi 
246*53ee8cc1Swenshuai.xi 
247*53ee8cc1Swenshuai.xi /* Callback for iteration over threads.  */
248*53ee8cc1Swenshuai.xi typedef int td_thr_iter_f (const td_thrhandle_t *, void *);
249*53ee8cc1Swenshuai.xi 
250*53ee8cc1Swenshuai.xi /* Callback for iteration over thread local data.  */
251*53ee8cc1Swenshuai.xi typedef int td_key_iter_f (thread_key_t, void (*) (void *), void *);
252*53ee8cc1Swenshuai.xi 
253*53ee8cc1Swenshuai.xi 
254*53ee8cc1Swenshuai.xi 
255*53ee8cc1Swenshuai.xi /* Forward declaration.  This has to be defined by the user.  */
256*53ee8cc1Swenshuai.xi struct ps_prochandle;
257*53ee8cc1Swenshuai.xi 
258*53ee8cc1Swenshuai.xi 
259*53ee8cc1Swenshuai.xi /* Information about the thread.  */
260*53ee8cc1Swenshuai.xi typedef struct td_thrinfo
261*53ee8cc1Swenshuai.xi {
262*53ee8cc1Swenshuai.xi   td_thragent_t *ti_ta_p;		/* Process handle.  */
263*53ee8cc1Swenshuai.xi   unsigned int ti_user_flags;		/* Unused.  */
264*53ee8cc1Swenshuai.xi   thread_t ti_tid;			/* Thread ID returned by
265*53ee8cc1Swenshuai.xi 					   pthread_create().  */
266*53ee8cc1Swenshuai.xi   char *ti_tls;				/* Pointer to thread-local data.  */
267*53ee8cc1Swenshuai.xi   psaddr_t ti_startfunc;		/* Start function passed to
268*53ee8cc1Swenshuai.xi 					   pthread_create().  */
269*53ee8cc1Swenshuai.xi   psaddr_t ti_stkbase;			/* Base of thread's stack.  */
270*53ee8cc1Swenshuai.xi   long int ti_stksize;			/* Size of thread's stack.  */
271*53ee8cc1Swenshuai.xi   psaddr_t ti_ro_area;			/* Unused.  */
272*53ee8cc1Swenshuai.xi   int ti_ro_size;			/* Unused.  */
273*53ee8cc1Swenshuai.xi   td_thr_state_e ti_state;		/* Thread state.  */
274*53ee8cc1Swenshuai.xi   unsigned char ti_db_suspended;	/* Nonzero if suspended by debugger. */
275*53ee8cc1Swenshuai.xi   td_thr_type_e ti_type;		/* Type of the thread (system vs
276*53ee8cc1Swenshuai.xi 					   user thread).  */
277*53ee8cc1Swenshuai.xi   intptr_t ti_pc;			/* Unused.  */
278*53ee8cc1Swenshuai.xi   intptr_t ti_sp;			/* Unused.  */
279*53ee8cc1Swenshuai.xi   short int ti_flags;			/* Unused.  */
280*53ee8cc1Swenshuai.xi   int ti_pri;				/* Thread priority.  */
281*53ee8cc1Swenshuai.xi   lwpid_t ti_lid;			/* Kernel PID for this thread.  */
282*53ee8cc1Swenshuai.xi   sigset_t ti_sigmask;			/* Signal mask.  */
283*53ee8cc1Swenshuai.xi   unsigned char ti_traceme;		/* Nonzero if event reporting
284*53ee8cc1Swenshuai.xi 					   enabled.  */
285*53ee8cc1Swenshuai.xi   unsigned char ti_preemptflag;		/* Unused.  */
286*53ee8cc1Swenshuai.xi   unsigned char ti_pirecflag;		/* Unused.  */
287*53ee8cc1Swenshuai.xi   sigset_t ti_pending;			/* Set of pending signals.  */
288*53ee8cc1Swenshuai.xi   td_thr_events_t ti_events;		/* Set of enabled events.  */
289*53ee8cc1Swenshuai.xi } td_thrinfo_t;
290*53ee8cc1Swenshuai.xi 
291*53ee8cc1Swenshuai.xi 
292*53ee8cc1Swenshuai.xi 
293*53ee8cc1Swenshuai.xi /* Prototypes for exported library functions.  */
294*53ee8cc1Swenshuai.xi 
295*53ee8cc1Swenshuai.xi /* Initialize the thread debug support library.  */
296*53ee8cc1Swenshuai.xi extern td_err_e td_init (void);
297*53ee8cc1Swenshuai.xi 
298*53ee8cc1Swenshuai.xi /* Historical relict.  Should not be used anymore.  */
299*53ee8cc1Swenshuai.xi extern td_err_e td_log (void);
300*53ee8cc1Swenshuai.xi 
301*53ee8cc1Swenshuai.xi /* Return list of symbols the library can request.  */
302*53ee8cc1Swenshuai.xi extern const char **td_symbol_list (void);
303*53ee8cc1Swenshuai.xi 
304*53ee8cc1Swenshuai.xi /* Generate new thread debug library handle for process PS.  */
305*53ee8cc1Swenshuai.xi extern td_err_e td_ta_new (struct ps_prochandle *__ps, td_thragent_t **__ta);
306*53ee8cc1Swenshuai.xi 
307*53ee8cc1Swenshuai.xi /* Free resources allocated for TA.  */
308*53ee8cc1Swenshuai.xi extern td_err_e td_ta_delete (td_thragent_t *__ta);
309*53ee8cc1Swenshuai.xi 
310*53ee8cc1Swenshuai.xi /* Get number of currently running threads in process associated with TA.  */
311*53ee8cc1Swenshuai.xi extern td_err_e td_ta_get_nthreads (const td_thragent_t *__ta, int *__np);
312*53ee8cc1Swenshuai.xi 
313*53ee8cc1Swenshuai.xi /* Return process handle passed in `td_ta_new' for process associated with
314*53ee8cc1Swenshuai.xi    TA.  */
315*53ee8cc1Swenshuai.xi extern td_err_e td_ta_get_ph (const td_thragent_t *__ta,
316*53ee8cc1Swenshuai.xi 			      struct ps_prochandle **__ph);
317*53ee8cc1Swenshuai.xi 
318*53ee8cc1Swenshuai.xi /* Map thread library handle PT to thread debug library handle for process
319*53ee8cc1Swenshuai.xi    associated with TA and store result in *TH.  */
320*53ee8cc1Swenshuai.xi extern td_err_e td_ta_map_id2thr (const td_thragent_t *__ta, pthread_t __pt,
321*53ee8cc1Swenshuai.xi 				  td_thrhandle_t *__th);
322*53ee8cc1Swenshuai.xi 
323*53ee8cc1Swenshuai.xi /* Map process ID LWPID to thread debug library handle for process
324*53ee8cc1Swenshuai.xi    associated with TA and store result in *TH.  */
325*53ee8cc1Swenshuai.xi extern td_err_e td_ta_map_lwp2thr (const td_thragent_t *__ta, lwpid_t __lwpid,
326*53ee8cc1Swenshuai.xi 				   td_thrhandle_t *__th);
327*53ee8cc1Swenshuai.xi 
328*53ee8cc1Swenshuai.xi 
329*53ee8cc1Swenshuai.xi /* Call for each thread in a process associated with TA the callback function
330*53ee8cc1Swenshuai.xi    CALLBACK.  */
331*53ee8cc1Swenshuai.xi extern td_err_e td_ta_thr_iter (const td_thragent_t *__ta,
332*53ee8cc1Swenshuai.xi 				td_thr_iter_f *__callback, void *__cbdata_p,
333*53ee8cc1Swenshuai.xi 				td_thr_state_e __state, int __ti_pri,
334*53ee8cc1Swenshuai.xi 				sigset_t *__ti_sigmask_p,
335*53ee8cc1Swenshuai.xi 				unsigned int __ti_user_flags);
336*53ee8cc1Swenshuai.xi 
337*53ee8cc1Swenshuai.xi /* Call for each defined thread local data entry the callback function KI.  */
338*53ee8cc1Swenshuai.xi extern td_err_e td_ta_tsd_iter (const td_thragent_t *__ta, td_key_iter_f *__ki,
339*53ee8cc1Swenshuai.xi 				void *__p);
340*53ee8cc1Swenshuai.xi 
341*53ee8cc1Swenshuai.xi 
342*53ee8cc1Swenshuai.xi /* Get event address for EVENT.  */
343*53ee8cc1Swenshuai.xi extern td_err_e td_ta_event_addr (const td_thragent_t *__ta,
344*53ee8cc1Swenshuai.xi 				  td_event_e __event, td_notify_t *__ptr);
345*53ee8cc1Swenshuai.xi 
346*53ee8cc1Swenshuai.xi /* Enable EVENT in global mask.  */
347*53ee8cc1Swenshuai.xi extern td_err_e td_ta_set_event (const td_thragent_t *__ta,
348*53ee8cc1Swenshuai.xi 				 td_thr_events_t *__event);
349*53ee8cc1Swenshuai.xi 
350*53ee8cc1Swenshuai.xi /* Disable EVENT in global mask.  */
351*53ee8cc1Swenshuai.xi extern td_err_e td_ta_clear_event (const td_thragent_t *__ta,
352*53ee8cc1Swenshuai.xi 				   td_thr_events_t *__event);
353*53ee8cc1Swenshuai.xi 
354*53ee8cc1Swenshuai.xi /* Return information about last event.  */
355*53ee8cc1Swenshuai.xi extern td_err_e td_ta_event_getmsg (const td_thragent_t *__ta,
356*53ee8cc1Swenshuai.xi 				    td_event_msg_t *__msg);
357*53ee8cc1Swenshuai.xi 
358*53ee8cc1Swenshuai.xi 
359*53ee8cc1Swenshuai.xi /* Set suggested concurrency level for process associated with TA.  */
360*53ee8cc1Swenshuai.xi extern td_err_e td_ta_setconcurrency (const td_thragent_t *__ta, int __level);
361*53ee8cc1Swenshuai.xi 
362*53ee8cc1Swenshuai.xi 
363*53ee8cc1Swenshuai.xi /* Enable collecting statistics for process associated with TA.  */
364*53ee8cc1Swenshuai.xi extern td_err_e td_ta_enable_stats (const td_thragent_t *__ta, int __enable);
365*53ee8cc1Swenshuai.xi 
366*53ee8cc1Swenshuai.xi /* Reset statistics.  */
367*53ee8cc1Swenshuai.xi extern td_err_e td_ta_reset_stats (const td_thragent_t *__ta);
368*53ee8cc1Swenshuai.xi 
369*53ee8cc1Swenshuai.xi /* Retrieve statistics from process associated with TA.  */
370*53ee8cc1Swenshuai.xi extern td_err_e td_ta_get_stats (const td_thragent_t *__ta,
371*53ee8cc1Swenshuai.xi 				 td_ta_stats_t *__statsp);
372*53ee8cc1Swenshuai.xi 
373*53ee8cc1Swenshuai.xi 
374*53ee8cc1Swenshuai.xi /* Validate that TH is a thread handle.  */
375*53ee8cc1Swenshuai.xi extern td_err_e td_thr_validate (const td_thrhandle_t *__th);
376*53ee8cc1Swenshuai.xi 
377*53ee8cc1Swenshuai.xi /* Return information about thread TH.  */
378*53ee8cc1Swenshuai.xi extern td_err_e td_thr_get_info (const td_thrhandle_t *__th,
379*53ee8cc1Swenshuai.xi 				 td_thrinfo_t *__infop);
380*53ee8cc1Swenshuai.xi 
381*53ee8cc1Swenshuai.xi /* Retrieve floating-point register contents of process running thread TH.  */
382*53ee8cc1Swenshuai.xi extern td_err_e td_thr_getfpregs (const td_thrhandle_t *__th,
383*53ee8cc1Swenshuai.xi 				  prfpregset_t *__regset);
384*53ee8cc1Swenshuai.xi 
385*53ee8cc1Swenshuai.xi /* Retrieve general register contents of process running thread TH.  */
386*53ee8cc1Swenshuai.xi extern td_err_e td_thr_getgregs (const td_thrhandle_t *__th,
387*53ee8cc1Swenshuai.xi 				 prgregset_t __gregs);
388*53ee8cc1Swenshuai.xi 
389*53ee8cc1Swenshuai.xi /* Retrieve extended register contents of process running thread TH.  */
390*53ee8cc1Swenshuai.xi extern td_err_e td_thr_getxregs (const td_thrhandle_t *__th, void *__xregs);
391*53ee8cc1Swenshuai.xi 
392*53ee8cc1Swenshuai.xi /* Get size of extended register set of process running thread TH.  */
393*53ee8cc1Swenshuai.xi extern td_err_e td_thr_getxregsize (const td_thrhandle_t *__th, int *__sizep);
394*53ee8cc1Swenshuai.xi 
395*53ee8cc1Swenshuai.xi /* Set floating-point register contents of process running thread TH.  */
396*53ee8cc1Swenshuai.xi extern td_err_e td_thr_setfpregs (const td_thrhandle_t *__th,
397*53ee8cc1Swenshuai.xi 				  const prfpregset_t *__fpregs);
398*53ee8cc1Swenshuai.xi 
399*53ee8cc1Swenshuai.xi /* Set general register contents of process running thread TH.  */
400*53ee8cc1Swenshuai.xi extern td_err_e td_thr_setgregs (const td_thrhandle_t *__th,
401*53ee8cc1Swenshuai.xi 				 prgregset_t __gregs);
402*53ee8cc1Swenshuai.xi 
403*53ee8cc1Swenshuai.xi /* Set extended register contents of process running thread TH.  */
404*53ee8cc1Swenshuai.xi extern td_err_e td_thr_setxregs (const td_thrhandle_t *__th,
405*53ee8cc1Swenshuai.xi 				 const void *__addr);
406*53ee8cc1Swenshuai.xi 
407*53ee8cc1Swenshuai.xi 
408*53ee8cc1Swenshuai.xi /* Get address of the given module's TLS storage area for the given thread.  */
409*53ee8cc1Swenshuai.xi extern td_err_e td_thr_tlsbase (const td_thrhandle_t *__th,
410*53ee8cc1Swenshuai.xi 				unsigned long int __modid,
411*53ee8cc1Swenshuai.xi 				psaddr_t *__base);
412*53ee8cc1Swenshuai.xi 
413*53ee8cc1Swenshuai.xi /* Get address of thread local variable.  */
414*53ee8cc1Swenshuai.xi extern td_err_e td_thr_tls_get_addr (const td_thrhandle_t *__th,
415*53ee8cc1Swenshuai.xi 				     psaddr_t __map_address, size_t __offset,
416*53ee8cc1Swenshuai.xi 				     psaddr_t *__address);
417*53ee8cc1Swenshuai.xi 
418*53ee8cc1Swenshuai.xi 
419*53ee8cc1Swenshuai.xi /* Enable reporting for EVENT for thread TH.  */
420*53ee8cc1Swenshuai.xi extern td_err_e td_thr_event_enable (const td_thrhandle_t *__th, int __event);
421*53ee8cc1Swenshuai.xi 
422*53ee8cc1Swenshuai.xi /* Enable EVENT for thread TH.  */
423*53ee8cc1Swenshuai.xi extern td_err_e td_thr_set_event (const td_thrhandle_t *__th,
424*53ee8cc1Swenshuai.xi 				  td_thr_events_t *__event);
425*53ee8cc1Swenshuai.xi 
426*53ee8cc1Swenshuai.xi /* Disable EVENT for thread TH.  */
427*53ee8cc1Swenshuai.xi extern td_err_e td_thr_clear_event (const td_thrhandle_t *__th,
428*53ee8cc1Swenshuai.xi 				    td_thr_events_t *__event);
429*53ee8cc1Swenshuai.xi 
430*53ee8cc1Swenshuai.xi /* Get event message for thread TH.  */
431*53ee8cc1Swenshuai.xi extern td_err_e td_thr_event_getmsg (const td_thrhandle_t *__th,
432*53ee8cc1Swenshuai.xi 				     td_event_msg_t *__msg);
433*53ee8cc1Swenshuai.xi 
434*53ee8cc1Swenshuai.xi 
435*53ee8cc1Swenshuai.xi /* Set priority of thread TH.  */
436*53ee8cc1Swenshuai.xi extern td_err_e td_thr_setprio (const td_thrhandle_t *__th, int __prio);
437*53ee8cc1Swenshuai.xi 
438*53ee8cc1Swenshuai.xi 
439*53ee8cc1Swenshuai.xi /* Set pending signals for thread TH.  */
440*53ee8cc1Swenshuai.xi extern td_err_e td_thr_setsigpending (const td_thrhandle_t *__th,
441*53ee8cc1Swenshuai.xi 				      unsigned char __n, const sigset_t *__ss);
442*53ee8cc1Swenshuai.xi 
443*53ee8cc1Swenshuai.xi /* Set signal mask for thread TH.  */
444*53ee8cc1Swenshuai.xi extern td_err_e td_thr_sigsetmask (const td_thrhandle_t *__th,
445*53ee8cc1Swenshuai.xi 				   const sigset_t *__ss);
446*53ee8cc1Swenshuai.xi 
447*53ee8cc1Swenshuai.xi 
448*53ee8cc1Swenshuai.xi /* Return thread local data associated with key TK in thread TH.  */
449*53ee8cc1Swenshuai.xi extern td_err_e td_thr_tsd (const td_thrhandle_t *__th,
450*53ee8cc1Swenshuai.xi 			    const thread_key_t __tk, void **__data);
451*53ee8cc1Swenshuai.xi 
452*53ee8cc1Swenshuai.xi 
453*53ee8cc1Swenshuai.xi /* Suspend execution of thread TH.  */
454*53ee8cc1Swenshuai.xi extern td_err_e td_thr_dbsuspend (const td_thrhandle_t *__th);
455*53ee8cc1Swenshuai.xi 
456*53ee8cc1Swenshuai.xi /* Resume execution of thread TH.  */
457*53ee8cc1Swenshuai.xi extern td_err_e td_thr_dbresume (const td_thrhandle_t *__th);
458*53ee8cc1Swenshuai.xi 
459*53ee8cc1Swenshuai.xi #endif	/* thread_db.h */
460