X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fmingw-hdep.c;h=1a4b93bb8e838992c4cfad52e01fb32ad27b48b3;hb=6eb6fb6787430a2589e0382aa3e2e4f6f2a0a600;hp=3f69f085a3fce25a3389b56d7e48d0e1c83ba61d;hpb=b803fb0f0f7a90ca764d08f93104bc262d63ad40;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/mingw-hdep.c b/gdb/mingw-hdep.c index 3f69f085a3..1a4b93bb8e 100644 --- a/gdb/mingw-hdep.c +++ b/gdb/mingw-hdep.c @@ -1,6 +1,6 @@ /* Host support routines for MinGW, for GDB, the GNU debugger. - Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc. + Copyright (C) 2006-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -18,66 +18,26 @@ along with this program. If not, see . */ #include "defs.h" +#include "main.h" #include "serial.h" #include "event-loop.h" -#include "gdb_assert.h" #include "gdb_select.h" -#include "gdb_string.h" #include "readline/readline.h" #include -/* This event is signalled whenever an asynchronous SIGINT handler - needs to perform an action in the main thread. */ -static HANDLE sigint_event; - -/* When SIGINT_EVENT is signalled, gdb_select will call this - function. */ -struct async_signal_handler *sigint_handler; - -/* The strerror() function can return NULL for errno values that are - out of range. Provide a "safe" version that always returns a - printable string. - - The Windows runtime implementation of strerror never returns NULL, - but does return a useless string for anything above sys_nerr; - unfortunately this includes all socket-related error codes. - This replacement tries to find a system-provided error message. */ +/* Return an absolute file name of the running GDB, if possible, or + ARGV0 if not. The return value is in malloc'ed storage. */ char * -safe_strerror (int errnum) +windows_get_absolute_argv0 (const char *argv0) { - static char *buffer; - int len; - - if (errnum >= 0 && errnum < sys_nerr) - return strerror (errnum); - - if (buffer) - { - LocalFree (buffer); - buffer = NULL; - } + char full_name[PATH_MAX]; - if (FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM, - NULL, errnum, - MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPTSTR) &buffer, 0, NULL) == 0) - { - static char buf[32]; - xsnprintf (buf, sizeof buf, "(undocumented errno %d)", errnum); - return buf; - } - - /* Windows error messages end with a period and a CR-LF; strip that - out. */ - len = strlen (buffer); - if (len > 3 && strcmp (buffer + len - 3, ".\r\n") == 0) - buffer[len - 3] = '\0'; - - return buffer; + if (GetModuleFileName (NULL, full_name, PATH_MAX)) + return xstrdup (full_name); + return xstrdup (argv0); } /* Wrapper for select. On Windows systems, where the select interface @@ -152,8 +112,7 @@ gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, } } - gdb_assert (num_handles < MAXIMUM_WAIT_OBJECTS); - handles[num_handles++] = sigint_event; + gdb_assert (num_handles <= MAXIMUM_WAIT_OBJECTS); event = WaitForMultipleObjects (num_handles, handles, @@ -216,43 +175,5 @@ gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, while (RL_ISSTATE (RL_STATE_SIGHANDLER)) Sleep (1); - if (h == sigint_event - || WaitForSingleObject (sigint_event, 0) == WAIT_OBJECT_0) - { - if (sigint_handler != NULL) - call_async_signal_handler (sigint_handler); - - if (num_ready == 0) - { - errno = EINTR; - return -1; - } - } - return num_ready; } - -/* Wrapper for the body of signal handlers. On Windows systems, a - SIGINT handler runs in its own thread. We can't longjmp from - there, and we shouldn't even prompt the user. Delay HANDLER - until the main thread is next in gdb_select. */ - -void -gdb_call_async_signal_handler (struct async_signal_handler *handler, - int immediate_p) -{ - if (immediate_p) - sigint_handler = handler; - else - { - mark_async_signal_handler (handler); - sigint_handler = NULL; - } - SetEvent (sigint_event); -} - -void -_initialize_mingw_hdep (void) -{ - sigint_event = CreateEvent (0, FALSE, FALSE, 0); -}