summaryrefslogtreecommitdiff
path: root/gdb/ui-file.c
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2011-05-13 17:28:19 +0000
committerDoug Evans <dje@google.com>2011-05-13 17:28:19 +0000
commit6d388522f216dbd257225e13071341e5d59114d0 (patch)
treef63698e4349744f230260a899b5eabc345621e75 /gdb/ui-file.c
parent9fd8824132f05a3a588e918d9bb74b5d1b43945d (diff)
downloadgdb-6d388522f216dbd257225e13071341e5d59114d0.tar.gz
* 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.c60
1 files changed, 54 insertions, 6 deletions
diff --git a/gdb/ui-file.c b/gdb/ui-file.c
index aea71038004..20b072e5917 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. */