Skip to content
Permalink
37de950b40
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
106 lines (79 sloc) 2.44 KB
/* Private header for thread debug library. */
#ifndef _THREAD_DBP_H
#define _THREAD_DBP_H 1
#include <string.h>
#include <unistd.h>
#include "proc_service.h"
#include "thread_db.h"
#include "../linuxthreads/descr.h"
/* Indeces for the symbol names. */
enum
{
PTHREAD_THREADS_EVENTS = 0,
PTHREAD_LAST_EVENT,
PTHREAD_HANDLES_NUM,
PTHREAD_HANDLES,
PTHREAD_KEYS,
LINUXTHREADS_PTHREAD_THREADS_MAX,
LINUXTHREADS_PTHREAD_KEYS_MAX,
LINUXTHREADS_PTHREAD_SIZEOF_DESCR,
LINUXTHREADS_CREATE_EVENT,
LINUXTHREADS_DEATH_EVENT,
LINUXTHREADS_REAP_EVENT,
NUM_MESSAGES
};
/* Comment out the following for less verbose output. */
#ifndef NDEBUG
# define LOG(c) if (__td_debug) __libc_write (2, c "\n", strlen (c "\n"))
extern int __td_debug;
#else
# define LOG(c)
#endif
/* Handle for a process. This type is opaque. */
struct td_thragent
{
/* Delivered by the debugger and we have to pass it back in the
proc callbacks. */
struct ps_prochandle *ph;
/* Some cached information. */
/* Address of the `__pthread_handles' array. */
struct pthread_handle_struct *handles;
/* Address of the `pthread_kyes' array. */
struct pthread_key_struct *keys;
/* Maximum number of threads. */
int pthread_threads_max;
/* Maximum number of thread-local data keys. */
int pthread_keys_max;
/* Size of 2nd level array for thread-local data keys. */
int pthread_key_2ndlevel_size;
/* Sizeof struct _pthread_descr_struct. */
int sizeof_descr;
/* Pointer to the `__pthread_threads_events' variable in the target. */
psaddr_t pthread_threads_eventsp;
/* Pointer to the `__pthread_last_event' variable in the target. */
psaddr_t pthread_last_event;
/* Pointer to the `__pthread_handles_num' variable. */
psaddr_t pthread_handles_num;
};
/* Type used internally to keep track of thread agent descriptors. */
struct agent_list
{
td_thragent_t *ta;
struct agent_list *next;
};
/* List of all known descriptors. */
extern struct agent_list *__td_agent_list;
/* Function used to test for correct thread agent pointer. */
static inline int
ta_ok (const td_thragent_t *ta)
{
struct agent_list *runp = __td_agent_list;
if (ta == NULL)
return 0;
while (runp != NULL && runp->ta != ta)
runp = runp->next;
return runp != NULL;
}
/* Internal wrapper around ps_pglobal_lookup. */
extern int td_lookup (struct ps_prochandle *ps, int idx, psaddr_t *sym_addr);
#endif /* thread_dbP.h */