gdb: give names to event loop file handlers
authorSimon Marchi <simon.marchi@polymtl.ca>
Fri, 2 Oct 2020 18:45:52 +0000 (14:45 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Fri, 2 Oct 2020 18:46:56 +0000 (14:46 -0400)
Assign names to event loop file handlers.  They will be used in debug
messages when file handlers are invoked.

In GDB, each UI used to get its own unique number, until commit
cbe256847e19 ("Remove ui::num").  Re-introduce this field, and use it to
make a unique name for the handler.

I'm not too sure what goes on in ser-base.c, all I know is that it's
what is used when debugging remotely.  I've just named the main handler
"serial".  It would be good to have unique names there too.  For instance
when debugging with two different remote connections, we'd ideally want
the handlers to have unique names.  I didn't do it in this patch though.

gdb/ChangeLog:

* async-event.c (initialize_async_signal_handlers): Pass name to
add_file_handler
* event-top.c (ui_register_input_event_handler): Likewise.
* linux-nat.c (linux_nat_target::async): Likewise.
* run-on-main-thread.c (_initialize_run_on_main_thread):
Likewise
* ser-base.c (reschedule): Likewise.
(ser_base_async): Likewise.
* tui/tui-io.c: Likewise.
* top.h (struct ui) <num>: New field.
* top.c (highest_ui_num): New variable.
(ui::ui): Initialize num.

gdbserver/ChangeLog:

* linux-low.cc (linux_process_target::async): Pass name to
add_file_handler.
* remote-utils.cc (handle_accept_event): Likewise.
(remote_open): Likewise.

gdbsupport/ChangeLog:

* event-loop.h (add_file_handler): Add "name" parameter.
* event-loop.cc (struct file_handler) <name>: New field.
(create_file_handler): Add "name" parameter, assign it to file
handler.
(add_file_handler): Add "name" parameter.

Change-Id: I9f1545f73888ebb6778eb653a618ca44d105f92c

15 files changed:
gdb/ChangeLog
gdb/async-event.c
gdb/event-top.c
gdb/linux-nat.c
gdb/run-on-main-thread.c
gdb/ser-base.c
gdb/top.c
gdb/top.h
gdb/tui/tui-io.c
gdbserver/ChangeLog
gdbserver/linux-low.cc
gdbserver/remote-utils.cc
gdbsupport/ChangeLog
gdbsupport/event-loop.cc
gdbsupport/event-loop.h

index 8788c60899f7f4a34d10eeccd842a7e16f6d40ee..48caf1e9057910e449d4d2f5c7af4a6c534cb179 100644 (file)
@@ -1,3 +1,18 @@
+2020-10-02  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * async-event.c (initialize_async_signal_handlers): Pass name to
+       add_file_handler
+       * event-top.c (ui_register_input_event_handler): Likewise.
+       * linux-nat.c (linux_nat_target::async): Likewise.
+       * run-on-main-thread.c (_initialize_run_on_main_thread):
+       Likewise
+       * ser-base.c (reschedule): Likewise.
+       (ser_base_async): Likewise.
+       * tui/tui-io.c: Likewise.
+       * top.h (struct ui) <num>: New field.
+       * top.c (highest_ui_num): New variable.
+       (ui::ui): Initialize num.
+
 2020-10-02  Simon Marchi  <simon.marchi@polymtl.ca>
 
        * observable.h <inferior_created>: Remove parameters.  Update all
index ffc0edcde88c13045411c20309ebe4cf12167196..e5cd63e309e4c20195425e1498bec35d6911a208 100644 (file)
@@ -114,7 +114,7 @@ initialize_async_signal_handlers (void)
   async_signal_handlers_serial_event = make_serial_event ();
 
   add_file_handler (serial_event_fd (async_signal_handlers_serial_event),
-                   async_signals_handler, NULL);
+                   async_signals_handler, NULL, "async-signals");
 }
 
 \f
index ac0f3701016e19450f516ad510b20cc26d57b758..c96f10450dda89d77d49227506d7488e4b44072f 100644 (file)
@@ -524,7 +524,8 @@ stdin_event_handler (int error, gdb_client_data client_data)
 void
 ui_register_input_event_handler (struct ui *ui)
 {
-  add_file_handler (ui->input_fd, stdin_event_handler, ui);
+  add_file_handler (ui->input_fd, stdin_event_handler, ui,
+                   string_printf ("ui-%d", ui->num));
 }
 
 /* See top.h.  */
index fbb5388594293b14f9b1f922f32384fda56877df..7b9b267fc73f0d37a9d4ac3f2f6af44b31a6d23f 100644 (file)
@@ -4123,7 +4123,8 @@ linux_nat_target::async (int enable)
       if (!linux_async_pipe (1))
        {
          add_file_handler (linux_nat_event_pipe[0],
-                           handle_target_event, NULL);
+                           handle_target_event, NULL,
+                           "linux-nat");
          /* There may be pending events to handle.  Tell the event loop
             to poll them.  */
          async_file_mark ();
index 2cc93e430d84e256baaf162f410fe306c19d542f..1e7bb5f5f8e34e8019b31a8ef560d09afaac0505 100644 (file)
@@ -94,5 +94,6 @@ void
 _initialize_run_on_main_thread ()
 {
   runnable_event = make_serial_event ();
-  add_file_handler (serial_event_fd (runnable_event), run_events, nullptr);
+  add_file_handler (serial_event_fd (runnable_event), run_events, nullptr,
+                   "run-on-main-thread");
 }
index 84ca8c6167cbacbf1e966a8d392291a79990198c..cb503f6141bf68d51a96963589e393a1c5fb979c 100644 (file)
@@ -83,7 +83,7 @@ reschedule (struct serial *scb)
        case NOTHING_SCHEDULED:
          if (scb->bufcnt == 0)
            {
-             add_file_handler (scb->fd, fd_event, scb);
+             add_file_handler (scb->fd, fd_event, scb, "serial");
              next_state = FD_SCHEDULED;
            }
          else
@@ -95,7 +95,7 @@ reschedule (struct serial *scb)
          if (scb->bufcnt == 0)
            {
              delete_timer (scb->async_state);
-             add_file_handler (scb->fd, fd_event, scb);
+             add_file_handler (scb->fd, fd_event, scb, "serial");
              next_state = FD_SCHEDULED;
            }
          else
@@ -597,7 +597,7 @@ ser_base_async (struct serial *scb,
       reschedule (scb);
 
       if (scb->error_fd != -1)
-       add_file_handler (scb->error_fd, handle_error_fd, scb);
+       add_file_handler (scb->error_fd, handle_error_fd, scb, "serial-error");
     }
   else
     {
index c50fb4dc7d4c1772ebf330b6b379bc80c3ae3dee..6233575eed68f55a35cbf6c0f8da6b5e2bd82ca9 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -270,10 +270,14 @@ void (*deprecated_call_command_hook) (struct cmd_list_element * c,
 
 void (*deprecated_context_hook) (int id);
 
+/* The highest UI number ever assigned.  */
+static int highest_ui_num;
+
 /* See top.h.  */
 
 ui::ui (FILE *instream_, FILE *outstream_, FILE *errstream_)
   : next (nullptr),
+    num (++highest_ui_num),
     call_readline (nullptr),
     input_handler (nullptr),
     command_editing (0),
index 92b096492f03182c1286b44d68fb7ce0ae9b5ca7..fd992977155f139f962244dad1c171a46420c175 100644 (file)
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -65,6 +65,9 @@ struct ui
   /* Pointer to next in singly-linked list.  */
   struct ui *next;
 
+  /* Convenient handle (UI number).  Unique across all UIs.  */
+  int num;
+
   /* The UI's command line buffer.  This is to used to accumulate
      input until we have a whole command line.  */
   struct buffer line_buffer;
index 1a2764e21967adcd48e360501f61af2daf8295b4..a4f931784161d7c2c2239f76750adfbb8a3e5035 100644 (file)
@@ -921,7 +921,7 @@ tui_initialize_io (void)
   (void) fcntl (tui_readline_pipe[0], F_SETFL, O_NDELAY);
 #endif
 #endif
-  add_file_handler (tui_readline_pipe[0], tui_readline_output, 0);
+  add_file_handler (tui_readline_pipe[0], tui_readline_output, 0, "tui");
 #else
   tui_rl_outstream = stdout;
 #endif
index d667a203e67820e66b433d6b23ce74bc0754537c..9ed90bacd008afc18f3d9b744ff1c218c4b000fa 100644 (file)
@@ -1,3 +1,10 @@
+2020-10-02  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * linux-low.cc (linux_process_target::async): Pass name to
+       add_file_handler.
+       * remote-utils.cc (handle_accept_event): Likewise.
+       (remote_open): Likewise.
+
 2020-10-01  Kamil Rytarowski  <n54@gmx.com>
 
        * netbsd-i386-low.cc: Add.
index 70d5521d4421b93f07da0776c4ca6dc4b9a845ac..1ae72a21d6c65cdfd35e6455aed6aec799685f1a 100644 (file)
@@ -6092,7 +6092,8 @@ linux_process_target::async (bool enable)
 
          /* Register the event loop handler.  */
          add_file_handler (linux_event_pipe[0],
-                           handle_target_event, NULL);
+                           handle_target_event, NULL,
+                           "linux-low");
 
          /* Always trigger a linux_wait.  */
          async_file_mark ();
index c26668dc0f8a902241e7b0b2faab6e550ad31326..5a6ceb1d9a109b8c9df75eb605e226dd9ce993aa 100644 (file)
@@ -194,7 +194,7 @@ handle_accept_event (int err, gdb_client_data client_data)
   enable_async_notification (remote_desc);
 
   /* Register the event loop handler.  */
-  add_file_handler (remote_desc, handle_serial_event, NULL);
+  add_file_handler (remote_desc, handle_serial_event, NULL, "remote-net");
 
   /* We have a new GDB connection now.  If we were disconnected
      tracing, there's a window where the target could report a stop
@@ -331,7 +331,7 @@ remote_open (const char *name)
       enable_async_notification (remote_desc);
 
       /* Register the event loop handler.  */
-      add_file_handler (remote_desc, handle_serial_event, NULL);
+      add_file_handler (remote_desc, handle_serial_event, NULL, "remote-stdio");
     }
 #ifndef USE_WIN32API
   else if (port_str == NULL)
@@ -372,7 +372,8 @@ remote_open (const char *name)
       enable_async_notification (remote_desc);
 
       /* Register the event loop handler.  */
-      add_file_handler (remote_desc, handle_serial_event, NULL);
+      add_file_handler (remote_desc, handle_serial_event, NULL,
+                       "remote-device");
     }
 #endif /* USE_WIN32API */
   else
@@ -398,7 +399,8 @@ remote_open (const char *name)
       fflush (stderr);
 
       /* Register the event loop handler.  */
-      add_file_handler (listen_desc, handle_accept_event, NULL);
+      add_file_handler (listen_desc, handle_accept_event, NULL,
+                       "remote-listen");
     }
 }
 
index 216fad129c4ecd4e2710e9f3884ba5ad58f8b989..b54bfb945ad93ad2437ca425b9619a83b40de5fb 100644 (file)
@@ -1,3 +1,11 @@
+2020-10-02  Simon Marchi  <simon.marchi@polymtl.ca>
+
+       * event-loop.h (add_file_handler): Add "name" parameter.
+       * event-loop.cc (struct file_handler) <name>: New field.
+       (create_file_handler): Add "name" parameter, assign it to file
+       handler.
+       (add_file_handler): Add "name" parameter.
+
 2020-10-01  Kamil Rytarowski  <n54@gmx.com>
 
        * agent.cc (gdb_connect_sync_socket): Preinitialize addr with zeros.
index 59436d467edea442f2e0b136072cb5e81189184f..0d78122e0cc3f01c1c0f2ab21f175dc00a31bbfd 100644 (file)
@@ -61,6 +61,9 @@ struct file_handler
   /* Argument to pass to proc.  */
   gdb_client_data client_data;
 
+  /* User-friendly name of this handler.  Heap-allocated, owned by this.*/
+  std::string *name;
+
   /* Was an error detected on this fd?  */
   int error;
 
@@ -160,7 +163,8 @@ static struct
 timer_list;
 
 static void create_file_handler (int fd, int mask, handler_func *proc,
-                                gdb_client_data client_data);
+                                gdb_client_data client_data,
+                                std::string &&name);
 static int gdb_wait_for_event (int);
 static int update_wait_timeout (void);
 static int poll_timers (void);
@@ -231,13 +235,11 @@ gdb_do_one_event (void)
   return 1;
 }
 
-\f
+/* See event-loop.h  */
 
-/* Wrapper function for create_file_handler, so that the caller
-   doesn't have to know implementation details about the use of poll
-   vs. select.  */
 void
-add_file_handler (int fd, handler_func * proc, gdb_client_data client_data)
+add_file_handler (int fd, handler_func *proc, gdb_client_data client_data,
+                 std::string &&name)
 {
 #ifdef HAVE_POLL
   struct pollfd fds;
@@ -263,21 +265,18 @@ add_file_handler (int fd, handler_func * proc, gdb_client_data client_data)
   if (use_poll)
     {
 #ifdef HAVE_POLL
-      create_file_handler (fd, POLLIN, proc, client_data);
+      create_file_handler (fd, POLLIN, proc, client_data, std::move (name));
 #else
       internal_error (__FILE__, __LINE__,
                      _("use_poll without HAVE_POLL"));
 #endif
     }
   else
-    create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION, 
-                        proc, client_data);
+    create_file_handler (fd, GDB_READABLE | GDB_EXCEPTION,
+                        proc, client_data, std::move (name));
 }
 
-/* Add a file handler/descriptor to the list of descriptors we are
-   interested in.
-
-   FD is the file descriptor for the file/stream to be listened to.
+/* Helper for add_file_handler.
 
    For the poll case, MASK is a combination (OR) of POLLIN,
    POLLRDNORM, POLLRDBAND, POLLPRI, POLLOUT, POLLWRNORM, POLLWRBAND:
@@ -289,8 +288,8 @@ add_file_handler (int fd, handler_func * proc, gdb_client_data client_data)
    occurs for FD.  CLIENT_DATA is the argument to pass to PROC.  */
 
 static void
-create_file_handler (int fd, int mask, handler_func * proc, 
-                    gdb_client_data client_data)
+create_file_handler (int fd, int mask, handler_func * proc,
+                    gdb_client_data client_data, std::string &&name)
 {
   file_handler *file_ptr;
 
@@ -358,6 +357,7 @@ create_file_handler (int fd, int mask, handler_func * proc,
   file_ptr->proc = proc;
   file_ptr->client_data = client_data;
   file_ptr->mask = mask;
+  file_ptr->name = new std::string (std::move (name));
 }
 
 /* Return the next file handler to handle, and advance to the next
@@ -489,6 +489,8 @@ delete_file_handler (int fd)
        ;
       prev_ptr->next_file = file_ptr->next_file;
     }
+
+  delete file_ptr->name;
   xfree (file_ptr);
 }
 
index 2eaaa0c8b6049212a0ae2116ba677f2faa23aa1a..d7478b037a9c1465eebf0c57ef8b54ede3512e7f 100644 (file)
@@ -78,8 +78,18 @@ typedef void (timer_handler_func) (gdb_client_data);
 
 extern int gdb_do_one_event (void);
 extern void delete_file_handler (int fd);
-extern void add_file_handler (int fd, handler_func *proc, 
-                             gdb_client_data client_data);
+
+/* Add a file handler/descriptor to the list of descriptors we are
+   interested in.
+
+   FD is the file descriptor for the file/stream to be listened to.
+
+   NAME is a user-friendly name for the handler.  */
+
+extern void add_file_handler (int fd, handler_func *proc,
+                             gdb_client_data client_data,
+                             std::string &&name);
+
 extern int create_timer (int milliseconds, 
                         timer_handler_func *proc, 
                         gdb_client_data client_data);
This page took 0.045169 seconds and 4 git commands to generate.