From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31293 invoked by alias); 14 Jan 2011 12:38:49 -0000 Received: (qmail 30771 invoked by uid 22791); 14 Jan 2011 12:38:45 -0000 X-SWARE-Spam-Status: No, hits=0.3 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,TBC,TW_BJ,TW_EG,TW_TN,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO glazunov.sibelius.xs4all.nl) (83.163.83.176) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 14 Jan 2011 12:38:38 +0000 Received: from glazunov.sibelius.xs4all.nl (kettenis@localhost [127.0.0.1]) by glazunov.sibelius.xs4all.nl (8.14.3/8.14.3) with ESMTP id p0ECcBDb005673; Fri, 14 Jan 2011 13:38:11 +0100 (CET) Received: (from kettenis@localhost) by glazunov.sibelius.xs4all.nl (8.14.3/8.14.3/Submit) id p0ECc9da024165; Fri, 14 Jan 2011 13:38:09 +0100 (CET) Date: Fri, 14 Jan 2011 12:47:00 -0000 Message-Id: <201101141238.p0ECc9da024165@glazunov.sibelius.xs4all.nl> From: Mark Kettenis To: alves.ped@gmail.com CC: gdb-patches@sourceware.org, mark.kettenis@xs4all.nl, brobecker@adacore.com In-reply-to: <201101141230.30669.alves.ped@gmail.com> (message from Pedro Alves on Fri, 14 Jan 2011 12:30:30 +0000) Subject: Re: [commit/hpux] delete hpux_pid_to_str (unused) References: <1294963328-25384-1-git-send-email-brobecker@adacore.com> <201101141100.p0EB0C2Q003814@glazunov.sibelius.xs4all.nl> <201101141230.30669.alves.ped@gmail.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-01/txt/msg00323.txt.bz2 > From: Pedro Alves > Date: Fri, 14 Jan 2011 12:30:30 +0000 > > On Friday 14 January 2011 11:00:12, Mark Kettenis wrote: > > > From: Joel Brobecker > > > Date: Thu, 13 Jan 2011 19:02:08 -0500 > > > > > > This is something that Tom noticed, and told me about by email. > > > > > > This function is unused, and the default formatting routine does > > > > > > just fine, I think. On pa-hpux: > > > [New process 12565, lwp 2513] > > > [New process 12565, lwp 2514] > > > > Hmm, actually I think hpux-thread.c is only relevant for the userland > > threads (DCE) implementation that was available as an add-on to HP-UX > > 10.x. In that context, the hpux_pid_to_str() function makes a little > > bit more sense that the default. > > > > However, I think hpux-thread.c can be considered to be dead. The > > HP-UX 10.20 systems I have access don't have the DCE stuff installed > > on them, so I've never actually tested it. I vaguely remember that > > the code doesn't even compile on machines that have the DCE stuff > > installed. > > > > Any objections if I kill it? > > Not from me! It _is_ dead weight. I wrote on: > > > > that hpux-thread.c is: > > - implemented on top of deprecated_child_ops. deprecated_child_ops is > just a dummy target that does nothing. This was an alternative to removing > hpux-thread.c completely at some point in the past. So this file is just > dead wait at this point, patiently waiting for someone to salvage it. > > - implemented as a process_stratum target using the ancient > child_suppress_run hack. Salvaging this target would mean turning it > into a thread_stratum target. I'm looking at the code, and I can > tell you that without adding any new features, just translating the > mechanisms, that most of the file would disappear. The mildly interesting > bits left are the register access code, and the objfile callback that > detects the thread support is active in the inferior. We're talking about > a couple dozens of lines of code. > > I wrote a patch getting rid of it at the time, but then never posted it, > waiting for Dave's comments. See below. I see he replied, but for > some reason I didn't see the reply until now... (maybe he replied by > email, and that's been broken, in that it doesn't generate an > email to gdb-prs@...). He doesn't object, so... Please go ahead. > gdb/Makefile.in | 5 > gdb/configure | 21 - > gdb/configure.ac | 16 - > gdb/hppa-hpux-nat.c | 13 - > gdb/hpux-thread.c | 587 > ---------------------------------------------------- > 5 files changed, 642 deletions(-) > > Index: src/gdb/Makefile.in > =================================================================== > --- src.orig/gdb/Makefile.in 2011-01-13 15:07:14.000000000 +0000 > +++ src/gdb/Makefile.in 2011-01-14 12:25:12.338101006 +0000 > @@ -1503,11 +1503,6 @@ ALLDEPFILES = \ > # Some files need explicit build rules (due to -Werror problems) or due > # to sub-directory fun 'n' games. > > -hpux-thread.o: $(srcdir)/hpux-thread.c > - $(COMPILE) -I$(srcdir)/osf-share -I$(srcdir)/osf-share/HP800 \ > - -I/usr/include/dce $(srcdir)/hpux-thread.c > - $(POSTCOMPILE) > - > # main.o needs an explicit build rule to get TARGET_SYSTEM_ROOT and BINDIR. > main.o: $(srcdir)/main.c > $(COMPILE) $(TARGET_SYSTEM_ROOT_DEFINE) -DBINDIR=\"$(bindir)\" > $(srcdir)/main.c > Index: src/gdb/configure > =================================================================== > --- src.orig/gdb/configure 2011-01-13 10:47:50.000000000 +0000 > +++ src/gdb/configure 2011-01-14 12:25:12.348101000 +0000 > @@ -14328,27 +14328,6 @@ $as_echo "$found" >&6; } > > if test ${build} = ${host} -a ${host} = ${target} ; then > case ${host_os} in > - hpux*) > - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for HPUX/OSF thread > support" >&5 > -$as_echo_n "checking for HPUX/OSF thread support... " >&6; } > - if test -f /usr/include/dce/cma_config.h ; then > - if test "$GCC" = "yes" ; then > - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 > -$as_echo "yes" >&6; } > - > -$as_echo "#define HAVE_HPUX_THREAD_SUPPORT 1" >>confdefs.h > - > - CONFIG_OBS="${CONFIG_OBS} hpux-thread.o" > - CONFIG_SRCS="${CONFIG_SRCS} hpux-thread.c" > - else > - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (suppressed > because you are not using GCC)" >&5 > -$as_echo "no (suppressed because you are not using GCC)" >&6; } > - fi > - else > - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 > -$as_echo "no" >&6; } > - fi > - ;; > solaris*) > # See if thread_db library is around for Solaris thread debugging. > # Note that we must explicitly test for version 1 of the library > Index: src/gdb/configure.ac > =================================================================== > --- src.orig/gdb/configure.ac 2011-01-13 15:07:19.000000000 +0000 > +++ src/gdb/configure.ac 2011-01-14 12:25:12.348101000 +0000 > @@ -1528,22 +1528,6 @@ dnl and not doing a canadian cross build > > if test ${build} = ${host} -a ${host} = ${target} ; then > case ${host_os} in > - hpux*) > - AC_MSG_CHECKING(for HPUX/OSF thread support) > - if test -f /usr/include/dce/cma_config.h ; then > - if test "$GCC" = "yes" ; then > - AC_MSG_RESULT(yes) > - AC_DEFINE(HAVE_HPUX_THREAD_SUPPORT, 1, > - [Define if you have HPUX threads]) > - CONFIG_OBS="${CONFIG_OBS} hpux-thread.o" > - CONFIG_SRCS="${CONFIG_SRCS} hpux-thread.c" > - else > - AC_MSG_RESULT(no (suppressed because you are not using GCC)) > - fi > - else > - AC_MSG_RESULT(no) > - fi > - ;; > solaris*) > # See if thread_db library is around for Solaris thread debugging. > # Note that we must explicitly test for version 1 of the library > Index: src/gdb/hppa-hpux-nat.c > =================================================================== > --- src.orig/gdb/hppa-hpux-nat.c 2011-01-13 15:07:22.000000000 +0000 > +++ src/gdb/hppa-hpux-nat.c 2011-01-14 12:25:12.348101000 +0000 > @@ -35,9 +35,6 @@ > #include "inf-ptrace.h" > #include "inf-ttrace.h" > > -/* Non-zero if we should pretend not to be a runnable target. */ > -int child_suppress_run = 0; > - > /* Return the offset of register REGNUM within `struct save_state'. > The offset returns depends on the flags in the "flags" register and > the register size (32-bit or 64-bit). These are taken from > @@ -236,15 +233,6 @@ hppa_hpux_store_inferior_registers (stru > hppa_hpux_store_register (regcache, regnum); > } > > -static int > -hppa_hpux_child_can_run (void) > -{ > - /* This variable is controlled by modules that layer their own > - process structure atop that provided here. The code in > - hpux-thread.c does this to support the HP-UX user-mode DCE > - threads. */ > - return !child_suppress_run; > -} > > > /* Prevent warning from -Wmissing-prototypes. */ > @@ -263,7 +251,6 @@ _initialize_hppa_hpux_nat (void) > > t->to_fetch_registers = hppa_hpux_fetch_inferior_registers; > t->to_store_registers = hppa_hpux_store_inferior_registers; > - t->to_can_run = hppa_hpux_child_can_run; > > add_target (t); > } > Index: src/gdb/hpux-thread.c > =================================================================== > --- src.orig/gdb/hpux-thread.c 2011-01-13 15:07:23.000000000 +0000 > +++ /dev/null 1970-01-01 00:00:00.000000000 +0000 > @@ -1,587 +0,0 @@ > -/* Low level interface for debugging HPUX/DCE threads for GDB, the GNU > - debugger. > - > - Copyright (C) 1996, 1998, 1999, 2000, 2001, 2004, 2007, 2008, 2009, 2010, > - 2011 Free Software Foundation, Inc. > - > - This file is part of GDB. > - > - This program is free software; you can redistribute it and/or modify > - it under the terms of the GNU General Public License as published by > - the Free Software Foundation; either version 3 of the License, or > - (at your option) any later version. > - > - This program 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 General Public License for more details. > - > - You should have received a copy of the GNU General Public License > - along with this program. If not, see . */ > - > -/* This module implements a sort of half target that sits between the > - machine-independent parts of GDB and the ptrace interface (infptrace.c) to > - provide access to the HPUX user-mode thread implementation. > - > - HPUX threads are true user-mode threads, which are invoked via the cma_* > - and pthread_* (DCE and Posix respectively) interfaces. These are mostly > - implemented in user-space, with all thread context kept in various > - structures that live in the user's heap. For the most part, the kernel > has > - no knowlege of these threads. */ > - > -#include "defs.h" > - > -#define _CMA_NOWRAPPERS_ > - > -#include > -#include > -#include "gdbthread.h" > -#include "target.h" > -#include "inferior.h" > -#include "regcache.h" > -#include > -#include > -#include "gdb_stat.h" > -#include "gdbcore.h" > -#include "hppa-tdep.h" > -#include "observer.h" > - > -extern int child_suppress_run; > - > -extern void _initialize_hpux_thread (void); > - > -struct string_map > - { > - int num; > - char *str; > - }; > - > -static int hpux_thread_active = 0; > - > -static ptid_t main_ptid; /* Real process ID */ > - > -static CORE_ADDR P_cma__g_known_threads; > -static CORE_ADDR P_cma__g_current_thread; > - > -static void init_hpux_thread_ops (void); > - > -static struct target_ops hpux_thread_ops; > - > -static ptid_t find_active_thread (void); > - > -static int cached_thread; > -static cma__t_int_tcb cached_tcb; > - > -static ptid_t > -find_active_thread (void) > -{ > - static cma__t_int_tcb tcb; > - CORE_ADDR tcb_ptr; > - > - read_memory ((CORE_ADDR) P_cma__g_current_thread, > - (char *) &tcb_ptr, > - sizeof tcb_ptr); > - > - read_memory (tcb_ptr, (char *) &tcb, sizeof tcb); > - > - return (ptid_build (PIDGET (main_ptid), 0, > - cma_thread_get_unique (&tcb.prolog.client_thread))); > -} > - > -static cma__t_int_tcb *find_tcb (ptid_t ptid); > - > -static cma__t_int_tcb * > -find_tcb (ptid_t ptid) > -{ > - cma__t_known_object queue_header; > - cma__t_queue *queue_ptr; > - int thread = ptid_get_tid (ptid); > - > - if (thread == cached_thread) > - return &cached_tcb; > - > - read_memory ((CORE_ADDR) P_cma__g_known_threads, > - (char *) &queue_header, > - sizeof queue_header); > - > - for (queue_ptr = queue_header.queue.flink; > - queue_ptr != (cma__t_queue *) P_cma__g_known_threads; > - queue_ptr = cached_tcb.threads.flink) > - { > - cma__t_int_tcb *tcb_ptr; > - > - tcb_ptr = cma__base (queue_ptr, threads, cma__t_int_tcb); > - > - read_memory ((CORE_ADDR) tcb_ptr, (char *) &cached_tcb, > - sizeof cached_tcb); > - > - if (cached_tcb.header.type == cma__c_obj_tcb) > - if (cma_thread_get_unique (&cached_tcb.prolog.client_thread) == thread) > - { > - cached_thread = thread; > - return &cached_tcb; > - } > - } > - > - error (_("Can't find TCB %d"), thread); > - return NULL; > -} > - > -/* Most target vector functions from here on actually just pass through to > - inftarg.c, as they don't need to do anything specific for threads. */ > - > -static void > -hpux_thread_open (char *arg, int from_tty) > -{ > - deprecated_child_ops.to_open (arg, from_tty); > -} > - > -/* Attach to process PID, then initialize for debugging it > - and wait for the trace-trap that results from attaching. */ > - > -static void > -hpux_thread_attach (struct target_ops *ops, char *args, int from_tty) > -{ > - deprecated_child_ops.to_attach (&deprecated_child_ops, args, from_tty); > - > - /* XXX - might want to iterate over all the threads and register them. */ > -} > - > -/* Take a program previously attached to and detaches it. > - The program resumes execution and will no longer stop > - on signals, etc. We'd better not have left any breakpoints > - in the program or it'll die when it hits one. For this > - to work, it may be necessary for the process to have been > - previously attached. It *might* work if the program was > - started via the normal ptrace (PTRACE_TRACEME). */ > - > -static void > -hpux_thread_detach (struct target_ops *ops, char *args, int from_tty) > -{ > - deprecated_child_ops.to_detach (&deprecated_child_ops, args, from_tty); > -} > - > -/* Resume execution of process PID. If STEP is nozero, then > - just single step it. If SIGNAL is nonzero, restart it with that > - signal activated. We may have to convert pid from a thread-id to an LWP > id > - for procfs. */ > - > -static void > -hpux_thread_resume (struct target_ops *ops, > - ptid_t ptid, int step, enum target_signal signo) > -{ > - struct cleanup *old_chain; > - > - old_chain = save_inferior_ptid (); > - > - ptid = main_ptid; > - inferior_ptid = main_ptid; > - > - deprecated_child_ops.to_resume (&deprecated_child_ops, ptid, step, signo); > - > - cached_thread = 0; > - > - do_cleanups (old_chain); > -} > - > -/* Wait for any threads to stop. We may have to convert PID from a thread id > - to a LWP id, and vice versa on the way out. */ > - > -static ptid_t > -hpux_thread_wait (struct target_ops *ops, ptid_t ptid, > - struct target_waitstatus *ourstatus, int options) > -{ > - ptid_t rtnval; > - struct cleanup *old_chain; > - > - old_chain = save_inferior_ptid (); > - > - inferior_ptid = main_ptid; > - > - if (!ptid_equal (ptid, minus_one_ptid)) > - ptid = main_ptid; > - > - rtnval = deprecated_child_ops.to_wait (&deprecated_child_ops, > - ptid, ourstatus, options); > - > - rtnval = find_active_thread (); > - > - do_cleanups (old_chain); > - > - return rtnval; > -} > - > -static char regmap[] = > -{ > - -2, -1, -1, 0, 4, 8, 12, 16, 20, 24, /* flags, r1 -> r9 */ > - 28, 32, 36, 40, 44, 48, 52, 56, 60, -1, /* r10 -> r19 */ > - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* r20 -> r29 */ > - > - /* r30, r31, sar, pcoqh, pcsqh, pcoqt, pcsqt, eiem, iir, isr */ > - -2, -1, -1, -2, -1, -1, -1, -1, -1, -1, > - > - /* ior, ipsw, goto, sr4, sr0, sr1, sr2, sr3, sr5, sr6 */ > - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, > - > - /* sr7, cr0, cr8, cr9, ccr, cr12, cr13, cr24, cr25, cr26 */ > - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, > - > - -1, -1, -1, -1, /* mpsfu_high, mpsfu_low, mpsfu_ovflo, pad */ > - 144, -1, -1, -1, -1, -1, -1, -1, /* fpsr, fpe1 -> fpe7 */ > - -1, -1, -1, -1, -1, -1, -1, -1, /* fr4 -> fr7 */ > - -1, -1, -1, -1, -1, -1, -1, -1, /* fr8 -> fr11 */ > - 136, -1, 128, -1, 120, -1, 112, -1, /* fr12 -> fr15 */ > - 104, -1, 96, -1, 88, -1, 80, -1, /* fr16 -> fr19 */ > - 72, -1, 64, -1, -1, -1, -1, -1, /* fr20 -> fr23 */ > - -1, -1, -1, -1, -1, -1, -1, -1, /* fr24 -> fr27 */ > - -1, -1, -1, -1, -1, -1, -1, -1, /* fr28 -> fr31 */ > -}; > - > -static void > -hpux_thread_fetch_registers (struct target_ops *ops, > - struct regcache *regcache, int regno) > -{ > - struct gdbarch *gdbarch = get_regcache_arch (regcache); > - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); > - cma__t_int_tcb tcb, *tcb_ptr; > - struct cleanup *old_chain; > - int i; > - int first_regno, last_regno; > - > - tcb_ptr = find_tcb (inferior_ptid); > - > - old_chain = save_inferior_ptid (); > - > - inferior_ptid = main_ptid; > - > - if (tcb_ptr->state == cma__c_state_running) > - { > - deprecated_child_ops.to_fetch_registers (&deprecated_child_ops, > - regcache, regno); > - > - do_cleanups (old_chain); > - > - return; > - } > - > - if (regno == -1) > - { > - first_regno = 0; > - last_regno = gdbarch_num_regs (gdbarch) - 1; > - } > - else > - { > - first_regno = regno; > - last_regno = regno; > - } > - > - for (regno = first_regno; regno <= last_regno; regno++) > - { > - if (regmap[regno] == -1) > - deprecated_child_ops.to_fetch_registers (&deprecated_child_ops, > - regcache, regno); > - else > - { > - unsigned char buf[MAX_REGISTER_SIZE]; > - CORE_ADDR sp; > - > - sp = (CORE_ADDR) tcb_ptr->static_ctx.sp - 160; > - > - if (regno == HPPA_FLAGS_REGNUM) > - /* Flags must be 0 to avoid bogus value for SS_INSYSCALL. */ > - memset (buf, '\000', register_size (gdbarch, regno)); > - else if (regno == HPPA_SP_REGNUM) > - store_unsigned_integer (buf, sizeof sp, byte_order, sp); > - else if (regno == HPPA_PCOQ_HEAD_REGNUM) > - read_memory (sp - 20, buf, register_size (gdbarch, regno)); > - else > - read_memory (sp + regmap[regno], buf, > - register_size (gdbarch, regno)); > - > - regcache_raw_supply (regcache, regno, buf); > - } > - } > - > - do_cleanups (old_chain); > -} > - > -static void > -hpux_thread_store_registers (struct target_ops *ops, > - struct regcache *regcache, int regno) > -{ > - struct gdbarch *gdbarch = get_regcache_arch (regcache); > - cma__t_int_tcb tcb, *tcb_ptr; > - struct cleanup *old_chain; > - int i; > - int first_regno, last_regno; > - > - tcb_ptr = find_tcb (inferior_ptid); > - > - old_chain = save_inferior_ptid (); > - > - inferior_ptid = main_ptid; > - > - if (tcb_ptr->state == cma__c_state_running) > - { > - deprecated_child_ops.to_store_registers (&deprecated_child_ops, > - regcache, regno); > - > - do_cleanups (old_chain); > - > - return; > - } > - > - if (regno == -1) > - { > - first_regno = 0; > - last_regno = gdbarch_num_regs (gdbarch) - 1; > - } > - else > - { > - first_regno = regno; > - last_regno = regno; > - } > - > - for (regno = first_regno; regno <= last_regno; regno++) > - { > - if (regmap[regno] == -1) > - deprecated_child_ops.to_store_registers (regcache, regno); > - else > - { > - unsigned char buf[MAX_REGISTER_SIZE]; > - CORE_ADDR sp; > - > - sp = (CORE_ADDR) tcb_ptr->static_ctx.sp - 160; > - > - if (regno == HPPA_FLAGS_REGNUM) > - { > - /* Let lower layer handle this... */ > - deprecated_child_ops.to_store_registers > - (&deprecated_child_ops, regcache, regno); > - } > - else if (regno == HPPA_SP_REGNUM) > - { > - regcache_raw_collect (regcache, regno, buf); > - write_memory ((CORE_ADDR) &tcb_ptr->static_ctx.sp, buf, > - register_size (gdbarch, regno)); > - tcb_ptr->static_ctx.sp > - = (cma__t_hppa_regs *) ((CORE_ADDR) buf + 160); > - } > - else if (regno == HPPA_PCOQ_HEAD_REGNUM) > - { > - regcache_raw_collect (regcache, regno, buf); > - write_memory (sp - 20, buf, > - register_size (gdbarch, regno)); > - } > - else > - { > - regcache_raw_collect (regcache, regno, buf); > - write_memory (sp + regmap[regno], buf, > - register_size (gdbarch, regno)); > - } > - } > - } > - > - do_cleanups (old_chain); > -} > - > -/* Get ready to modify the registers array. On machines which store > - individual registers, this doesn't need to do anything. On machines > - which store all the registers in one fell swoop, this makes sure > - that registers contains all the registers from the program being > - debugged. */ > - > -static void > -hpux_thread_prepare_to_store (struct regcache *regcache) > -{ > - deprecated_child_ops.to_prepare_to_store (regcache); > -} > - > -static int > -hpux_thread_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, > - int dowrite, struct mem_attrib *attribs, > - struct target_ops *target) > -{ > - int retval; > - struct cleanup *old_chain; > - > - old_chain = save_inferior_ptid (); > - > - inferior_ptid = main_ptid; > - > - retval = > - deprecated_child_ops.deprecated_xfer_memory (memaddr, myaddr, len, > - dowrite, attribs, target); > - > - do_cleanups (old_chain); > - > - return retval; > -} > - > -/* Print status information about what we're accessing. */ > - > -static void > -hpux_thread_files_info (struct target_ops *ignore) > -{ > - deprecated_child_ops.to_files_info (ignore); > -} > - > -static void > -hpux_thread_kill_inferior (struct target_ops *ops) > -{ > - deprecated_child_ops.to_kill (&deprecated_child_ops); > -} > - > -static void > -hpux_thread_notice_signals (ptid_t ptid) > -{ > - deprecated_child_ops.to_notice_signals (ptid); > -} > - > -/* Fork an inferior process, and start debugging it with /proc. */ > - > -static void > -hpux_thread_create_inferior (struct target_ops *ops, char *exec_file, > - char *allargs, char **env, int from_tty) > -{ > - deprecated_child_ops.to_create_inferior (&deprecated_child_ops, > - exec_file, allargs, env, from_tty); > - > - if (hpux_thread_active) > - { > - main_ptid = inferior_ptid; > - > - push_target (&hpux_thread_ops); > - > - inferior_ptid = find_active_thread (); > - > - add_thread (inferior_ptid); > - } > -} > - > -/* This routine is called whenever a new symbol table is read in, or when all > - symbol tables are removed. libthread_db can only be initialized when it > - finds the right variables in libthread.so. Since it's a shared library, > - those variables don't show up until the library gets mapped and the symbol > - table is read in. */ > - > -static void > -hpux_thread_new_objfile (struct objfile *objfile) > -{ > - struct minimal_symbol *ms; > - > - if (!objfile) > - { > - hpux_thread_active = 0; > - return; > - } > - > - ms = lookup_minimal_symbol ("cma__g_known_threads", NULL, objfile); > - > - if (!ms) > - return; > - > - P_cma__g_known_threads = SYMBOL_VALUE_ADDRESS (ms); > - > - ms = lookup_minimal_symbol ("cma__g_current_thread", NULL, objfile); > - > - if (!ms) > - return; > - > - P_cma__g_current_thread = SYMBOL_VALUE_ADDRESS (ms); > - > - hpux_thread_active = 1; > -} > - > -/* Clean up after the inferior dies. */ > - > -static void > -hpux_thread_mourn_inferior (void) > -{ > - deprecated_child_ops.to_mourn_inferior (&deprecated_child_ops); > -} > - > -/* Mark our target-struct as eligible for stray "run" and "attach" > - commands. */ > - > -static int > -hpux_thread_can_run (void) > -{ > - return child_suppress_run; > -} > - > -static int > -hpux_thread_alive (struct target_ops *ops, ptid_t ptid) > -{ > - return 1; > -} > - > -static void > -hpux_thread_stop (ptid_t ptid) > -{ > - deprecated_child_ops.to_stop (ptid); > -} > - > -/* Convert a pid to printable form. */ > - > -char * > -hpux_pid_to_str (ptid_t ptid) > -{ > - static char buf[100]; > - int pid = PIDGET (ptid); > - > - sprintf (buf, "Thread %ld", ptid_get_tid (ptid)); > - > - return buf; > -} > - > -static void > -init_hpux_thread_ops (void) > -{ > - hpux_thread_ops.to_shortname = "hpux-threads"; > - hpux_thread_ops.to_longname = "HPUX threads and pthread."; > - hpux_thread_ops.to_doc = "HPUX threads and pthread support."; > - hpux_thread_ops.to_open = hpux_thread_open; > - hpux_thread_ops.to_attach = hpux_thread_attach; > - hpux_thread_ops.to_detach = hpux_thread_detach; > - hpux_thread_ops.to_resume = hpux_thread_resume; > - hpux_thread_ops.to_wait = hpux_thread_wait; > - hpux_thread_ops.to_fetch_registers = hpux_thread_fetch_registers; > - hpux_thread_ops.to_store_registers = hpux_thread_store_registers; > - hpux_thread_ops.to_prepare_to_store = hpux_thread_prepare_to_store; > - hpux_thread_ops.deprecated_xfer_memory = hpux_thread_xfer_memory; > - hpux_thread_ops.to_files_info = hpux_thread_files_info; > - hpux_thread_ops.to_insert_breakpoint = memory_insert_breakpoint; > - hpux_thread_ops.to_remove_breakpoint = memory_remove_breakpoint; > - hpux_thread_ops.to_terminal_init = terminal_init_inferior; > - hpux_thread_ops.to_terminal_inferior = terminal_inferior; > - hpux_thread_ops.to_terminal_ours_for_output = terminal_ours_for_output; > - hpux_thread_ops.to_terminal_save_ours = terminal_save_ours; > - hpux_thread_ops.to_terminal_ours = terminal_ours; > - hpux_thread_ops.to_terminal_info = child_terminal_info; > - hpux_thread_ops.to_kill = hpux_thread_kill_inferior; > - hpux_thread_ops.to_create_inferior = hpux_thread_create_inferior; > - hpux_thread_ops.to_mourn_inferior = hpux_thread_mourn_inferior; > - hpux_thread_ops.to_can_run = hpux_thread_can_run; > - hpux_thread_ops.to_notice_signals = hpux_thread_notice_signals; > - hpux_thread_ops.to_thread_alive = hpux_thread_alive; > - hpux_thread_ops.to_stop = hpux_thread_stop; > - hpux_thread_ops.to_stratum = process_stratum; > - hpux_thread_ops.to_has_all_memory = default_child_has_all_memory; > - hpux_thread_ops.to_has_memory = default_child_has_memory; > - hpux_thread_ops.to_has_stack = default_child_has_stack; > - hpux_thread_ops.to_has_registers = default_child_has_registers; > - hpux_thread_ops.to_has_execution = default_child_has_execution; > - hpux_thread_ops.to_magic = OPS_MAGIC; > -} > - > -void > -_initialize_hpux_thread (void) > -{ > - init_hpux_thread_ops (); > - add_target (&hpux_thread_ops); > - > - child_suppress_run = 1; > - /* Hook into new_objfile notification. */ > - observer_attach_new_objfile (hpux_thread_new_objfile); > -} >