From 01124a23b32e1d40eefe063aa416438d71ba0240 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Fri, 13 May 2011 17:31:07 +0000 Subject: [PATCH] * 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. doc/ * gdb.texinfo (Completion): Update example. (Debugging Output): Delete `set/show debug lin-lwp-async'. --- gdb/ChangeLog | 21 +++++++++++++++++++ gdb/doc/ChangeLog | 5 +++++ gdb/doc/gdb.texinfo | 13 +++++------- gdb/linux-nat.c | 34 +++++++----------------------- gdb/ui-file.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++------ gdb/ui-file.h | 14 +++++++++++++ 6 files changed, 107 insertions(+), 40 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6c19b73..65d92b5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,24 @@ +2011-05-13 Doug Evans + + * 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 * utils.c (do_value_free): New function. diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog index 40f93ee..d7a6c1d 100644 --- a/gdb/doc/ChangeLog +++ b/gdb/doc/ChangeLog @@ -1,3 +1,8 @@ +2011-05-13 Doug Evans + + * gdb.texinfo (Completion): Update example. + (Debugging Output): Delete `set/show debug lin-lwp-async'. + 2011-05-12 Kwok Cheung Yeung * gdb.texinfo: Document change in the behaviour of the enable and diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 67436dd..aadbd70 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -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 diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c index 641a619..4c4db3b 100644 --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c @@ -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); diff --git a/gdb/ui-file.c b/gdb/ui-file.c index aea7103..20b072e 100644 --- a/gdb/ui-file.c +++ b/gdb/ui-file.c @@ -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); @@ -155,6 +158,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) { return; @@ -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) { @@ -247,6 +266,13 @@ set_ui_file_write (struct ui_file *file, } 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) { file->to_read = read; @@ -437,6 +463,7 @@ mem_file_write (struct ui_file *file, '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 @@ -536,6 +566,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) { struct stdio_file *stdio = ui_file_data (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. */ diff --git a/gdb/ui-file.h b/gdb/ui-file.h index 219668a..4dc8a13 100644 --- a/gdb/ui-file.h +++ b/gdb/ui-file.h @@ -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); -- 2.7.4