📄 thread_db.h
字号:
/* Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */#ifndef _THREAD_DB_H#define _THREAD_DB_H 1/* This is the debugger interface for the LinuxThreads library. It is modelled closely after the interface with same names in Solaris with the goal to share the same code in the debugger. */#include <pthread.h>#include <stdint.h>#include <sys/types.h>#include <sys/procfs.h>/* Error codes of the library. */typedef enum{ TD_OK, /* No error. */ TD_ERR, /* No further specified error. */ TD_NOTHR, /* No matching thread found. */ TD_NOSV, /* No matching synchronization handle found. */ TD_NOLWP, /* No matching light-weighted process found. */ TD_BADPH, /* Invalid process handle. */ TD_BADTH, /* Invalid thread handle. */ TD_BADSH, /* Invalid synchronization handle. */ TD_BADTA, /* Invalid thread agent. */ TD_BADKEY, /* Invalid key. */ TD_NOMSG, /* No event available. */ TD_NOFPREGS, /* No floating-point register content available. */ TD_NOLIBTHREAD, /* Application not linked with thread library. */ TD_NOEVENT, /* Requested event is not supported. */ TD_NOCAPAB, /* Capability not available. */ TD_DBERR, /* Internal debug library error. */ TD_NOAPLIC, /* Operation is not applicable. */ TD_NOTSD, /* No thread-specific data available. */ TD_MALLOC, /* Out of memory. */ TD_PARTIALREG, /* Not entire register set was read or written. */ TD_NOXREGS, /* X register set not available for given thread. */ TD_NOTALLOC, /* TLS memory not yet allocated. */ TD_VERSION /* Version if libpthread and libthread_db do not match. */} td_err_e;/* Possible thread states. TD_THR_ANY_STATE is a pseudo-state used to select threads regardless of state in td_ta_thr_iter(). */typedef enum{ TD_THR_ANY_STATE, TD_THR_UNKNOWN, TD_THR_STOPPED, TD_THR_RUN, TD_THR_ACTIVE, TD_THR_ZOMBIE, TD_THR_SLEEP, TD_THR_STOPPED_ASLEEP} td_thr_state_e;/* Thread type: user or system. TD_THR_ANY_TYPE is a pseudo-type used to select threads regardless of type in td_ta_thr_iter(). */typedef enum{ TD_THR_ANY_TYPE, TD_THR_USER, TD_THR_SYSTEM} td_thr_type_e;/* Types of the debugging library. *//* Handle for a process. This type is opaque. */typedef struct td_thragent td_thragent_t;/* The actual thread handle type. This is also opaque. */typedef struct td_thrhandle{ td_thragent_t *th_ta_p; psaddr_t th_unique;} td_thrhandle_t;/* Forward declaration of a type defined by and for the dynamic linker. */struct link_map;/* Flags for `td_ta_thr_iter'. */#define TD_THR_ANY_USER_FLAGS 0xffffffff#define TD_THR_LOWEST_PRIORITY -20#define TD_SIGNO_MASK NULL#define TD_EVENTSIZE 2#define BT_UISHIFT 5 /* log base 2 of BT_NBIPUI, to extract word index */#define BT_NBIPUI (1 << BT_UISHIFT) /* n bits per uint */#define BT_UIMASK (BT_NBIPUI - 1) /* to extract bit index *//* Bitmask of enabled events. */typedef struct td_thr_events{ uint32_t event_bits[TD_EVENTSIZE];} td_thr_events_t;/* Event set manipulation macros. */#define __td_eventmask(n) \ (UINT32_C (1) << (((n) - 1) & BT_UIMASK))#define __td_eventword(n) \ ((UINT32_C ((n) - 1)) >> BT_UISHIFT)#define td_event_emptyset(setp) \ do { \ int __i; \ for (__i = TD_EVENTSIZE; __i > 0; --__i) \ (setp)->event_bits[__i - 1] = 0; \ } while (0)#define td_event_fillset(setp) \ do { \ int __i; \ for (__i = TD_EVENTSIZE; __i > 0; --__i) \ (setp)->event_bits[__i - 1] = UINT32_C (0xffffffff); \ } while (0)#define td_event_addset(setp, n) \ (((setp)->event_bits[__td_eventword (n)]) |= __td_eventmask (n))#define td_event_delset(setp, n) \ (((setp)->event_bits[__td_eventword (n)]) &= ~__td_eventmask (n))#define td_eventismember(setp, n) \ (__td_eventmask (n) & ((setp)->event_bits[__td_eventword (n)]))#if TD_EVENTSIZE == 2# define td_eventisempty(setp) \ (!((setp)->event_bits[0]) && !((setp)->event_bits[1]))#else# error "td_eventisempty must be changed to match TD_EVENTSIZE"#endif/* Events reportable by the thread implementation. */typedef enum{ TD_ALL_EVENTS, /* Pseudo-event number. */ TD_EVENT_NONE = TD_ALL_EVENTS, /* Depends on context. */ TD_READY, /* Is executable now. */ TD_SLEEP, /* Blocked in a synchronization obj. */ TD_SWITCHTO, /* Now assigned to a process. */ TD_SWITCHFROM, /* Not anymore assigned to a process. */ TD_LOCK_TRY, /* Trying to get an unavailable lock. */ TD_CATCHSIG, /* Signal posted to the thread. */ TD_IDLE, /* Process getting idle. */ TD_CREATE, /* New thread created. */ TD_DEATH, /* Thread terminated. */ TD_PREEMPT, /* Preempted. */ TD_PRI_INHERIT, /* Inherited elevated priority. */ TD_REAP, /* Reaped. */ TD_CONCURRENCY, /* Number of processes changing. */ TD_TIMEOUT, /* Conditional variable wait timed out. */ TD_MIN_EVENT_NUM = TD_READY, TD_MAX_EVENT_NUM = TD_TIMEOUT, TD_EVENTS_ENABLE = 31 /* Event reporting enabled. */} td_event_e;/* Values representing the different ways events are reported. */typedef enum{ NOTIFY_BPT, /* User must insert breakpoint at u.bptaddr. */ NOTIFY_AUTOBPT, /* Breakpoint at u.bptaddr is automatically inserted. */ NOTIFY_SYSCALL /* System call u.syscallno will be invoked. */} td_notify_e;/* Description how event type is reported. */typedef struct td_notify{ td_notify_e type; /* Way the event is reported. */ union { psaddr_t bptaddr; /* Address of breakpoint. */ int syscallno; /* Number of system call used. */ } u;} td_notify_t;/* Structure used to report event. */typedef struct td_event_msg{ td_event_e event; /* Event type being reported. */ const td_thrhandle_t *th_p; /* Thread reporting the event. */ union {# if 0 td_synchandle_t *sh; /* Handle of synchronization object. */#endif uintptr_t data; /* Event specific data. */ } msg;} td_event_msg_t;/* Structure containing event data available in each thread structure. */typedef struct{ td_thr_events_t eventmask; /* Mask of enabled events. */ td_event_e eventnum; /* Number of last event. */ void *eventdata; /* Data associated with event. */} td_eventbuf_t;/* Gathered statistics about the process. */typedef struct td_ta_stats{ int nthreads; /* Total number of threads in use. */ int r_concurrency; /* Concurrency level requested by user. */ int nrunnable_num; /* Average runnable threads, numerator. */ int nrunnable_den; /* Average runnable threads, denominator. */ int a_concurrency_num; /* Achieved concurrency level, numerator. */ int a_concurrency_den; /* Achieved concurrency level, denominator. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -