void next_inferior_destroy (next_inferior_status *s) { next_signal_thread_destroy (&s->signal_status); next_exception_thread_destroy (&s->exception_status); #if defined(WITH_CFM) && WITH_CFM next_cfm_thread_destroy (&s->cfm_status); #endif /* WITH_CFM */ s->task = TASK_NULL; s->pid = 0; next_inferior_reset (s); }
void next_create_inferior_for_task (struct next_inferior_status *inferior, task_t task, int pid) { kern_return_t ret; CHECK_FATAL (inferior != NULL); next_inferior_destroy (inferior); next_inferior_reset (inferior); inferior->task = task; inferior->pid = pid; inferior->attached_in_ptrace = 0; inferior->stopped_in_ptrace = 0; inferior->suspend_count = 0; /* */ dyld_init_paths (&inferior->dyld_status.path_info); /* get notification messages for current task */ ret = port_allocate (task_self (), &inferior->notify_port); MACH_CHECK_ERROR (ret); ret = port_set_backlog (task_self (), inferior->notify_port, PORT_BACKLOG_MAX); MACH_CHECK_ERROR (ret); if (inferior_bind_notify_port_flag) { ret = task_set_notify_port (task_self (), inferior->notify_port); MACH_CHECK_ERROR (ret); } /* initialize signal port */ ret = port_allocate (task_self (), &inferior->signal_port); MACH_CHECK_ERROR (ret); ret = port_set_backlog (task_self (), inferior->signal_port, PORT_BACKLOG_MAX); MACH_CHECK_ERROR (ret); /* initialize dyld port */ ret = port_allocate (task_self (), &inferior->dyld_port); MACH_WARN_ERROR (ret); ret = port_set_backlog (task_self (), inferior->dyld_port, PORT_BACKLOG_MAX); MACH_CHECK_ERROR (ret); /* initialize gdb exception port */ ret = port_allocate (task_self (), &inferior->exception_port); MACH_CHECK_ERROR (ret); ret = port_set_backlog (task_self (), inferior->exception_port, PORT_BACKLOG_MAX); MACH_CHECK_ERROR (ret); ret = port_allocate (task_self (), &inferior->exception_reply_port); MACH_CHECK_ERROR (ret); ret = port_set_backlog (task_self (), inferior->exception_reply_port, PORT_BACKLOG_MAX); MACH_CHECK_ERROR (ret); /* commandeer inferior exception port */ if (inferior_bind_exception_port_flag) { next_save_exception_ports (inferior->task, &inferior->saved_exceptions); ret = task_set_exception_port (task, inferior->exception_port); MACH_CHECK_ERROR (ret); } inferior->last_thread = next_primary_thread_of_task (inferior->task); }