X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fobsd-nat.c;h=6667a0add7fed063c97ea28fd1c9a7581fc0ad41;hb=8118159c69a957292ce701b3d2937f19a0d0f973;hp=faef8ff7d32f91b30033eef2c2a4a5e9769ba7d8;hpb=b811d2c2920ddcb1adcd438da38e90912b31f45f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/obsd-nat.c b/gdb/obsd-nat.c index faef8ff7d3..6667a0add7 100644 --- a/gdb/obsd-nat.c +++ b/gdb/obsd-nat.c @@ -59,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 (inferior_ptid.lwp () == 0) - thread_change_ptid (inferior_ptid, ptid); + 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) @@ -147,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 (inferior_ptid.lwp () == 0) - thread_change_ptid (inferior_ptid, ptid); + thread_change_ptid (this, inferior_ptid, ptid); else - add_thread (ptid); + add_thread (this, ptid); } } @@ -161,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 */