diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | libio/genops.c | 22 | ||||
-rw-r--r-- | libio/libioP.h | 3 | ||||
-rw-r--r-- | sysdeps/generic/abort.c | 4 |
4 files changed, 30 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog index 5e63a3490a..4194944f80 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2001-11-28 Ulrich Drepper <drepper@redhat.com> + + * libio/genops.c (_IO_flush_all_lockp): New function. The same code + as the old _IO_flush_all but lock only if parameter is nonzero. + (_IO_flush_all): Call _IO_flush_all_lockp with 1 as parameter. + * libio/libioP.h: Add prototype for _IO_flush_all_lockp. + * sysdeps/generic/abort.c (fflush): Define to _IO_flush_all_lockp(0) + if libio is used. + 2001-11-28 Jakub Jelinek <jakub@redhat.com> * sysdeps/sparc/fpu/bits/mathinline.h (__signbitf, __signbit, diff --git a/libio/genops.c b/libio/genops.c index d786ebca57..2398cff684 100644 --- a/libio/genops.c +++ b/libio/genops.c @@ -784,7 +784,7 @@ _IO_get_column (fp) int -_IO_flush_all () +_IO_flush_all_lockp (int do_lock) { int result = 0; struct _IO_FILE *fp; @@ -792,7 +792,8 @@ _IO_flush_all () #ifdef _IO_MTSAFE_IO _IO_cleanup_region_start_noarg (flush_cleanup); - _IO_lock_lock (list_all_lock); + if (do_lock) + _IO_lock_lock (list_all_lock); #endif last_stamp = _IO_list_all_stamp; @@ -800,7 +801,8 @@ _IO_flush_all () while (fp != NULL) { run_fp = fp; - _IO_flockfile (fp); + if (do_lock) + _IO_flockfile (fp); if (((fp->_mode <= 0 && fp->_IO_write_ptr > fp->_IO_write_base) #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T @@ -812,7 +814,8 @@ _IO_flush_all () && _IO_OVERFLOW (fp, EOF) == EOF) result = EOF; - _IO_funlockfile (fp); + if (do_lock) + _IO_funlockfile (fp); run_fp = NULL; if (last_stamp != _IO_list_all_stamp) @@ -826,13 +829,22 @@ _IO_flush_all () } #ifdef _IO_MTSAFE_IO - _IO_lock_unlock (list_all_lock); + if (do_lock) + _IO_lock_unlock (list_all_lock); _IO_cleanup_region_end (0); #endif return result; } + +int +_IO_flush_all () +{ + /* We want locking. */ + return _IO_flush_all_lockp (1); +} + void _IO_flush_all_linebuffered () { diff --git a/libio/libioP.h b/libio/libioP.h index 9a336fb0cb..3a32caa8b6 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. +/* Copyright (C) 1993,1997,1998,1999,2000,2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -426,6 +426,7 @@ extern int _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t)); extern int _IO_new_do_write __P ((_IO_FILE *, const char *, _IO_size_t)); extern int _IO_old_do_write __P ((_IO_FILE *, const char *, _IO_size_t)); extern int _IO_wdo_write __P ((_IO_FILE *, const wchar_t *, _IO_size_t)); +extern int _IO_flush_all_lockp __P ((int)); extern int _IO_flush_all __P ((void)); extern int _IO_cleanup __P ((void)); extern void _IO_flush_all_linebuffered __P ((void)); diff --git a/sysdeps/generic/abort.c b/sysdeps/generic/abort.c index 153faa1c5b..665bac6f0e 100644 --- a/sysdeps/generic/abort.c +++ b/sysdeps/generic/abort.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 93, 95, 96, 97, 98 Free Software Foundation, Inc. +/* Copyright (C) 1991, 93, 95, 96, 97, 98, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -33,7 +33,7 @@ #ifdef USE_IN_LIBIO # include <libio/iolibio.h> -# define fflush(s) _IO_fflush (s) +# define fflush(s) _IO_flush_all_lockp (0) #endif /* We must avoid to run in circles. Therefore we remember how far we |