diff options
Diffstat (limited to 'gdb/darwin-nat.c')
-rw-r--r-- | gdb/darwin-nat.c | 103 |
1 files changed, 50 insertions, 53 deletions
diff --git a/gdb/darwin-nat.c b/gdb/darwin-nat.c index 9baa1e9..27677d1 100644 --- a/gdb/darwin-nat.c +++ b/gdb/darwin-nat.c @@ -89,12 +89,8 @@ #define PTRACE(CMD, PID, ADDR, SIG) \ darwin_ptrace(#CMD, CMD, (PID), (ADDR), (SIG)) -static ptid_t darwin_wait (ptid_t ptid, struct target_waitstatus *status); - static void darwin_ptrace_me (void); -static void darwin_ptrace_him (int pid); - static void darwin_encode_reply (mig_reply_error_t *reply, mach_msg_header_t *hdr, integer_t code); @@ -258,8 +254,8 @@ cmp_thread_t (const void *l, const void *r) return (int)(tl - tr); } -static void -darwin_check_new_threads (struct inferior *inf) +void +darwin_nat_target::check_new_threads (inferior *inf) { kern_return_t kret; thread_array_t thread_list; @@ -355,7 +351,7 @@ darwin_check_new_threads (struct inferior *inf) pti->msg_state = DARWIN_RUNNING; /* Add the new thread. */ - add_thread_with_info (ptid_t (inf->pid, 0, new_id), pti); + add_thread_with_info (this, ptid_t (inf->pid, 0, new_id), pti); new_thread_vec.push_back (pti); new_ix++; continue; @@ -364,7 +360,7 @@ darwin_check_new_threads (struct inferior *inf) { /* A thread was removed. */ struct thread_info *thr - = find_thread_ptid (ptid_t (inf->pid, 0, old_id)); + = find_thread_ptid (this, ptid_t (inf->pid, 0, old_id)); delete_thread (thr); kret = mach_port_deallocate (gdb_task, old_id); MACH_CHECK_ERROR (kret); @@ -465,14 +461,6 @@ darwin_resume_inferior (struct inferior *inf) /* Iterator functions. */ static int -darwin_suspend_inferior_it (struct inferior *inf, void *arg) -{ - darwin_suspend_inferior (inf); - darwin_check_new_threads (inf); - return 0; -} - -static int darwin_resume_inferior_it (struct inferior *inf, void *arg) { darwin_resume_inferior (inf); @@ -611,10 +599,10 @@ darwin_check_message_ndr (NDR_record_t *ndr) /* Decode an exception message. */ -static int -darwin_decode_exception_message (mach_msg_header_t *hdr, - struct inferior **pinf, - darwin_thread_t **pthread) +int +darwin_nat_target::decode_exception_message (mach_msg_header_t *hdr, + inferior **pinf, + darwin_thread_t **pthread) { mach_msg_body_t *bod = (mach_msg_body_t*)(hdr + 1); mach_msg_port_descriptor_t *desc = (mach_msg_port_descriptor_t *)(bod + 1); @@ -712,7 +700,7 @@ darwin_decode_exception_message (mach_msg_header_t *hdr, /* Find thread by port. */ /* Check for new threads. Do it early so that the port in the exception message can be deallocated. */ - darwin_check_new_threads (inf); + check_new_threads (inf); /* Free the thread port (as gdb knows the thread, it has already has a right for it, so this just decrement a reference counter). */ @@ -975,7 +963,7 @@ darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal) } else { - struct inferior *inf = find_inferior_ptid (ptid); + inferior *inf = find_inferior_ptid (this, ptid); long tid = ptid.tid (); /* Stop the inferior (should be useless). */ @@ -1001,11 +989,11 @@ darwin_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signal) } } -static ptid_t -darwin_decode_message (mach_msg_header_t *hdr, - darwin_thread_t **pthread, - struct inferior **pinf, - struct target_waitstatus *status) +ptid_t +darwin_nat_target::decode_message (mach_msg_header_t *hdr, + darwin_thread_t **pthread, + inferior **pinf, + target_waitstatus *status) { darwin_thread_t *thread; struct inferior *inf; @@ -1016,7 +1004,7 @@ darwin_decode_message (mach_msg_header_t *hdr, int res; /* Decode message. */ - res = darwin_decode_exception_message (hdr, &inf, &thread); + res = decode_exception_message (hdr, &inf, &thread); if (res < 0) { @@ -1172,8 +1160,8 @@ darwin_decode_message (mach_msg_header_t *hdr, return minus_one_ptid; } -static int -cancel_breakpoint (ptid_t ptid) +int +darwin_nat_target::cancel_breakpoint (ptid_t ptid) { /* Arrange for a breakpoint to be hit again later. We will handle the current event, eventually we will resume this thread, and this @@ -1183,7 +1171,7 @@ cancel_breakpoint (ptid_t ptid) delete or disable the breakpoint, but the thread will have already tripped on it. */ - struct regcache *regcache = get_thread_regcache (ptid); + struct regcache *regcache = get_thread_regcache (this, ptid); struct gdbarch *gdbarch = regcache->arch (); CORE_ADDR pc; @@ -1202,8 +1190,8 @@ cancel_breakpoint (ptid_t ptid) return 0; } -static ptid_t -darwin_wait (ptid_t ptid, struct target_waitstatus *status) +ptid_t +darwin_nat_target::wait_1 (ptid_t ptid, struct target_waitstatus *status) { kern_return_t kret; union @@ -1262,7 +1250,7 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) if (darwin_debug_flag > 10) darwin_dump_message (hdr, darwin_debug_flag > 11); - res = darwin_decode_message (hdr, &thread, &inf, status); + res = decode_message (hdr, &thread, &inf, status); if (res == minus_one_ptid) continue; @@ -1273,7 +1261,11 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) while (status->kind == TARGET_WAITKIND_IGNORE); /* Stop all tasks. */ - iterate_over_inferiors (darwin_suspend_inferior_it, NULL); + for (inferior *inf : all_inferiors (this)) + { + darwin_suspend_inferior (inf); + check_new_threads (inf); + } /* Read pending messages. */ while (1) @@ -1298,7 +1290,7 @@ darwin_wait (ptid_t ptid, struct target_waitstatus *status) if (darwin_debug_flag > 10) darwin_dump_message (hdr, darwin_debug_flag > 11); - ptid2 = darwin_decode_message (hdr, &thread, &inf, &status2); + ptid2 = decode_message (hdr, &thread, &inf, &status2); if (inf != NULL && thread != NULL && thread->event.ex_type == EXC_BREAKPOINT) @@ -1325,7 +1317,7 @@ ptid_t darwin_nat_target::wait (ptid_t ptid, struct target_waitstatus *status, int options) { - return darwin_wait (ptid, status); + return wait_1 (ptid, status); } void @@ -1415,8 +1407,8 @@ darwin_reply_to_all_pending_messages (struct inferior *inf) } } -static void -darwin_stop_inferior (struct inferior *inf) +void +darwin_nat_target::stop_inferior (inferior *inf) { struct target_waitstatus wstatus; ptid_t ptid; @@ -1432,14 +1424,14 @@ darwin_stop_inferior (struct inferior *inf) if (priv->no_ptrace) return; - res = kill (inf->pid, SIGSTOP); + res = ::kill (inf->pid, SIGSTOP); if (res != 0) warning (_("cannot kill: %s"), safe_strerror (errno)); /* Wait until the process is really stopped. */ while (1) { - ptid = darwin_wait (inferior_ptid, &wstatus); + ptid = wait_1 (inferior_ptid, &wstatus); if (wstatus.kind == TARGET_WAITKIND_STOPPED && wstatus.value.sig == GDB_SIGNAL_STOP) break; @@ -1564,7 +1556,7 @@ darwin_nat_target::kill () darwin_resume_inferior (inf); - ptid = darwin_wait (inferior_ptid, &wstatus); + ptid = wait_1 (inferior_ptid, &wstatus); } else if (errno != ESRCH) warning (_("Failed to kill inferior: kill (%d, 9) returned [%s]"), @@ -1716,10 +1708,10 @@ thread_info_from_private_thread_info (darwin_thread_info *pti) gdb_assert_not_reached ("did not find gdb thread for darwin thread"); } -static void -darwin_init_thread_list (struct inferior *inf) +void +darwin_nat_target::init_thread_list (inferior *inf) { - darwin_check_new_threads (inf); + check_new_threads (inf); darwin_inferior *priv = get_darwin_inferior (inf); @@ -1783,21 +1775,21 @@ darwin_pre_ptrace (void) mark_fd_no_cloexec (ptrace_fds[1]); } -static void -darwin_ptrace_him (int pid) +void +darwin_nat_target::ptrace_him (int pid) { struct inferior *inf = current_inferior (); darwin_attach_pid (inf); /* Let's the child run. */ - close (ptrace_fds[0]); - close (ptrace_fds[1]); + ::close (ptrace_fds[0]); + ::close (ptrace_fds[1]); unmark_fd_no_cloexec (ptrace_fds[0]); unmark_fd_no_cloexec (ptrace_fds[1]); - darwin_init_thread_list (inf); + init_thread_list (inf); gdb_startup_inferior (pid, START_INFERIOR_TRAPS_EXPECTED); } @@ -1986,6 +1978,7 @@ darwin_nat_target::create_inferior (const char *exec_file, char **env, int from_tty) { gdb::optional<scoped_restore_tmpl<bool>> restore_startup_with_shell; + darwin_nat_target *the_target = this; if (startup_with_shell && may_have_sip ()) { @@ -1998,7 +1991,11 @@ darwin_nat_target::create_inferior (const char *exec_file, /* Do the hard work. */ fork_inferior (exec_file, allargs, env, darwin_ptrace_me, - darwin_ptrace_him, darwin_pre_ptrace, copied_shell, + [the_target] (int pid) + { + the_target->ptrace_him (pid); + }, + darwin_pre_ptrace, copied_shell, darwin_execvp); } @@ -2068,7 +2065,7 @@ darwin_nat_target::attach (const char *args, int from_tty) darwin_suspend_inferior (inf); - darwin_init_thread_list (inf); + init_thread_list (inf); darwin_inferior *priv = get_darwin_inferior (inf); @@ -2099,7 +2096,7 @@ darwin_nat_target::detach (inferior *inf, int from_tty) /* If ptrace() is in use, stop the process. */ if (!priv->no_ptrace) - darwin_stop_inferior (inf); + stop_inferior (inf); kret = darwin_restore_exception_ports (priv); MACH_CHECK_ERROR (kret); |