aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-04-12 16:49:32 +0100
committerPedro Alves <palves@redhat.com>2016-04-12 17:01:44 +0100
commit585a46a2d01d25181926329f258f1d1374f93e99 (patch)
tree7dfe0a9b82a79e729ab41950f46f414a39dbf8b5
parent048094accce2110432bf7d44c34acc17865cf85a (diff)
downloadgdb-585a46a2d01d25181926329f258f1d1374f93e99.zip
gdb-585a46a2d01d25181926329f258f1d1374f93e99.tar.gz
gdb-585a46a2d01d25181926329f258f1d1374f93e99.tar.bz2
Eliminate immediate_quit
This finally gets rid of immediate_quit (and surrounding infrustruture), as nothing sets it anymore. gdb_call_async_signal_handler was only necessary in order to handle immediate_quit. We can just call mark_async_signal_handler directly on all hosts now. In turn, we can clean up mingw-hdep.c's gdb_select a bit, as sigint_event / sigint_handler is no longer needed. gdb/ChangeLog: 2016-04-12 Pedro Alves <palves@redhat.com> * defs.h: Update comments on SIGINT handling. (immediate_quit): Delete declaration. * event-loop.c (call_async_signal_handler): Delete. * event-loop.h (call_async_signal_handler): Delete declaration. (mark_async_signal_handler): Update comments. (gdb_call_async_signal_handler): Delete declaration. * event-top.c (handle_sigint): Call mark_async_signal_handler instead of gdb_call_async_signal_handler. * exceptions.c (prepare_to_throw_exception): Remove reference to immediate_quit. (exception_fprintf): Remove comments about immediate_quit. * mingw-hdep.c (sigint_event, sigint_handler): Delete. (gdb_select): Don't wait on sigint_event. (gdb_call_async_signal_handler): Delete. (_initialize_mingw_hdep): Delete. * posix-hdep.c (gdb_call_async_signal_handler): Delete. * utils.c (immediate_quit): Delete.
-rw-r--r--gdb/ChangeLog20
-rw-r--r--gdb/defs.h11
-rw-r--r--gdb/event-loop.c9
-rw-r--r--gdb/event-loop.h24
-rw-r--r--gdb/event-top.c13
-rw-r--r--gdb/exceptions.c8
-rw-r--r--gdb/mingw-hdep.c52
-rw-r--r--gdb/posix-hdep.c13
-rw-r--r--gdb/utils.c13
9 files changed, 32 insertions, 131 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 1f6200f..0e8327e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,25 @@
2016-04-12 Pedro Alves <palves@redhat.com>
+ * defs.h: Update comments on SIGINT handling.
+ (immediate_quit): Delete declaration.
+ * event-loop.c (call_async_signal_handler): Delete.
+ * event-loop.h (call_async_signal_handler): Delete declaration.
+ (mark_async_signal_handler): Update comments.
+ (gdb_call_async_signal_handler): Delete declaration.
+ * event-top.c (handle_sigint): Call mark_async_signal_handler
+ instead of gdb_call_async_signal_handler.
+ * exceptions.c (prepare_to_throw_exception): Remove reference to
+ immediate_quit.
+ (exception_fprintf): Remove comments about immediate_quit.
+ * mingw-hdep.c (sigint_event, sigint_handler): Delete.
+ (gdb_select): Don't wait on sigint_event.
+ (gdb_call_async_signal_handler): Delete.
+ (_initialize_mingw_hdep): Delete.
+ * posix-hdep.c (gdb_call_async_signal_handler): Delete.
+ * utils.c (immediate_quit): Delete.
+
+2016-04-12 Pedro Alves <palves@redhat.com>
+
* defs.h (quit_handler_ftype, quit_handler)
(make_cleanup_override_quit_handler, default_quit_handler): New.
(QUIT): Adjust comments.
diff --git a/gdb/defs.h b/gdb/defs.h
index 83e4e11..482ef1c 100644
--- a/gdb/defs.h
+++ b/gdb/defs.h
@@ -125,11 +125,10 @@ extern char *python_libdir;
/* * Search path for separate debug files. */
extern char *debug_file_directory;
-/* GDB has two methods for handling SIGINT. When immediate_quit is
- nonzero, a SIGINT results in an immediate longjmp out of the signal
- handler. Otherwise, SIGINT simply sets a flag; code that might
- take a long time, and which ought to be interruptible, checks this
- flag using the QUIT macro.
+/* GDB's SIGINT handler basically sets a flag; code that might take a
+ long time before it gets back to the event loop, and which ought to
+ be interruptible, checks this flag using the QUIT macro, which, if
+ GDB has the terminal, throws a quit exception.
In addition to setting a flag, the SIGINT handler also marks a
select/poll-able file descriptor as read-ready. That is used by
@@ -176,8 +175,6 @@ extern void default_quit_handler (void);
/* Flag that function quit should call quit_force. */
extern volatile int sync_quit_force_run;
-extern int immediate_quit;
-
extern void quit (void);
/* Helper for the QUIT macro. */
diff --git a/gdb/event-loop.c b/gdb/event-loop.c
index 052d535..60ef2a5 100644
--- a/gdb/event-loop.c
+++ b/gdb/event-loop.c
@@ -911,15 +911,6 @@ create_async_signal_handler (sig_handler_func * proc,
return async_handler_ptr;
}
-/* Call the handler from HANDLER immediately. This function runs
- signal handlers when returning to the event loop would be too
- slow. */
-void
-call_async_signal_handler (struct async_signal_handler *handler)
-{
- (*handler->proc) (handler->client_data);
-}
-
/* Mark the handler (ASYNC_HANDLER_PTR) as ready. This information
will be used when the handlers are invoked, after we have waited
for some event. The caller of this function is the interrupt
diff --git a/gdb/event-loop.h b/gdb/event-loop.h
index 155dafa..7159d97 100644
--- a/gdb/event-loop.h
+++ b/gdb/event-loop.h
@@ -91,16 +91,9 @@ extern int create_timer (int milliseconds,
gdb_client_data client_data);
extern void delete_timer (int id);
-/* Call the handler from HANDLER immediately. This function
- runs signal handlers when returning to the event loop would be too
- slow. Do not call this directly; use gdb_call_async_signal_handler,
- below, with IMMEDIATE_P == 1. */
-void call_async_signal_handler (struct async_signal_handler *handler);
-
-/* Call the handler from HANDLER the next time through the event loop.
- Do not call this directly; use gdb_call_async_signal_handler,
- below, with IMMEDIATE_P == 0. */
-void mark_async_signal_handler (struct async_signal_handler *handler);
+/* Call the handler from HANDLER the next time through the event
+ loop. */
+extern void mark_async_signal_handler (struct async_signal_handler *handler);
/* Returns true if HANDLER is marked ready. */
@@ -111,17 +104,6 @@ extern int
extern void clear_async_signal_handler (struct async_signal_handler *handler);
-/* Wrapper for the body of signal handlers. Call this function from
- any SIGINT handler which needs to access GDB data structures or
- escape via longjmp. If IMMEDIATE_P is set, this triggers either
- immediately (for POSIX platforms), or from gdb_select (for
- MinGW). If IMMEDIATE_P is clear, the handler will run the next
- time we return to the event loop and any current select calls
- will be interrupted. */
-
-void gdb_call_async_signal_handler (struct async_signal_handler *handler,
- int immediate_p);
-
/* Create and register an asynchronous event source in the event loop,
and set PROC as its callback. CLIENT_DATA is passed as argument to
PROC upon its invocation. Returns a pointer to an opaque structure
diff --git a/gdb/event-top.c b/gdb/event-top.c
index 41d3aac..fc1a6c6 100644
--- a/gdb/event-top.c
+++ b/gdb/event-top.c
@@ -901,18 +901,11 @@ handle_sigint (int sig)
it may be quite a while before we get back to the event loop. So
set quit_flag to 1 here. Then if QUIT is called before we get to
the event loop, we will unwind as expected. */
-
set_quit_flag ();
- /* If immediate_quit is set, we go ahead and process the SIGINT right
- away, even if we usually would defer this to the event loop. The
- assumption here is that it is safe to process ^C immediately if
- immediate_quit is set. If we didn't, SIGINT would be really
- processed only the next time through the event loop. To get to
- that point, though, the command that we want to interrupt needs to
- finish first, which is unacceptable. If immediate quit is not set,
- we process SIGINT the next time through the loop, which is fine. */
- gdb_call_async_signal_handler (sigint_token, immediate_quit);
+ /* In case nothing calls QUIT before the event loop is reached, the
+ event loop handles it. */
+ mark_async_signal_handler (sigint_token);
}
/* See gdb_select.h. */
diff --git a/gdb/exceptions.c b/gdb/exceptions.c
index ffdd1f3..7f6599f 100644
--- a/gdb/exceptions.c
+++ b/gdb/exceptions.c
@@ -30,7 +30,6 @@
void
prepare_to_throw_exception (void)
{
- immediate_quit = 0;
}
static void
@@ -148,12 +147,7 @@ exception_fprintf (struct ui_file *file, struct gdb_exception e,
returned by catch_exceptions(). It is an internal_error() for
FUNC() to return a negative value.
- See exceptions.h for further usage details.
-
- Must not be called with immediate_quit in effect (bad things might
- happen, say we got a signal in the middle of a memcpy to quit_return).
- This is an OK restriction; with very few exceptions immediate_quit can
- be replaced by judicious use of QUIT. */
+ See exceptions.h for further usage details. */
/* MAYBE: cagney/1999-11-05: catch_errors() in conjunction with
error() et al. could maintain a set of flags that indicate the
diff --git a/gdb/mingw-hdep.c b/gdb/mingw-hdep.c
index 8247a8c..2e010fa 100644
--- a/gdb/mingw-hdep.c
+++ b/gdb/mingw-hdep.c
@@ -27,14 +27,6 @@
#include <windows.h>
-/* 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;
-
/* Return an absolute file name of the running GDB, if possible, or
ARGV0 if not. The return value is in malloc'ed storage. */
@@ -120,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,
@@ -184,46 +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);
-}
-
-/* -Wmissing-prototypes */
-extern initialize_file_ftype _initialize_mingw_hdep;
-
-void
-_initialize_mingw_hdep (void)
-{
- sigint_event = CreateEvent (0, FALSE, FALSE, 0);
-}
diff --git a/gdb/posix-hdep.c b/gdb/posix-hdep.c
index 90cab8f..e9db576 100644
--- a/gdb/posix-hdep.c
+++ b/gdb/posix-hdep.c
@@ -30,16 +30,3 @@ gdb_select (int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
{
return select (n, readfds, writefds, exceptfds, timeout);
}
-
-/* Wrapper for the body of signal handlers. Nothing special needed on
- POSIX platforms. */
-
-void
-gdb_call_async_signal_handler (struct async_signal_handler *handler,
- int immediate_p)
-{
- if (immediate_p)
- call_async_signal_handler (handler);
- else
- mark_async_signal_handler (handler);
-}
diff --git a/gdb/utils.c b/gdb/utils.c
index bc62218..db5104d 100644
--- a/gdb/utils.c
+++ b/gdb/utils.c
@@ -109,19 +109,6 @@ static int debug_timestamp = 0;
int job_control;
-/* Nonzero means quit immediately if Control-C is typed now, rather
- than waiting until QUIT is executed. Be careful in setting this;
- code which executes with immediate_quit set has to be very careful
- about being able to deal with being interrupted at any time. It is
- almost always better to use QUIT; the only exception I can think of
- is being able to quit out of a system call (using EINTR loses if
- the SIGINT happens between the previous QUIT and the system call).
- To immediately quit in the case in which a SIGINT happens between
- the previous QUIT and setting immediate_quit (desirable anytime we
- expect to block), call QUIT after setting immediate_quit. */
-
-int immediate_quit;
-
/* Nonzero means that strings with character values >0x7F should be printed
as octal escapes. Zero means just print the value (e.g. it's an
international character, and the terminal or window can cope.) */