X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fobsd-nat.c;h=6667a0add7fed063c97ea28fd1c9a7581fc0ad41;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=bef03d33ca221e69327188afdfc83b8684291d17;hpb=ab4756af55ddfeade06d9a14c0bd9e5c64145467;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/obsd-nat.c b/gdb/obsd-nat.c index bef03d33ca..6667a0add7 100644 --- a/gdb/obsd-nat.c +++ b/gdb/obsd-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for OpenBSD. - Copyright (C) 2012-2014 Free Software Foundation, Inc. + Copyright (C) 2012-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -22,10 +22,9 @@ #include "inferior.h" #include "target.h" -#include "gdb_assert.h" #include #include -#include +#include "gdbsupport/gdb_wait.h" #include "inf-child.h" #include "obsd-nat.h" @@ -36,39 +35,36 @@ #ifdef PT_GET_THREAD_FIRST -static char * -obsd_pid_to_str (struct target_ops *ops, ptid_t ptid) +std::string +obsd_nat_target::pid_to_str (ptid_t ptid) { - if (ptid_get_lwp (ptid) != 0) - { - static char buf[64]; - - xsnprintf (buf, sizeof buf, "thread %ld", ptid_get_lwp (ptid)); - return buf; - } + if (ptid.lwp () != 0) + return string_printf ("thread %ld", ptid.lwp ()); return normal_pid_to_str (ptid); } -static void -obsd_find_new_threads (struct target_ops *ops) +void +obsd_nat_target::update_thread_list () { - pid_t pid = ptid_get_pid (inferior_ptid); + pid_t pid = inferior_ptid.pid (); struct ptrace_thread_state pts; + prune_threads (); + if (ptrace (PT_GET_THREAD_FIRST, pid, (caddr_t)&pts, sizeof pts) == -1) perror_with_name (("ptrace")); while (pts.pts_tid != -1) { - ptid_t ptid = ptid_build (pid, pts.pts_tid, 0); + ptid_t ptid = ptid_t (pid, pts.pts_tid, 0); - if (!in_thread_list (ptid)) + if (!in_thread_list (this, ptid)) { - if (ptid_get_lwp (inferior_ptid) == 0) - thread_change_ptid (inferior_ptid, ptid); + if (inferior_ptid.lwp () == 0) + thread_change_ptid (this, inferior_ptid, ptid); else - add_thread (ptid); + add_thread (this, ptid); } if (ptrace (PT_GET_THREAD_NEXT, pid, (caddr_t)&pts, sizeof pts) == -1) @@ -76,9 +72,9 @@ obsd_find_new_threads (struct target_ops *ops) } } -static ptid_t -obsd_wait (struct target_ops *ops, - ptid_t ptid, struct target_waitstatus *ourstatus, int options) +ptid_t +obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, + int options) { pid_t pid; int status, save_errno; @@ -89,7 +85,7 @@ obsd_wait (struct target_ops *ops, do { - pid = waitpid (ptid_get_pid (ptid), &status, 0); + pid = waitpid (ptid.pid (), &status, 0); save_errno = errno; } while (pid == -1 && errno == EINTR); @@ -109,12 +105,12 @@ obsd_wait (struct target_ops *ops, } /* Ignore terminated detached child processes. */ - if (!WIFSTOPPED (status) && pid != ptid_get_pid (inferior_ptid)) + if (!WIFSTOPPED (status) && pid != inferior_ptid.pid ()) pid = -1; } while (pid == -1); - ptid = pid_to_ptid (pid); + ptid = ptid_t (pid); if (WIFSTOPPED (status)) { @@ -128,7 +124,7 @@ obsd_wait (struct target_ops *ops, { case PTRACE_FORK: ourstatus->kind = TARGET_WAITKIND_FORKED; - ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid); + ourstatus->value.related_pid = ptid_t (pe.pe_other_pid); /* Make sure the other end of the fork is stopped too. */ fpid = waitpid (pe.pe_other_pid, &status, 0); @@ -141,22 +137,22 @@ obsd_wait (struct target_ops *ops, gdb_assert (pe.pe_report_event == PTRACE_FORK); gdb_assert (pe.pe_other_pid == pid); - if (fpid == ptid_get_pid (inferior_ptid)) + if (fpid == inferior_ptid.pid ()) { - ourstatus->value.related_pid = pid_to_ptid (pe.pe_other_pid); - return pid_to_ptid (fpid); + ourstatus->value.related_pid = ptid_t (pe.pe_other_pid); + return ptid_t (fpid); } - return pid_to_ptid (pid); + return ptid_t (pid); } - ptid = ptid_build (pid, pe.pe_tid, 0); - if (!in_thread_list (ptid)) + ptid = ptid_t (pid, pe.pe_tid, 0); + if (!in_thread_list (this, ptid)) { - if (ptid_get_lwp (inferior_ptid) == 0) - thread_change_ptid (inferior_ptid, ptid); + if (inferior_ptid.lwp () == 0) + thread_change_ptid (this, inferior_ptid, ptid); else - add_thread (ptid); + add_thread (this, ptid); } } @@ -164,22 +160,67 @@ obsd_wait (struct target_ops *ops, return ptid; } +#endif /* PT_GET_THREAD_FIRST */ + +#ifdef PT_GET_PROCESS_STATE + void -obsd_add_target (struct target_ops *t) +obsd_nat_target::post_attach (int pid) { - /* Override some methods to support threads. */ - t->to_pid_to_str = obsd_pid_to_str; - t->to_find_new_threads = obsd_find_new_threads; - t->to_wait = obsd_wait; - add_target (t); -} + ptrace_event_t pe; -#else + /* Set the initial event mask. */ + memset (&pe, 0, sizeof pe); + pe.pe_set_event |= PTRACE_FORK; + if (ptrace (PT_SET_EVENT_MASK, pid, + (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + perror_with_name (("ptrace")); +} void -obsd_add_target (struct target_ops *t) +obsd_nat_target::post_startup_inferior (ptid_t pid) { - add_target (t); + ptrace_event_t pe; + + /* Set the initial event mask. */ + memset (&pe, 0, sizeof pe); + pe.pe_set_event |= PTRACE_FORK; + if (ptrace (PT_SET_EVENT_MASK, pid.pid (), + (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + perror_with_name (("ptrace")); } -#endif /* PT_GET_THREAD_FIRST */ +/* Target hook for follow_fork. On entry and at return inferior_ptid is + the ptid of the followed inferior. */ + +bool +obsd_nat_target::follow_fork (bool follow_child, bool detach_fork) +{ + if (!follow_child) + { + struct thread_info *tp = inferior_thread (); + pid_t child_pid = tp->pending_follow.value.related_pid.pid (); + + /* Breakpoints have already been detached from the child by + infrun.c. */ + + if (ptrace (PT_DETACH, child_pid, (PTRACE_TYPE_ARG3)1, 0) == -1) + perror_with_name (("ptrace")); + } + + return false; +} + +int +obsd_nat_target::insert_fork_catchpoint (int pid) +{ + return 0; +} + +int +obsd_nat_target::remove_fork_catchpoint (int pid) +{ + return 0; +} + +#endif /* PT_GET_PROCESS_STATE */