/* Interface GDB to the GNU Hurd.
- Copyright (C) 1992-2016 Free Software Foundation, Inc.
+ Copyright (C) 1992-2017 Free Software Foundation, Inc.
This file is part of GDB.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
-#include "defs.h"
-
-#include <ctype.h>
-#include <limits.h>
-#include <setjmp.h>
-#include <signal.h>
-#include <sys/ptrace.h>
-
+/* Mach/Hurd headers are not yet ready for C++ compilation. */
+extern "C"
+{
#include <mach.h>
#include <mach_error.h>
#include <mach/exception.h>
#include <hurd/sigpreempt.h>
#include <portinfo.h>
+}
+
+#include "defs.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <sys/ptrace.h>
#include "inferior.h"
#include "symtab.h"
#include "gdbcore.h"
#include "gdbthread.h"
#include "gdb_obstack.h"
+#include "tid-parse.h"
#include "gnu-nat.h"
#include "inf-child.h"
+/* MIG stubs are not yet ready for C++ compilation. */
+extern "C"
+{
#include "exc_request_S.h"
#include "notify_S.h"
#include "process_reply_S.h"
#include "msg_reply_S.h"
#include "exc_request_U.h"
#include "msg_U.h"
+}
static process_t proc_server = MACH_PORT_NULL;
multi-threaded, we don't bother to lock this. */
struct inf *waiting_inf;
+/* MIG stubs are not yet ready for C++ compilation. */
+extern "C" int exc_server (mach_msg_header_t *, mach_msg_header_t *);
+extern "C" int msg_reply_server (mach_msg_header_t *, mach_msg_header_t *);
+extern "C" int notify_server (mach_msg_header_t *, mach_msg_header_t *);
+extern "C" int process_reply_server (mach_msg_header_t *, mach_msg_header_t *);
+
/* Wait for something to happen in the inferior, returning what in STATUS. */
static ptid_t
gnu_wait (struct target_ops *ops,
struct proc *thread;
struct inf *inf = gnu_current_inf;
- extern int exc_server (mach_msg_header_t *, mach_msg_header_t *);
- extern int msg_reply_server (mach_msg_header_t *, mach_msg_header_t *);
- extern int notify_server (mach_msg_header_t *, mach_msg_header_t *);
- extern int process_reply_server (mach_msg_header_t *, mach_msg_header_t *);
-
gdb_assert (inf->task);
if (!inf->threads && !inf->pending_execs)
struct inf *inf = cur_inf ();
inf_debug (inf, "tracing self");
if (ptrace (PTRACE_TRACEME) != 0)
- error (_("ptrace (PTRACE_TRACEME) failed!"));
+ trace_start_error_with_name ("ptrace");
}
static void
startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
inf->pending_execs = 0;
+ /* Get rid of the old shell threads. */
+ prune_threads ();
inf_validate_procinfo (inf);
inf_update_signal_thread (inf);
return tid_str;
}
-static char *
+static const char *
gnu_pid_to_str (struct target_ops *ops, ptid_t ptid)
{
struct inf *inf = gnu_current_inf;
if (!args || (!isdigit (*args) && strcmp (args, "none") != 0))
error (_("Illegal argument to \"set signal-thread\" command.\n"
- "Should be an integer thread ID, or `none'."));
+ "Should be a thread ID, or \"none\"."));
if (strcmp (args, "none") == 0)
inf->signal_thread = 0;
else
{
- ptid_t ptid = global_thread_id_to_ptid (atoi (args));
-
- if (ptid_equal (ptid, minus_one_ptid))
- error (_("Thread ID %s not known. "
- "Use the \"info threads\" command to\n"
- "see the IDs of currently known threads."), args);
- inf->signal_thread = inf_tid_to_thread (inf, ptid_get_lwp (ptid));
+ struct thread_info *tp = parse_thread_id (args, NULL);
+ inf->signal_thread = inf_tid_to_thread (inf, ptid_get_lwp (tp->ptid));
}
}