X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fobsd-nat.c;h=6667a0add7fed063c97ea28fd1c9a7581fc0ad41;hb=8118159c69a957292ce701b3d2937f19a0d0f973;hp=ac05fae9a19bafa41bf2532f4a1f6e9346c72ad9;hpb=f2907e49910853edf3c1aec995b3c44b3bba8999;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/obsd-nat.c b/gdb/obsd-nat.c index ac05fae9a1..6667a0add7 100644 --- a/gdb/obsd-nat.c +++ b/gdb/obsd-nat.c @@ -1,6 +1,6 @@ /* Native-dependent code for OpenBSD. - Copyright (C) 2012-2018 Free Software Foundation, Inc. + Copyright (C) 2012-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -24,7 +24,7 @@ #include #include -#include "gdb_wait.h" +#include "gdbsupport/gdb_wait.h" #include "inf-child.h" #include "obsd-nat.h" @@ -35,16 +35,11 @@ #ifdef PT_GET_THREAD_FIRST -const char * +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); } @@ -52,7 +47,7 @@ obsd_nat_target::pid_to_str (ptid_t ptid) 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 (); @@ -64,12 +59,12 @@ obsd_nat_target::update_thread_list () { 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) @@ -90,7 +85,7 @@ obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, do { - pid = waitpid (ptid_get_pid (ptid), &status, 0); + pid = waitpid (ptid.pid (), &status, 0); save_errno = errno; } while (pid == -1 && errno == EINTR); @@ -110,7 +105,7 @@ obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, } /* 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); @@ -142,7 +137,7 @@ obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, 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 = ptid_t (pe.pe_other_pid); return ptid_t (fpid); @@ -152,12 +147,12 @@ obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, } ptid = ptid_t (pid, pe.pe_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); } } @@ -166,3 +161,66 @@ obsd_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, } #endif /* PT_GET_THREAD_FIRST */ + +#ifdef PT_GET_PROCESS_STATE + +void +obsd_nat_target::post_attach (int pid) +{ + 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, + (PTRACE_TYPE_ARG3)&pe, sizeof pe) == -1) + perror_with_name (("ptrace")); +} + +void +obsd_nat_target::post_startup_inferior (ptid_t pid) +{ + 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")); +} + +/* 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 */