* linux-nat.c (debug_linux_nat_async): Delete.
authorDoug Evans <dje@google.com>
Fri, 13 May 2011 17:31:07 +0000 (17:31 +0000)
committerDoug Evans <dje@google.com>
Fri, 13 May 2011 17:31:07 +0000 (17:31 +0000)
Replace all references to use debug_linux_nat instead.
(show_debug_linux_nat_async): Delete.
(sigchld_handler): Call ui_file_write_async_safe instead of
fprintf_unfiltered.
(_initialize_linux_nat): Remove `set debug lin-lwp-async'.
* ui-file.c (struct ui_file): New member to_write_async_safe.
(null_file_write_async_safe): New function.
(ui_file_write_async_safe): New function.
(set_ui_file_write_async_safe): New function.
(ui_file_new): Initialize to_write_async_safe.
(stdio_file_write_async_safe): New function.
(struct stdio_file): New member fd.
(stdio_file_new): Initialize to_write_async_safe, fd.
(stdio_file_read, stdio_file_isatty): New stdio->fd instead of calling fileno.
* ui-file.h (ui_file_write_async_safe_ftype): New typedef.
(set_ui_file_write_async_safe): Declare.
(ui_file_write_async_safe): Declare.

doc/
* gdb.texinfo (Completion): Update example.
(Debugging Output): Delete `set/show debug lin-lwp-async'.

gdb/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/linux-nat.c
gdb/ui-file.c
gdb/ui-file.h

index 6c19b73371e54d42c298646502602a49196c9592..65d92b5bb7917edb851913b2742aea0c2a0869d6 100644 (file)
@@ -1,3 +1,24 @@
+2011-05-13  Doug Evans  <dje@google.com>
+
+       * linux-nat.c (debug_linux_nat_async): Delete.
+       Replace all references to use debug_linux_nat instead.
+       (show_debug_linux_nat_async): Delete.
+       (sigchld_handler): Call ui_file_write_async_safe instead of
+       fprintf_unfiltered.
+       (_initialize_linux_nat): Remove `set debug lin-lwp-async'.
+       * ui-file.c (struct ui_file): New member to_write_async_safe.
+       (null_file_write_async_safe): New function.
+       (ui_file_write_async_safe): New function.
+       (set_ui_file_write_async_safe): New function.
+       (ui_file_new): Initialize to_write_async_safe.
+       (stdio_file_write_async_safe): New function.
+       (struct stdio_file): New member fd.
+       (stdio_file_new): Initialize to_write_async_safe, fd.
+       (stdio_file_read, stdio_file_isatty): New stdio->fd instead of calling fileno.
+       * ui-file.h (ui_file_write_async_safe_ftype): New typedef.
+       (set_ui_file_write_async_safe): Declare.
+       (ui_file_write_async_safe): Declare.
+
 2011-05-13  Tom Tromey  <tromey@redhat.com>
 
        * utils.c (do_value_free): New function.
index 40f93eef0910cc8d4834beba83dfea22198232d7..d7a6c1da0bf44db4bf1eacbab83ca7b05e41222a 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-13  Doug Evans  <dje@google.com>
+
+       * gdb.texinfo (Completion): Update example.
+       (Debugging Output): Delete `set/show debug lin-lwp-async'.
+
 2011-05-12  Kwok Cheung Yeung  <kcy@codesourcery.com>
 
        * gdb.texinfo: Document change in the behaviour of the enable and
index 67436dd56f83ae5186e6f1164e498237b0f4fe9e..aadbd70c4fca63183121afc7420e5a764576fe9a 100644 (file)
@@ -1592,8 +1592,10 @@ left-hand-side:
 
 @smallexample
 (@value{GDBP}) p gdb_stdout.@kbd{M-?}
-magic      to_delete  to_fputs   to_put     to_rewind  
-to_data    to_flush   to_isatty  to_read    to_write   
+magic                to_fputs             to_rewind
+to_data              to_isatty            to_write
+to_delete            to_put               to_write_async_safe
+to_flush             to_read
 @end smallexample
 
 @noindent
@@ -1607,6 +1609,7 @@ struct ui_file
    int *magic;
    ui_file_flush_ftype *to_flush;
    ui_file_write_ftype *to_write;
+   ui_file_write_async_safe_ftype *to_write_async_safe;
    ui_file_fputs_ftype *to_fputs;
    ui_file_read_ftype *to_read;
    ui_file_delete_ftype *to_delete;
@@ -20071,12 +20074,6 @@ Displays the current state of @value{GDBN} JIT debugging.
 Turns on or off debugging messages from the Linux LWP debug support.
 @item show debug lin-lwp
 Show the current state of Linux LWP debugging messages.
-@item set debug lin-lwp-async
-@cindex @sc{gnu}/Linux LWP async debug messages
-@cindex Linux lightweight processes
-Turns on or off debugging messages from the Linux LWP async debug support.
-@item show debug lin-lwp-async
-Show the current state of Linux LWP async debugging messages.
 @item set debug observer
 @cindex observer debugging info
 Turns on or off display of @value{GDBN} observer debugging.  This
index 641a619727cce8ba78d616294c9367f38751685d..4c4db3bc0615752fc1d00b7ee62d0aa99518186c 100644 (file)
@@ -198,16 +198,6 @@ show_debug_linux_nat (struct ui_file *file, int from_tty,
                    value);
 }
 
-static int debug_linux_nat_async = 0;
-static void
-show_debug_linux_nat_async (struct ui_file *file, int from_tty,
-                           struct cmd_list_element *c, const char *value)
-{
-  fprintf_filtered (file,
-                   _("Debugging of GNU/Linux async lwp module is %s.\n"),
-                   value);
-}
-
 static int disable_randomization = 1;
 
 static void
@@ -3260,7 +3250,7 @@ linux_nat_wait_1 (struct target_ops *ops,
   int status = 0;
   pid_t pid;
 
-  if (debug_linux_nat_async)
+  if (debug_linux_nat)
     fprintf_unfiltered (gdb_stdlog, "LLW: enter\n");
 
   /* The first time we get here after starting a new inferior, we may
@@ -3303,7 +3293,7 @@ retry:
     {
       ourstatus->kind = TARGET_WAITKIND_IGNORE;
 
-      if (debug_linux_nat_async)
+      if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog, "LLW: exit (no resumed LWP)\n");
 
       restore_child_signals_mask (&prev_mask);
@@ -3546,7 +3536,7 @@ retry:
                  /* No interesting event.  */
                  ourstatus->kind = TARGET_WAITKIND_IGNORE;
 
-                 if (debug_linux_nat_async)
+                 if (debug_linux_nat)
                    fprintf_unfiltered (gdb_stdlog, "LLW: exit (ignore)\n");
 
                  restore_child_signals_mask (&prev_mask);
@@ -3561,7 +3551,7 @@ retry:
          /* No interesting event for PID yet.  */
          ourstatus->kind = TARGET_WAITKIND_IGNORE;
 
-         if (debug_linux_nat_async)
+         if (debug_linux_nat)
            fprintf_unfiltered (gdb_stdlog, "LLW: exit (ignore)\n");
 
          restore_child_signals_mask (&prev_mask);
@@ -3690,7 +3680,7 @@ retry:
   else
     store_waitstatus (ourstatus, status);
 
-  if (debug_linux_nat_async)
+  if (debug_linux_nat)
     fprintf_unfiltered (gdb_stdlog, "LLW: exit\n");
 
   restore_child_signals_mask (&prev_mask);
@@ -5416,8 +5406,9 @@ sigchld_handler (int signo)
 {
   int old_errno = errno;
 
-  if (debug_linux_nat_async)
-    fprintf_unfiltered (gdb_stdlog, "sigchld\n");
+  if (debug_linux_nat)
+    ui_file_write_async_safe (gdb_stdlog,
+                             "sigchld\n", sizeof ("sigchld\n") - 1);
 
   if (signo == SIGCHLD
       && linux_nat_event_pipe[0] != -1)
@@ -5801,15 +5792,6 @@ Enables printf debugging output."),
                            show_debug_linux_nat,
                            &setdebuglist, &showdebuglist);
 
-  add_setshow_zinteger_cmd ("lin-lwp-async", class_maintenance,
-                           &debug_linux_nat_async, _("\
-Set debugging of GNU/Linux async lwp module."), _("\
-Show debugging of GNU/Linux async lwp module."), _("\
-Enables printf debugging output."),
-                           NULL,
-                           show_debug_linux_nat_async,
-                           &setdebuglist, &showdebuglist);
-
   /* Save this mask as the default.  */
   sigprocmask (SIG_SETMASK, NULL, &normal_mask);
 
index aea7103800456b01b0f652ae507c765d41c25834..20b072e59174182f32be68141a6c43793f15f2e6 100644 (file)
@@ -30,6 +30,7 @@
 
 static ui_file_isatty_ftype null_file_isatty;
 static ui_file_write_ftype null_file_write;
+static ui_file_write_ftype null_file_write_async_safe;
 static ui_file_fputs_ftype null_file_fputs;
 static ui_file_read_ftype null_file_read;
 static ui_file_flush_ftype null_file_flush;
@@ -42,6 +43,7 @@ struct ui_file
     int *magic;
     ui_file_flush_ftype *to_flush;
     ui_file_write_ftype *to_write;
+    ui_file_write_async_safe_ftype *to_write_async_safe;
     ui_file_fputs_ftype *to_fputs;
     ui_file_read_ftype *to_read;
     ui_file_delete_ftype *to_delete;
@@ -61,6 +63,7 @@ ui_file_new (void)
   set_ui_file_data (file, NULL, null_file_delete);
   set_ui_file_flush (file, null_file_flush);
   set_ui_file_write (file, null_file_write);
+  set_ui_file_write_async_safe (file, null_file_write_async_safe);
   set_ui_file_fputs (file, null_file_fputs);
   set_ui_file_read (file, null_file_read);
   set_ui_file_isatty (file, null_file_isatty);
@@ -154,6 +157,14 @@ null_file_fputs (const char *buf, struct ui_file *file)
     }
 }
 
+static void
+null_file_write_async_safe (struct ui_file *file,
+                           const char *buf,
+                           long sizeof_buf)
+{
+  return;
+}
+
 static void
 null_file_delete (struct ui_file *file)
 {
@@ -203,6 +214,14 @@ ui_file_write (struct ui_file *file,
   file->to_write (file, buf, length_buf);
 }
 
+void
+ui_file_write_async_safe (struct ui_file *file,
+                         const char *buf,
+                         long length_buf)
+{
+  file->to_write_async_safe (file, buf, length_buf);
+}
+
 long
 ui_file_read (struct ui_file *file, char *buf, long length_buf)
 {
@@ -246,6 +265,13 @@ set_ui_file_write (struct ui_file *file,
   file->to_write = write;
 }
 
+void
+set_ui_file_write_async_safe (struct ui_file *file,
+                             ui_file_write_async_safe_ftype *write_async_safe)
+{
+  file->to_write_async_safe = write_async_safe;
+}
+
 void
 set_ui_file_read (struct ui_file *file, ui_file_read_ftype *read)
 {
@@ -437,6 +463,7 @@ mem_file_write (struct ui_file *file,
    <stdio.h>'s FILE.  */
 
 static ui_file_write_ftype stdio_file_write;
+static ui_file_write_async_safe_ftype stdio_file_write_async_safe;
 static ui_file_fputs_ftype stdio_file_fputs;
 static ui_file_read_ftype stdio_file_read;
 static ui_file_isatty_ftype stdio_file_isatty;
@@ -450,6 +477,9 @@ struct stdio_file
   {
     int *magic;
     FILE *file;
+    /* The associated file descriptor is extracted ahead of time for
+       stdio_file_write_async_safe's benefit, in case fileno isn't async-safe.  */
+    int fd;
     int close_p;
   };
 
@@ -461,10 +491,12 @@ stdio_file_new (FILE *file, int close_p)
 
   stdio->magic = &stdio_file_magic;
   stdio->file = file;
+  stdio->fd = fileno (file);
   stdio->close_p = close_p;
   set_ui_file_data (ui_file, stdio, stdio_file_delete);
   set_ui_file_flush (ui_file, stdio_file_flush);
   set_ui_file_write (ui_file, stdio_file_write);
+  set_ui_file_write_async_safe (ui_file, stdio_file_write_async_safe);
   set_ui_file_fputs (ui_file, stdio_file_fputs);
   set_ui_file_read (ui_file, stdio_file_read);
   set_ui_file_isatty (ui_file, stdio_file_isatty);
@@ -510,16 +542,14 @@ stdio_file_read (struct ui_file *file, char *buf, long length_buf)
      the file.  Wait until at least one byte of data is available.
      Control-C can interrupt gdb_select, but not read.  */
   {
-    int fd = fileno (stdio->file);
-
     fd_set readfds;
     FD_ZERO (&readfds);
-    FD_SET (fd, &readfds);
-    if (gdb_select (fd + 1, &readfds, NULL, NULL, NULL) == -1)
+    FD_SET (stdio->fd, &readfds);
+    if (gdb_select (stdio->fd + 1, &readfds, NULL, NULL, NULL) == -1)
       return -1;
   }
 
-  return read (fileno (stdio->file), buf, length_buf);
+  return read (stdio->fd, buf, length_buf);
 }
 
 static void
@@ -535,6 +565,24 @@ stdio_file_write (struct ui_file *file, const char *buf, long length_buf)
     ;
 }
 
+static void
+stdio_file_write_async_safe (struct ui_file *file,
+                            const char *buf, long length_buf)
+{
+  struct stdio_file *stdio = ui_file_data (file);
+
+  if (stdio->magic != &stdio_file_magic)
+    {
+      /* gettext isn't necessarily async safe, so we can't use _("error message") here.
+        We could extract the correct translation ahead of time, but this is an extremely
+        rare event, and one of the other stdio_file_* routines will presumably catch
+        the problem anyway.  For now keep it simple and ignore the error here.  */
+      return;
+    }
+
+  write (stdio->fd, buf, length_buf);
+}
+
 static void
 stdio_file_fputs (const char *linebuffer, struct ui_file *file)
 {
@@ -556,7 +604,7 @@ stdio_file_isatty (struct ui_file *file)
   if (stdio->magic != &stdio_file_magic)
     internal_error (__FILE__, __LINE__,
                    _("stdio_file_isatty: bad magic number"));
-  return (isatty (fileno (stdio->file)));
+  return (isatty (stdio->fd));
 }
 
 /* Like fdopen().  Create a ui_file from a previously opened FILE.  */
index 219668a735984492e40ac55aa4e7934afa554d75..4dc8a13e8d2c8b83d15e53f5b9d9ce17e5b63967 100644 (file)
@@ -45,6 +45,17 @@ typedef void (ui_file_fputs_ftype) (const char *, struct ui_file *stream);
 extern void set_ui_file_fputs (struct ui_file *stream,
                               ui_file_fputs_ftype *fputs);
 
+/* This version of "write" is safe for use in signal handlers.
+   It's not guaranteed that all existing output will have been
+   flushed first.
+   Implementations are also free to ignore some or all of the request.
+   fputs_async is not provided as the async versions are rarely used,
+   no point in having both for a rarely used interface.  */
+typedef void (ui_file_write_async_safe_ftype)
+  (struct ui_file *stream, const char *buf, long length_buf);
+extern void set_ui_file_write_async_safe
+  (struct ui_file *stream, ui_file_write_async_safe_ftype *write_async_safe);
+
 typedef long (ui_file_read_ftype) (struct ui_file *stream,
                                   char *buf, long length_buf);
 extern void set_ui_file_read (struct ui_file *stream,
@@ -83,6 +94,9 @@ extern int ui_file_isatty (struct ui_file *);
 extern void ui_file_write (struct ui_file *file, const char *buf,
                           long length_buf);
 
+extern void ui_file_write_async_safe (struct ui_file *file, const char *buf,
+                                     long length_buf);
+
 /* NOTE: copies left to right.  */
 extern void ui_file_put (struct ui_file *src,
                         ui_file_put_method_ftype *write, void *dest);
This page took 0.073394 seconds and 4 git commands to generate.