X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbsd-uthread.c;h=af048f7a18f940c02633c228a864f8f68d46d5cd;hb=a068643d69ce0f25d5f7cbdaa1d0a3211d72c081;hp=9ead7c2b3dee60def279ea1776a43f51ecd6b963;hpb=222312d359fe0a68f8583ba315583ee8cc94f252;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c index 9ead7c2b3d..af048f7a18 100644 --- a/gdb/bsd-uthread.c +++ b/gdb/bsd-uthread.c @@ -1,6 +1,6 @@ /* BSD user-level threads support. - Copyright (C) 2005-2018 Free Software Foundation, Inc. + Copyright (C) 2005-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -41,12 +41,11 @@ static const target_info bsd_uthread_target_info = { struct bsd_uthread_target final : public target_ops { - bsd_uthread_target () - { to_stratum = thread_stratum; } - const target_info &info () const override { return bsd_uthread_target_info; } + strata stratum () const override { return thread_stratum; } + void close () override; void mourn_inferior () override; @@ -63,7 +62,7 @@ struct bsd_uthread_target final : public target_ops const char *extra_thread_info (struct thread_info *) override; - const char *pid_to_str (ptid_t) override; + std::string pid_to_str (ptid_t) override; }; static bsd_uthread_target bsd_uthread_ops; @@ -310,8 +309,7 @@ bsd_uthread_solib_unloaded (struct so_list *so) void bsd_uthread_target::mourn_inferior () { - struct target_ops *beneath = find_target_beneath (this); - beneath->mourn_inferior (); + beneath ()->mourn_inferior (); bsd_uthread_deactivate (); } @@ -322,8 +320,7 @@ bsd_uthread_target::fetch_registers (struct regcache *regcache, int regnum) struct bsd_uthread_ops *uthread_ops = (struct bsd_uthread_ops *) gdbarch_data (gdbarch, bsd_uthread_data); ptid_t ptid = regcache->ptid (); - CORE_ADDR addr = ptid_get_tid (ptid); - struct target_ops *beneath = find_target_beneath (this); + CORE_ADDR addr = ptid.tid (); CORE_ADDR active_addr; scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid); @@ -332,7 +329,7 @@ bsd_uthread_target::fetch_registers (struct regcache *regcache, int regnum) inferior_ptid = ptid; /* Always fetch the appropriate registers from the layer beneath. */ - beneath->fetch_registers (regcache, regnum); + beneath ()->fetch_registers (regcache, regnum); /* FIXME: That might have gotten us more than we asked for. Make sure we overwrite all relevant registers with values from the @@ -354,9 +351,8 @@ bsd_uthread_target::store_registers (struct regcache *regcache, int regnum) struct gdbarch *gdbarch = regcache->arch (); struct bsd_uthread_ops *uthread_ops = (struct bsd_uthread_ops *) gdbarch_data (gdbarch, bsd_uthread_data); - struct target_ops *beneath = find_target_beneath (this); ptid_t ptid = regcache->ptid (); - CORE_ADDR addr = ptid_get_tid (ptid); + CORE_ADDR addr = ptid.tid (); CORE_ADDR active_addr; scoped_restore save_inferior_ptid = make_scoped_restore (&inferior_ptid); @@ -375,7 +371,7 @@ bsd_uthread_target::store_registers (struct regcache *regcache, int regnum) { /* Updating the thread that is currently running; pass the request to the layer beneath. */ - beneath->store_registers (regcache, regnum); + beneath ()->store_registers (regcache, regnum); } } @@ -385,10 +381,9 @@ bsd_uthread_target::wait (ptid_t ptid, struct target_waitstatus *status, { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); CORE_ADDR addr; - struct target_ops *beneath = find_target_beneath (this); /* Pass the request to the layer beneath. */ - ptid = beneath->wait (ptid, status, options); + ptid = beneath ()->wait (ptid, status, options); /* If the process is no longer alive, there's no point in figuring out the thread ID. It will fail anyway. */ @@ -411,19 +406,20 @@ bsd_uthread_target::wait (ptid_t ptid, struct target_waitstatus *status, { ULONGEST magic = extract_unsigned_integer (buf, 4, byte_order); if (magic == BSD_UTHREAD_PTHREAD_MAGIC) - ptid = ptid_build (ptid_get_pid (ptid), 0, addr); + ptid = ptid_t (ptid.pid (), 0, addr); } } /* If INFERIOR_PTID doesn't have a tid member yet, and we now have a ptid with tid set, then ptid is still the initial thread of the process. Notify GDB core about it. */ - if (ptid_get_tid (inferior_ptid) == 0 - && ptid_get_tid (ptid) != 0 && !in_thread_list (ptid)) + if (inferior_ptid.tid () == 0 + && ptid.tid () != 0 && !in_thread_list (ptid)) thread_change_ptid (inferior_ptid, ptid); /* Don't let the core see a ptid without a corresponding thread. */ - if (!in_thread_list (ptid) || is_exited (ptid)) + thread_info *thread = find_thread_ptid (ptid); + if (thread == NULL || thread->state == THREAD_EXITED) add_thread (ptid); return ptid; @@ -433,16 +429,14 @@ void bsd_uthread_target::resume (ptid_t ptid, int step, enum gdb_signal sig) { /* Pass the request to the layer beneath. */ - struct target_ops *beneath = find_target_beneath (this); - beneath->resume (ptid, step, sig); + beneath ()->resume (ptid, step, sig); } bool bsd_uthread_target::thread_alive (ptid_t ptid) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); - struct target_ops *beneath = find_target_beneath (this); - CORE_ADDR addr = ptid_get_tid (ptid); + CORE_ADDR addr = ptid.tid (); if (addr != 0) { @@ -456,13 +450,13 @@ bsd_uthread_target::thread_alive (ptid_t ptid) return false; } - return beneath->thread_alive (ptid); + return beneath ()->thread_alive (ptid); } void bsd_uthread_target::update_thread_list () { - pid_t pid = ptid_get_pid (inferior_ptid); + pid_t pid = inferior_ptid.pid (); int offset = bsd_uthread_thread_next_offset; CORE_ADDR addr; @@ -471,14 +465,15 @@ bsd_uthread_target::update_thread_list () addr = bsd_uthread_read_memory_address (bsd_uthread_thread_list_addr); while (addr != 0) { - ptid_t ptid = ptid_build (pid, 0, addr); + ptid_t ptid = ptid_t (pid, 0, addr); - if (!in_thread_list (ptid) || is_exited (ptid)) + thread_info *thread = find_thread_ptid (ptid); + if (thread == nullptr || thread->state == THREAD_EXITED) { /* If INFERIOR_PTID doesn't have a tid member yet, then ptid is still the initial thread of the process. Notify GDB core about it. */ - if (ptid_get_tid (inferior_ptid) == 0) + if (inferior_ptid.tid () == 0) thread_change_ptid (inferior_ptid, ptid); else add_thread (ptid); @@ -520,7 +515,7 @@ const char * bsd_uthread_target::extra_thread_info (thread_info *info) { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); - CORE_ADDR addr = ptid_get_tid (info->ptid); + CORE_ADDR addr = info->ptid.tid (); if (addr != 0) { @@ -535,17 +530,12 @@ bsd_uthread_target::extra_thread_info (thread_info *info) return NULL; } -const char * +std::string bsd_uthread_target::pid_to_str (ptid_t ptid) { - if (ptid_get_tid (ptid) != 0) - { - static char buf[64]; - - xsnprintf (buf, sizeof buf, "process %d, thread 0x%lx", - ptid_get_pid (ptid), ptid_get_tid (ptid)); - return buf; - } + if (ptid.tid () != 0) + return string_printf ("process %d, thread 0x%lx", + ptid.pid (), ptid.tid ()); return normal_pid_to_str (ptid); }