Redefine ptid_t to be a struct rather than an int.

This commit is contained in:
Kevin Buettner 2001-05-15 00:03:38 +00:00
parent 67a659f60e
commit ca6724c16a
18 changed files with 263 additions and 169 deletions

View File

@ -1,3 +1,70 @@
2001-05-14 Kevin Buettner <kevinb@redhat.com>
* inferior.h (null_ptid, minus_one_ptid): New variable declarations.
(ptid_build, pid_to_ptid, ptid_get_pid, ptid_get_lwp)
(ptid_get_tid, ptid_equal): New function declarations.
* infrun.c (null_ptid, minus_one_ptid): New variables.
(ptid_build, pid_to_ptid, ptid_get_pid, ptid_get_lwp)
(ptid_get_tid, ptid_equal): New functions.
(_initialize_infrun): Initialize null_ptid, minus_one_ptid,
inferior_ptid, and target_last_wait_ptid.
* defs.h (ptid_t): Redefine to be a struct rather than an int.
(pid_to_ptid, null_ptid, ptid_equal): Delete these macros.
(PIDGET, TIDGET, MERGEPID): Redefine these macros using the
new ptid accessors and constructor.
* config/i386/tm-i386v42mp.h (PIDGET, TIDGET, LIDGET, MERGEPID,
MKLID, MKTID, ISTID): Provide new definitions for these macros.
The old macros are retained, but disabled via #if 0 in order
to aid in future restructuring. See FIXME.
* arm-linux-nat.c (PIDGET, TIDGET): Delete macro definitions.
* i386-linux-nat.c (PIDGET, TIDGET): Likewise.
* infptrace.c (PIDGET, TIDGET): Likewise.
* lin-lwp.c (PIDGET0, PIDGET, TIDGET, MERGEPID): Likewise.
* lin-thread.c (PIDGET0, PIDGET, TIDGET, MERGEPID): Likewise.
* proc-service.c (MERGEPID): Likewise.
* procfs.c (PIDGET, TIDGET, MERGEPID): Likewise.
* thread-db.c (PIDGET0, PIDGET, TIDGET, MERGEPID): Likewise.
* config/nm-linux.h (PIDGET0, PIDGET, TIDGET, MERGEPID): Likewise.
* config/i386/tm-i386sol2.h (PIDGET0, PIDGET, TIDGET, MERGEPID):
Likewise.
* config/sparc/tm-sun4sol2.h (PIDGET0, PIDGET, TIDGET, MERGEPID):
Likewise.
* lin-lwp.c (THREAD_FLAG): Delete macro definition.
(GET_LWP): Redefine in terms of ptid_get_lwp().
(GET_PID): Redefine in terms of ptid_get_pid().
(is_lwp): Redefine without the need for THREAD_FLAG.
(BUILD_LWP): Redefine in terms of ptid_build().
* lin-thread.c (THREAD_FLAG): Delete macro definition.
(GET_LWP): Redefine in terms of ptid_get_lwp().
(GET_PID): Redefine in terms of ptid_get_pid().
(GET_THREAD): Redefine in terms of ptid_get_tid().
(BUILD_THREAD, BUILD_LWP): Redefine in terms of ptid_build().
(is_lwp, is_thread): Redefine.
(linux_child_wait, check_all_signal_numbers)
(linuxthreads_discard_global_state, attach_thread): Declare these
functions to squash warnings about missing declarations.
* sol-thread.c (THREAD_FLAG): Delete macro definition.
(GET_PID): Redefine in terms of ptid_get_pid().
(GET_LWP): Redefine in terms of ptid_get_lwp().
(GET_THREAD): Redefine in terms of ptid_get_tid().
(BUILD_THREAD, BUILD_LWP): Redefine in terms of ptid_build().
(is_lwp, is_thread): Redefine.
* thread-db.c (THREAD_FLAG): Delete macro definition.
(GET_PID): Redefine in terms of ptid_get_pid().
(GET_LWP): Redefine in terms of ptid_get_lwp().
(GET_THREAD): Redefine in terms of ptid_get_tid().
(BUILD_THREAD, BUILD_LWP): Redefine in terms of ptid_build().
(is_lwp, is_thread): Redefine.
* corelow.c (add_to_thread_list, get_core_register_section):
Eliminate hacks needed to prevent regressions when inferior_ptid
wasn't wide enough to hold the core file thread id in the pid
component of inferior_ptid.
2001-05-14 Michael Snyder <msnyder@redhat.com>
* remote.c (hex2bin): Make first argument const.

View File

@ -79,14 +79,8 @@ static unsigned int os_version, os_major, os_minor, os_release;
/* On Linux, threads are implemented as pseudo-processes, in which
case we may be tracing more than one process at a time. In that
case, inferior_ptid will contain the main process ID and the
individual thread (process) ID mashed together. These macros are
used to separate them out. These definitions should be overridden
if thread support is included. */
#if !defined (PIDGET) /* Default definition for PIDGET/TIDGET. */
#define PIDGET(PID) PID
#define TIDGET(PID) 0
#endif
individual thread (process) ID. get_thread_id () is used to
get the thread id if it's available, and the process id otherwise. */
int
get_thread_id (ptid_t ptid)

View File

@ -51,12 +51,4 @@ extern char *sunpro_static_transform_name (char *);
#define FAULTED_USE_SIGINFO
/* Macros to extract process id and thread id from a composite pid/tid.
Allocate lower 16 bits for process id, next 15 bits for thread id, and
one bit for a flag to indicate a user thread vs. a kernel thread. */
#define PIDGET0(PID) (((PID) & 0xffff))
#define PIDGET(PID) ((PIDGET0 (PID) == 0xffff) ? -1 : PIDGET0 (PID))
#define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
#endif /* ifndef TM_I386SOL2_H */

View File

@ -30,6 +30,7 @@
#define UNIXWARE
#if 0
/* The following macros extract process and lwp/thread ids from a
composite id.
@ -43,8 +44,7 @@
#define PIDBITS 16
/* Return the process id stored in composite PID. */
#define PIDGET0(PID) (((PID) & ((1 << PIDBITS) - 1)))
#define PIDGET(PID) ((PIDGET0 (PID) == ((1 << PIDBITS) -1)) ? -1 : PIDGET0 (PID))
#define PIDGET(PID) (((PID) & ((1 << PIDBITS) - 1)))
/* Return the thread or lwp id stored in composite PID. */
#define TIDGET(PID) (((PID) & 0x3fffffff) >> PIDBITS)
@ -61,5 +61,33 @@
/* Return whether PID contains a user-space thread id. */
#define ISTID(PID) ((PID) & 0x40000000)
#endif
/* New definitions of the ptid stuff. Due to the way the
code is structured in uw-thread.c, I'm overloading the thread id
and lwp id onto the lwp field. The tid field is used to indicate
whether the lwp is a tid or not.
FIXME: Check that core file support is not broken. (See original
#if 0'd comments above.)
FIXME: Restructure uw-thread.c so that the struct ptid fields
can be used as intended. */
/* Return the process id stored in composite PID. */
#define PIDGET(PID) (ptid_get_pid (PID))
/* Return the thread or lwp id stored in composite PID. */
#define TIDGET(PID) (ptid_get_lwp (PID))
#define LIDGET(PID) TIDGET(PID)
#define MERGEPID(PID, LID) (ptid_build ((PID), (LID), 0))
#define MKLID(PID, LID) (ptid_build ((PID), (LID), 0))
/* Construct a composite id from thread TID and the process portion of
composite PID. */
#define MKTID(PID, TID) (ptid_build ((PID), (TID), 1))
/* Return whether PID contains a user-space thread id. */
#define ISTID(PID) (ptid_get_tid (PID))
#endif /* ifndef TM_I386V42MP_H */

View File

@ -49,14 +49,6 @@ extern int linuxthreads_prepare_to_proceed (int step);
/* Defined to make stepping-over-breakpoints be thread-atomic. */
#define USE_THREAD_STEP_NEEDED 1
/* Macros to extract process id and thread id from a composite pid/tid.
Allocate lower 19 bits for process id, next 12 bits for thread id, and
one bit for a flag to indicate a user thread vs. a kernel thread. */
#define PIDGET0(PID) (((PID) & 0xffff))
#define PIDGET(PID) ((PIDGET0 (PID) == 0xffff) ? -1 : PIDGET0 (PID))
#define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
/* Use elf_gregset_t and elf_fpregset_t, rather than
gregset_t and fpregset_t. */

View File

@ -80,9 +80,3 @@ extern char *sunpro_static_transform_name (char *);
/* Enable handling of shared libraries for a.out executables. */
#define HANDLE_SVR4_EXEC_EMULATORS
/* Macros to extract process id and thread id from a composite pid/tid */
#define PIDGET0(PID) (((PID) & 0xffff))
#define PIDGET(PID) ((PIDGET0 (PID) == 0xffff) ? -1 : PIDGET0 (PID))
#define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))

View File

@ -248,14 +248,7 @@ add_to_thread_list (bfd *abfd, asection *asect, PTR reg_sect_arg)
if (reg_sect != NULL
&& asect->filepos == reg_sect->filepos) /* Did we find .reg? */
#ifdef pid_to_ptid
/* Needed to prevent regressions in ptid conversion phase 1. This
bit of code will be deleted in favor of the #else branch in
phase 3. */
inferior_ptid = thread_id; /* Yes, make it current */
#else
inferior_ptid = pid_to_ptid (thread_id); /* Yes, make it current */
#endif
}
/* This routine opens and sets up the core file bfd. */
@ -413,16 +406,8 @@ get_core_register_section (char *name,
bfd_size_type size;
char *contents;
#ifdef pid_to_ptid
/* Needed to prevent regressions in ptid conversion phase 1. This
bit of code will be deleted in favor of the #else branch in
phase 3. */
if (inferior_ptid)
sprintf (section_name, "%s/%d", name, inferior_ptid);
#else
if (PIDGET (inferior_ptid))
sprintf (section_name, "%s/%d", name, PIDGET (inferior_ptid));
#endif
else
strcpy (section_name, name);

View File

@ -844,36 +844,37 @@ enum val_prettyprint
Val_pretty_default
};
/* A collection of the various "ids" necessary for identifying
the inferior. This consists of the process id (pid, thread
id (tid), and other fields necessary for uniquely identifying
the inferior process/thread being debugged.
/* The ptid struct is a collection of the various "ids" necessary
for identifying the inferior. This consists of the process id
(pid), thread id (tid), and other fields necessary for uniquely
identifying the inferior process/thread being debugged. When
manipulating ptids, the constructors, accessors, and predicate
declared in inferior.h should be used. These are as follows:
The present typedef is obviously quite naive with respect to
the magnitudes that real life pids and tids can take on and
will be replaced with something more robust shortly. */
ptid_build - Make a new ptid from a pid, lwp, and tid.
pid_to_ptid - Make a new ptid from just a pid.
ptid_get_pid - Fetch the pid component of a ptid.
ptid_get_lwp - Fetch the lwp component of a ptid.
ptid_get_tid - Fetch the tid component of a ptid.
ptid_equal - Test to see if two ptids are equal.
typedef int ptid_t;
Please do NOT access the struct ptid members directly (except, of
course, in the implementation of the above ptid manipulation
functions). */
/* Convert a pid to a ptid_t. This macro is temporary and will
be replaced shortly. */
struct ptid
{
/* Process id */
int pid;
#define pid_to_ptid(PID) ((ptid_t) MERGEPID ((PID),0))
/* Lightweight process id */
long lwp;
/* Define a value for the null (or zero) pid. This macro is temporary
and will go away shortly. */
/* Thread id */
long tid;
};
#define null_ptid (pid_to_ptid (0))
/* Define a value for the -1 pid. This macro is temporary and will go
away shortly. */
#define minus_one_ptid (pid_to_ptid (-1))
/* Define a ptid comparison operator. This macro is temporary and will
be replaced with a real function shortly. */
#define ptid_equal(PTID1,PTID2) ((PTID1) == (PTID2))
typedef struct ptid ptid_t;
@ -1391,15 +1392,16 @@ extern int use_windows;
#define ROOTED_P(X) (SLASH_P((X)[0]))
#endif
/* On some systems, PIDGET is defined to extract the inferior pid from
an internal pid that has the thread id and pid in seperate bit
fields. If not defined, then just use the entire internal pid as
the actual pid. */
/* Provide default definitions of PIDGET, TIDGET, and MERGEPID.
The name ``TIDGET'' is a historical accident. Many uses of TIDGET
in the code actually refer to a lightweight process id, i.e,
something that can be considered a process id in its own right for
certain purposes. */
#ifndef PIDGET
#define PIDGET(PID) (PID)
#define TIDGET(PID) 0
#define MERGEPID(PID, TID) (PID)
#define PIDGET(PTID) (ptid_get_pid (PTID))
#define TIDGET(PTID) (ptid_get_lwp (PTID))
#define MERGEPID(PID, TID) ptid_build (PID, TID, 0)
#endif
/* Define well known filenos if the system does not define them. */

View File

@ -61,17 +61,6 @@
/* Prototypes for local functions. */
static void dummy_sse_values (void);
/* On Linux, threads are implemented as pseudo-processes, in which
case we may be tracing more than one process at a time. In that
case, inferior_ptid will contain the main process ID and the
individual thread (process) ID mashed together. These macros are
used to separate them out. These definitions should be overridden
if thread support is included. */
#if !defined (PIDGET) /* Default definition for PIDGET/TIDGET. */
#define PIDGET(PID) PID
#define TIDGET(PID) 0
#endif
/* The register sets used in Linux ELF core-dumps are identical to the

View File

@ -51,6 +51,33 @@ extern void write_inferior_status_register (struct inferior_status
*inf_status, int regno,
LONGEST val);
/* The -1 ptid, often used to indicate either an error condition
or a "don't care" condition, i.e, "run all threads." */
extern ptid_t minus_one_ptid;
/* The null or zero ptid, often used to indicate no process. */
extern ptid_t null_ptid;
/* Attempt to find and return an existing ptid with the given PID, LWP,
and TID components. If none exists, create a new one and return
that. */
ptid_t ptid_build (int pid, long lwp, long tid);
/* Find/Create a ptid from just a pid. */
ptid_t pid_to_ptid (int pid);
/* Fetch the pid (process id) component from a ptid. */
int ptid_get_pid (ptid_t ptid);
/* Fetch the lwp (lightweight process) component from a ptid. */
long ptid_get_lwp (ptid_t ptid);
/* Fetch the tid (thread id) component from a ptid. */
long ptid_get_tid (ptid_t ptid);
/* Compare two ptids to see if they are equal */
extern int ptid_equal (ptid_t p1, ptid_t p2);
/* Save value of inferior_ptid so that it may be restored by
a later call to do_cleanups(). Returns the struct cleanup
pointer needed for later doing the cleanup. */

View File

@ -110,22 +110,6 @@ static void fetch_register (int);
static void store_register (int);
#endif
/*
* Some systems (Linux) may have threads implemented as pseudo-processes,
* in which case we may be tracing more than one process at a time.
* In that case, inferior_pid will contain the main process ID and the
* individual thread (process) id mashed together. These macros are
* used to separate them out. The definitions may be overridden in tm.h
*
* NOTE: default definitions here are for systems with no threads.
* Useful definitions MUST be provided in tm.h
*/
#if !defined (PIDGET) /* Default definition for PIDGET/TIDGET. */
#define PIDGET(PID) PID
#define TIDGET(PID) 0
#endif
void _initialize_kernel_u_addr (void);
void _initialize_infptrace (void);

View File

@ -4192,7 +4192,67 @@ discard_inferior_status (struct inferior_status *inf_status)
free_inferior_status (inf_status);
}
/* Helper function for save_inferior_ptid */
/* Oft used ptids */
ptid_t null_ptid;
ptid_t minus_one_ptid;
/* Create a ptid given the necessary PID, LWP, and TID components. */
ptid_t
ptid_build (int pid, long lwp, long tid)
{
ptid_t ptid;
ptid.pid = pid;
ptid.lwp = lwp;
ptid.tid = tid;
return ptid;
}
/* Create a ptid from just a pid. */
ptid_t
pid_to_ptid (int pid)
{
return ptid_build (pid, 0, 0);
}
/* Fetch the pid (process id) component from a ptid. */
int
ptid_get_pid (ptid_t ptid)
{
return ptid.pid;
}
/* Fetch the lwp (lightweight process) component from a ptid. */
long
ptid_get_lwp (ptid_t ptid)
{
return ptid.lwp;
}
/* Fetch the tid (thread id) component from a ptid. */
long
ptid_get_tid (ptid_t ptid)
{
return ptid.tid;
}
/* ptid_equal() is used to test equality of two ptids. */
int
ptid_equal (ptid_t ptid1, ptid_t ptid2)
{
return (ptid1.pid == ptid2.pid && ptid1.lwp == ptid2.lwp
&& ptid1.tid == ptid2.tid);
}
/* restore_inferior_ptid() will be used by the cleanup machinery
to restore the inferior_ptid value saved in a call to
save_inferior_ptid(). */
static void
restore_inferior_ptid (void *arg)
@ -4400,4 +4460,10 @@ instruction of that function. Otherwise, the function is skipped and\n\
the step command stops at a different source line.",
&setlist);
add_show_from_set (c, &showlist);
/* ptid initializations */
null_ptid = ptid_build (0, 0, 0);
minus_one_ptid = ptid_build (-1, 0, 0);
inferior_ptid = null_ptid;
target_last_wait_ptid = minus_one_ptid;
}

View File

@ -102,18 +102,10 @@ static int num_lwps;
static int threaded;
#ifndef TIDGET
#define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
#define PIDGET0(PID) (((PID) & 0xffff))
#define PIDGET(PID) ((PIDGET0 (PID) == 0xffff) ? -1 : PIDGET0 (PID))
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
#endif
#define THREAD_FLAG 0x80000000
#define is_lwp(pid) (((pid) & THREAD_FLAG) == 0 && TIDGET (pid))
#define GET_LWP(pid) TIDGET (pid)
#define GET_PID(pid) PIDGET (pid)
#define BUILD_LWP(tid, pid) MERGEPID (pid, tid)
#define GET_LWP(ptid) ptid_get_lwp (ptid)
#define GET_PID(ptid) ptid_get_pid (ptid)
#define is_lwp(ptid) (GET_LWP (ptid) != 0)
#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
#define is_cloned(pid) (GET_LWP (pid) != GET_PID (pid))

View File

@ -125,21 +125,25 @@
/* Prototypes for supply_gregset etc. */
#include "gregset.h"
#ifndef TIDGET
#define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
#define PIDGET0(PID) (((PID) & 0xffff))
#define PIDGET(PID) ((PIDGET0 (PID) == 0xffff) ? -1 : PIDGET0 (PID))
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
#endif
/* Macros for superimposing PID and TID into inferior_ptid. */
#define THREAD_FLAG 0x80000000
#define is_thread(ARG) (((ARG) & THREAD_FLAG) != 0)
#define is_lwp(ARG) (((ARG) & THREAD_FLAG) == 0)
#define GET_LWP(PID) TIDGET (PID)
#define GET_THREAD(PID) TIDGET (PID)
#define BUILD_LWP(TID, PID) MERGEPID (PID, TID)
#define BUILD_THREAD(TID, PID) (MERGEPID (PID, TID) | THREAD_FLAG)
#define GET_PID(ptid) ptid_get_pid (ptid)
#define GET_LWP(ptid) ptid_get_lwp (ptid)
#define GET_THREAD(ptid) ptid_get_tid (ptid)
#define is_lwp(ptid) (GET_LWP (ptid) != 0)
#define is_thread(ptid) (GET_THREAD (ptid) != 0)
#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
#define BUILD_THREAD(tid, pid) ptid_build (pid, 0, tid)
/* From linux-thread.c. FIXME: These should go in a separate header
file, but I'm told that the life expectancy of lin-thread.c and
linux-thread.c isn't very long... */
extern int linux_child_wait (int, int *, int *);
extern void check_all_signal_numbers (void);
extern void linuxthreads_discard_global_state (void);
extern void attach_thread (int);
/*
* target_beneath is a pointer to the target_ops underlying this one.

View File

@ -51,10 +51,6 @@ typedef size_t gdb_ps_size_t;
/* Building process ids. */
#ifndef MERGEPID
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
#endif
#define BUILD_LWP(tid, pid) MERGEPID (pid, tid)

View File

@ -315,18 +315,6 @@ typedef prstatus_t gdb_prstatus_t;
typedef prstatus_t gdb_lwpstatus_t;
#endif /* NEW_PROC_API */
/* Provide default composite pid manipulation macros for systems that
don't have threads. */
#ifndef PIDGET
#define PIDGET(PID) (PID)
#define TIDGET(PID) (PID)
#endif
#ifndef MERGEPID
#define MERGEPID(PID, TID) (PID)
#endif
typedef struct procinfo {
struct procinfo *next;
int pid; /* Process ID */

View File

@ -111,14 +111,15 @@ static void init_sol_core_ops (void);
/* Default definitions: These must be defined in tm.h
if they are to be shared with a process module such as procfs. */
#define THREAD_FLAG 0x80000000
#define is_thread(ARG) (((ARG) & THREAD_FLAG) != 0)
#define is_lwp(ARG) (((ARG) & THREAD_FLAG) == 0)
#define GET_LWP(PID) TIDGET (PID)
#define GET_THREAD(PID) TIDGET (PID)
#define BUILD_LWP(TID, PID) MERGEPID (PID, TID)
#define GET_PID(ptid) ptid_get_pid (ptid)
#define GET_LWP(ptid) ptid_get_lwp (ptid)
#define GET_THREAD(ptid) ptid_get_tid (ptid)
#define BUILD_THREAD(TID, PID) (MERGEPID (PID, TID) | THREAD_FLAG)
#define is_lwp(ptid) (GET_LWP (ptid) != 0)
#define is_thread(ptid) (GET_THREAD (ptid) != 0)
#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
#define BUILD_THREAD(tid, pid) ptid_build (pid, 0, tid)
/* Pointers to routines from lithread_db resolved by dlopen() */

View File

@ -123,24 +123,17 @@ static void thread_db_find_new_threads (void);
/* Building process ids. */
#ifndef TIDGET
#define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
#define PIDGET0(PID) (((PID) & 0xffff))
#define PIDGET(PID) ((PIDGET0 (PID) == 0xffff) ? -1 : PIDGET0 (PID))
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
#endif
#define THREAD_FLAG 0x80000000
#define GET_PID(ptid) ptid_get_pid (ptid)
#define GET_LWP(ptid) ptid_get_lwp (ptid)
#define GET_THREAD(ptid) ptid_get_tid (ptid)
#define is_lwp(pid) (((pid) & THREAD_FLAG) == 0 && TIDGET (pid))
#define is_thread(pid) ((pid) & THREAD_FLAG)
#define is_lwp(ptid) (GET_LWP (ptid) != 0)
#define is_thread(ptid) (GET_THREAD (ptid) != 0)
#define GET_PID(pid) PIDGET (pid)
#define GET_LWP(pid) TIDGET (pid)
#define GET_THREAD(pid) TIDGET (pid)
#define BUILD_LWP(lwp, pid) ptid_build (pid, lwp, 0)
#define BUILD_THREAD(tid, pid) ptid_build (pid, 0, tid)
#define BUILD_LWP(tid, pid) MERGEPID (pid, tid)
#define BUILD_THREAD(tid, pid) (MERGEPID (pid, tid) | THREAD_FLAG)
struct private_thread_info