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