summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Johnston <jjohnstn@redhat.com>2006-02-20 23:24:00 +0000
committerJeff Johnston <jjohnstn@redhat.com>2006-02-20 23:24:00 +0000
commit99db626d210c747e8e8da2de09afb523547329bc (patch)
tree98ef3a36cf857e0528f6e3e4666fbc471c729919
parent8aaf07c7a2029da9a87e5a751b75568e129e510c (diff)
downloadcygnal-99db626d210c747e8e8da2de09afb523547329bc.tar.gz
cygnal-99db626d210c747e8e8da2de09afb523547329bc.tar.bz2
cygnal-99db626d210c747e8e8da2de09afb523547329bc.zip
2006-02-20 Jeff Johnston <jjohnstn@redhat.com>
* libc/stdio/fflush.c (fflush): For an fflush on a read-only stream, turn off fseek/rewind optimization as per POSIX/SUSv3. * libc/stdio/fseek.c (_fseek_r): After a successful unoptimized seek, turn off the __SNPT no-optimization flag.
-rw-r--r--newlib/ChangeLog7
-rw-r--r--newlib/libc/stdio/fflush.c12
-rw-r--r--newlib/libc/stdio/fseek.c7
3 files changed, 25 insertions, 1 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog
index 4944b8867..940ef007c 100644
--- a/newlib/ChangeLog
+++ b/newlib/ChangeLog
@@ -1,3 +1,10 @@
+2006-02-20 Jeff Johnston <jjohnstn@redhat.com>
+
+ * libc/stdio/fflush.c (fflush): For an fflush on a read-only
+ stream, turn off fseek/rewind optimization as per POSIX/SUSv3.
+ * libc/stdio/fseek.c (_fseek_r): After a successful unoptimized
+ seek, turn off the __SNPT no-optimization flag.
+
2006-02-16 Jeff Johnston <jjohnstn@redhat.com>
* libc/sys/linux/aio.c: Define _GNU_SOURCE so struct aioinit
diff --git a/newlib/libc/stdio/fflush.c b/newlib/libc/stdio/fflush.c
index b417e5424..05084dde0 100644
--- a/newlib/libc/stdio/fflush.c
+++ b/newlib/libc/stdio/fflush.c
@@ -72,8 +72,18 @@ _DEFUN(fflush, (fp),
_flockfile (fp);
t = fp->_flags;
- if ((t & __SWR) == 0 || (p = fp->_bf._base) == NULL)
+ if ((t & __SWR) == 0)
{
+ /* For a read stream, an fflush causes the next seek to be
+ unoptimized (i.e. forces a system-level seek). This conforms
+ to the POSIX and SUSv3 standards. */
+ fp->_flags |= __SNPT;
+ _funlockfile (fp);
+ return 0;
+ }
+ if ((p = fp->_bf._base) == NULL)
+ {
+ /* Nothing to flush. */
_funlockfile (fp);
return 0;
}
diff --git a/newlib/libc/stdio/fseek.c b/newlib/libc/stdio/fseek.c
index 2ad98551c..8b189ba17 100644
--- a/newlib/libc/stdio/fseek.c
+++ b/newlib/libc/stdio/fseek.c
@@ -359,6 +359,13 @@ dumb:
fp->_r = 0;
/* fp->_w = 0; *//* unnecessary (I think...) */
fp->_flags &= ~__SEOF;
+ /* Reset no-optimization flag after successful seek. The
+ no-optimization flag may be set in the case of a read
+ stream that is flushed which by POSIX/SUSv3 standards,
+ means that a corresponding seek must not optimize. The
+ optimization is then allowed if no subsequent flush
+ is performed. */
+ fp->_flags &= ~__SNPT;
_funlockfile (fp);
return 0;
}