[RFC,02/17] Move gdb-specific code out of start_event_loop

Message ID 20190224165153.5062-3-tom@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey Feb. 24, 2019, 4:51 p.m. UTC
  This moves some gdb-specific code out of start_event_loop, into a new
function that must be supplied by the event-loop client.

gdb/ChangeLog
2019-02-24  Tom Tromey  <tom@tromey.com>

	* main.c (handle_event_loop_exception): New function.
	* event-loop.c: Don't include event-top.h or observable.h.
	(start_event_loop): Remove gdb-specific code.  Call
	handle_event_loop_exception.
	* event-loop.h (handle_event_loop_exception): Declare.
---
 gdb/ChangeLog    |  8 ++++++++
 gdb/event-loop.c | 26 ++------------------------
 gdb/event-loop.h |  6 +++++-
 gdb/main.c       | 28 ++++++++++++++++++++++++++++
 4 files changed, 43 insertions(+), 25 deletions(-)
  

Comments

Pedro Alves Sept. 26, 2019, 2:02 p.m. UTC | #1
On 2/24/19 4:51 PM, Tom Tromey wrote:
> This moves some gdb-specific code out of start_event_loop, into a new
> function that must be supplied by the event-loop client.
> 
> gdb/ChangeLog
> 2019-02-24  Tom Tromey  <tom@tromey.com>
> 
> 	* main.c (handle_event_loop_exception): New function.
> 	* event-loop.c: Don't include event-top.h or observable.h.
> 	(start_event_loop): Remove gdb-specific code.  Call
> 	handle_event_loop_exception.
> 	* event-loop.h (handle_event_loop_exception): Declare.

I think I'd rather move the whole start_event_loop to gdb.
IIUC, gdbserver version wants to let the exception propagate, so
it'd end up being a while (1) loop calling gdb_do_one_event.

I think the result will be clearer with fewer callsbacks and
no need for the shared ability to stop the event loop that is
only used by gdbserver.

Thanks,
Pedro Alves
  

Patch

diff --git a/gdb/event-loop.c b/gdb/event-loop.c
index 4d05eb9a243..f41094e9add 100644
--- a/gdb/event-loop.c
+++ b/gdb/event-loop.c
@@ -19,7 +19,6 @@ 
 
 #include "defs.h"
 #include "event-loop.h"
-#include "event-top.h"
 #include "ser-event.h"
 
 #ifdef HAVE_POLL
@@ -33,7 +32,6 @@ 
 #include <sys/types.h>
 #include "common/gdb_sys_time.h"
 #include "gdb_select.h"
-#include "observable.h"
 #include "top.h"
 
 /* Tell create_file_handler what events we are interested in.
@@ -355,7 +353,7 @@  gdb_do_one_event (void)
    from the command loop.  */
 
 void
-start_event_loop (void)
+start_event_loop ()
 {
   /* Loop until there is nothing to do.  This is the entry point to
      the event loop engine.  gdb_do_one_event will process one event
@@ -371,27 +369,7 @@  start_event_loop (void)
 	}
       CATCH (ex, RETURN_MASK_ALL)
 	{
-	  exception_print (gdb_stderr, ex);
-
-	  /* If any exception escaped to here, we better enable
-	     stdin.  Otherwise, any command that calls async_disable_stdin,
-	     and then throws, will leave stdin inoperable.  */
-	  async_enable_stdin ();
-	  /* If we long-jumped out of do_one_event, we probably didn't
-	     get around to resetting the prompt, which leaves readline
-	     in a messed-up state.  Reset it here.  */
-	  current_ui->prompt_state = PROMPT_NEEDED;
-	  gdb::observers::command_error.notify ();
-	  /* This call looks bizarre, but it is required.  If the user
-	     entered a command that caused an error,
-	     after_char_processing_hook won't be called from
-	     rl_callback_read_char_wrapper.  Using a cleanup there
-	     won't work, since we want this function to be called
-	     after a new prompt is printed.  */
-	  if (after_char_processing_hook)
-	    (*after_char_processing_hook) ();
-	  /* Maybe better to set a flag to be checked somewhere as to
-	     whether display the prompt or not.  */
+	  handle_event_loop_exception (ex);
 	}
       END_CATCH
 
diff --git a/gdb/event-loop.h b/gdb/event-loop.h
index 99b776618bd..f11b008848d 100644
--- a/gdb/event-loop.h
+++ b/gdb/event-loop.h
@@ -80,7 +80,7 @@  typedef void (timer_handler_func) (gdb_client_data);
 
 /* Exported functions from event-loop.c */
 
-extern void start_event_loop (void);
+extern void start_event_loop ();
 extern int gdb_do_one_event (void);
 extern void delete_file_handler (int fd);
 extern void add_file_handler (int fd, handler_func *proc, 
@@ -131,4 +131,8 @@  extern void clear_async_event_handler (struct async_event_handler *handler);
 
 extern void initialize_async_signal_handlers (void);
 
+/* Must be defined by client.  */
+
+extern void handle_event_loop_exception (const gdb_exception &);
+
 #endif /* EVENT_LOOP_H */
diff --git a/gdb/main.c b/gdb/main.c
index e14dd06fa8c..f60f0d0a092 100644
--- a/gdb/main.c
+++ b/gdb/main.c
@@ -48,6 +48,7 @@ 
 #include <vector>
 #include "common/pathstuff.h"
 #include "cli/cli-style.h"
+#include "observable.h"
 
 /* The selected interpreter.  This will be used as a set command
    variable, so it should always be malloc'ed - since
@@ -314,6 +315,33 @@  setup_alternate_signal_stack (void)
    here.  */
 static void captured_command_loop () __attribute__((noinline));
 
+/* Called to handle an exception when processing an event.  */
+void
+handle_event_loop_exception (const gdb_exception &ex)
+{
+  exception_print (gdb_stderr, ex);
+
+  /* If any exception escaped to here, we better enable
+     stdin.  Otherwise, any command that calls async_disable_stdin,
+     and then throws, will leave stdin inoperable.  */
+  async_enable_stdin ();
+  /* If we long-jumped out of do_one_event, we probably didn't
+     get around to resetting the prompt, which leaves readline
+     in a messed-up state.  Reset it here.  */
+  current_ui->prompt_state = PROMPT_NEEDED;
+  gdb::observers::command_error.notify ();
+  /* This call looks bizarre, but it is required.  If the user
+     entered a command that caused an error,
+     after_char_processing_hook won't be called from
+     rl_callback_read_char_wrapper.  Using a cleanup there
+     won't work, since we want this function to be called
+     after a new prompt is printed.  */
+  if (after_char_processing_hook)
+    (*after_char_processing_hook) ();
+  /* Maybe better to set a flag to be checked somewhere as to
+     whether display the prompt or not.  */
+}
+
 static void
 captured_command_loop ()
 {