OSDN Git Service

2006-02-20 Jeff Johnston <jjohnstn@redhat.com>
authorjjohnstn <jjohnstn>
Mon, 20 Feb 2006 23:23:59 +0000 (23:23 +0000)
committerjjohnstn <jjohnstn>
Mon, 20 Feb 2006 23:23:59 +0000 (23:23 +0000)
        * 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.

newlib/ChangeLog
newlib/libc/stdio/fflush.c
newlib/libc/stdio/fseek.c

index 4944b88..940ef00 100644 (file)
@@ -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
index b417e54..05084dd 100644 (file)
@@ -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;
     }
index 2ad9855..8b189ba 100644 (file)
@@ -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;
 }