From 96da9a8ea6f3bcbceff92ae2293b4808b39dcdb2 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Sat, 23 Feb 2002 06:02:02 +0000 Subject: Per discussion with Manuel, when we call __stdio_flush_buffers from abort() and from _exit(), we need to ensure that flushing will not cause us to block. So use fcntl to set the fd's to non-block mode... --- libc/stdio/stdio.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'libc/stdio') diff --git a/libc/stdio/stdio.c b/libc/stdio/stdio.c index 45cd0b8ec..eb2961f37 100644 --- a/libc/stdio/stdio.c +++ b/libc/stdio/stdio.c @@ -198,7 +198,15 @@ char _free_buffer_index = FIXED_BUFFERS; */ void __stdio_flush_buffers(void) { - fflush(NULL); /* Files will be closed on _exit call. */ + FILE *fp; + for (fp = __IO_list; fp; fp = fp->next) { + if (WRITEABLE(fp)) { + /* Set the underlying fd to non-block mode to ensure + * that calls to _exit() and abort() will not block */ + fcntl(fp->fd, F_SETFL, O_NONBLOCK); + fflush(fp); + } + } } /* -- cgit v1.2.3