summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdio/fflush.c
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2014-01-17 10:55:32 +0000
committerCorinna Vinschen <corinna@vinschen.de>2014-01-17 10:55:32 +0000
commit7a7e4d4d95e878c62ea5b642da864018b50aae21 (patch)
tree7256f4412958add20549f7c053e54b6df1f152cb /newlib/libc/stdio/fflush.c
parentae5b40a65bfc48f599a94dbfedb87f88ba6e831e (diff)
downloadcygnal-7a7e4d4d95e878c62ea5b642da864018b50aae21.tar.gz
cygnal-7a7e4d4d95e878c62ea5b642da864018b50aae21.tar.bz2
cygnal-7a7e4d4d95e878c62ea5b642da864018b50aae21.zip
Introduce _STDIO_BSD_SEMANTICS flag to switch fclose/exit file flushing
semantics from POSIX to BSD. * libc/stdio/fclose.c (_fclose_r): Conditionalize file flushing on _STDIO_BSD_SEMANTICS. Call __sflush_r rather than _fflush_r. Add comment. * libc/stdio/fflush.c (__sflushw_r): New function, only available if _STDIO_BSD_SEMANTICS is defined. * libc/stdio/findfp.c (_cleanup_r): Call _fwalk_reent rather than _fwalk. Conditionalize cleanup function call on _STDIO_BSD_SEMANTICS. Add comments. Add FIXME. * libc/stdio/local.h (__sflushw_r): Declare if _STDIO_BSD_SEMANTICS is defined.
Diffstat (limited to 'newlib/libc/stdio/fflush.c')
-rw-r--r--newlib/libc/stdio/fflush.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/newlib/libc/stdio/fflush.c b/newlib/libc/stdio/fflush.c
index ea48b0126..2286e3878 100644
--- a/newlib/libc/stdio/fflush.c
+++ b/newlib/libc/stdio/fflush.c
@@ -204,6 +204,19 @@ _DEFUN(__sflush_r, (ptr, fp),
return 0;
}
+#ifdef _STDIO_BSD_SEMANTICS
+/* Called from _cleanup_r. At exit time, we don't need file locking,
+ and we don't want to move the underlying file pointer unless we're
+ writing. */
+int
+_DEFUN(__sflushw_r, (ptr, fp),
+ struct _reent *ptr _AND
+ register FILE *fp)
+{
+ return (fp->_flags & __SWR) ? __sflush_r (ptr, fp) : 0;
+}
+#endif
+
int
_DEFUN(_fflush_r, (ptr, fp),
struct _reent *ptr _AND