X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fbsd-uthread.c;h=15d538c16db5f470a4213b565f293c1cd3ba3b7f;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=3b3a420f2a468ebb1451416b5454a69345e1eb6d;hpb=42a4f53d2bf8938c2aeda9f52be7a20534b214a9;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/bsd-uthread.c b/gdb/bsd-uthread.c index 3b3a420f2a..15d538c16d 100644 --- a/gdb/bsd-uthread.c +++ b/gdb/bsd-uthread.c @@ -1,6 +1,6 @@ /* BSD user-level threads support. - Copyright (C) 2005-2019 Free Software Foundation, Inc. + Copyright (C) 2005-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -62,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; @@ -381,9 +381,11 @@ bsd_uthread_target::wait (ptid_t ptid, struct target_waitstatus *status, { enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); CORE_ADDR addr; + process_stratum_target *beneath + = as_process_stratum_target (this->beneath ()); /* 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. */ @@ -414,13 +416,13 @@ bsd_uthread_target::wait (ptid_t ptid, struct target_waitstatus *status, ptid with tid set, then ptid is still the initial thread of the process. Notify GDB core about it. */ if (inferior_ptid.tid () == 0 - && ptid.tid () != 0 && !in_thread_list (ptid)) - thread_change_ptid (inferior_ptid, ptid); + && ptid.tid () != 0 && !in_thread_list (beneath, ptid)) + thread_change_ptid (beneath, inferior_ptid, ptid); /* Don't let the core see a ptid without a corresponding thread. */ - thread_info *thread = find_thread_ptid (ptid); + thread_info *thread = find_thread_ptid (beneath, ptid); if (thread == NULL || thread->state == THREAD_EXITED) - add_thread (ptid); + add_thread (beneath, ptid); return ptid; } @@ -467,16 +469,18 @@ bsd_uthread_target::update_thread_list () { ptid_t ptid = ptid_t (pid, 0, addr); - thread_info *thread = find_thread_ptid (ptid); + process_stratum_target *proc_target + = as_process_stratum_target (this->beneath ()); + thread_info *thread = find_thread_ptid (proc_target, 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 (inferior_ptid.tid () == 0) - thread_change_ptid (inferior_ptid, ptid); + thread_change_ptid (proc_target, inferior_ptid, ptid); else - add_thread (ptid); + add_thread (proc_target, ptid); } addr = bsd_uthread_read_memory_address (addr + offset); @@ -530,23 +534,19 @@ 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.tid () != 0) - { - static char buf[64]; - - xsnprintf (buf, sizeof buf, "process %d, thread 0x%lx", - ptid.pid (), ptid.tid ()); - return buf; - } + return string_printf ("process %d, thread 0x%lx", + ptid.pid (), ptid.tid ()); return normal_pid_to_str (ptid); } +void _initialize_bsd_uthread (); void -_initialize_bsd_uthread (void) +_initialize_bsd_uthread () { bsd_uthread_data = gdbarch_data_register_pre_init (bsd_uthread_init);