diff options
author | Doug Evans <dje@google.com> | 2011-05-13 17:31:07 +0000 |
---|---|---|
committer | Doug Evans <dje@google.com> | 2011-05-13 17:31:07 +0000 |
commit | 01124a23b32e1d40eefe063aa416438d71ba0240 (patch) | |
tree | 5762327207e3693e5a4b2969c841df4165af4568 /gdb/ui-file.c | |
parent | 6edba76fe8b37bf2a8f7c84353aa0252724bf293 (diff) | |
download | gdb-01124a23b32e1d40eefe063aa416438d71ba0240.zip gdb-01124a23b32e1d40eefe063aa416438d71ba0240.tar.gz gdb-01124a23b32e1d40eefe063aa416438d71ba0240.tar.bz2 |
* 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'.
Diffstat (limited to 'gdb/ui-file.c')
-rw-r--r-- | gdb/ui-file.c | 60 |
1 files changed, 54 insertions, 6 deletions
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, <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 @@ -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. */ |