]> xenbits.xensource.com Git - people/liuw/freebsd.git/commitdiff
Since no room left in the _flags, reuse __SALC for O_APPEND.
authorache <ache@FreeBSD.org>
Sat, 24 Oct 2015 02:23:15 +0000 (02:23 +0000)
committerache <ache@FreeBSD.org>
Sat, 24 Oct 2015 02:23:15 +0000 (02:23 +0000)
It helps to remove _fcntl() call from _ftello() and optimize seek position
calculation in _swrite().

MFC after:      3 weeks

lib/libc/stdio/fdopen.c
lib/libc/stdio/fopen.c
lib/libc/stdio/freopen.c
lib/libc/stdio/ftell.c
lib/libc/stdio/stdio.c

index b936998d73cc244905b15f7d46e3e9aa3f09ae08..8bd9c2ddbe01cbb34430a5a5eabc6467c8d6557e 100644 (file)
@@ -91,7 +91,10 @@ fdopen(int fd, const char *mode)
         * O_APPEND bit set, assert __SAPP so that __swrite() caller
         * will _sseek() to the end before write.
         */
-       if ((oflags & O_APPEND) && !(fdflags & O_APPEND))
+       /* XXX: Reuse __SALC for O_APPEND. */
+       if (fdflags & O_APPEND)
+               fp->_flags |= __SALC;
+       else if (oflags & O_APPEND)
                fp->_flags |= __SAPP;
        fp->_file = fd;
        fp->_cookie = fp;
index b08e3366ac68d23800fb757c3f9eccbdbb55c7b6..b26f63734d995aba016cb218bbd612bc8d45cc8b 100644 (file)
@@ -91,7 +91,10 @@ fopen(const char * __restrict file, const char * __restrict mode)
         * we can do about this.  (We could set __SAPP and check in
         * fseek and ftell.)
         */
-       if (oflags & O_APPEND)
+       if (oflags & O_APPEND) {
+               /* XXX: Reuse __SALC for O_APPEND. */
+               fp->_flags |= __SALC;
                (void)_sseek(fp, (fpos_t)0, SEEK_END);
+       }
        return (fp);
 }
index 4dcd50fbb13da797f61ed6097333c6a0514159b3..8b68bacc3f6a73ba3cd9c805ef3e6ef3c8b16a2c 100644 (file)
@@ -240,8 +240,11 @@ finish:
         * we can do about this.  (We could set __SAPP and check in
         * fseek and ftell.)
         */
-       if (oflags & O_APPEND)
+       if (oflags & O_APPEND) {
+               /* XXX: Reuse __SALC for O_APPEND. */
+               fp->_flags |= __SALC;
                (void) _sseek(fp, (fpos_t)0, SEEK_END);
+       }
        FUNLOCKFILE(fp);
        return (fp);
 }
index 745d500513d9fa73343461892c2ea61c95f7bdb7..0d2222b6958f91da5e4b1258101903460402f46e 100644 (file)
@@ -88,7 +88,6 @@ _ftello(FILE *fp, fpos_t *offset)
 {
        fpos_t pos;
        size_t n;
-       int dflags;
 
        if (fp->_seek == NULL) {
                errno = ESPIPE;                 /* historic practice */
@@ -120,21 +119,24 @@ _ftello(FILE *fp, fpos_t *offset)
                if (HASUB(fp))
                        pos -= fp->_r;  /* Can be negative at this point. */
        } else if ((fp->_flags & __SWR) && fp->_p != NULL) {
-               dflags = 0;
-               if (fp->_flags & __SAPP)
-                       dflags = O_APPEND;
-               else if (fp->_file != -1 &&
-                        (dflags = _fcntl(fp->_file, F_GETFL)) < 0)
-                       return (1);
-               if ((dflags & O_APPEND) &&
-                   (pos = _sseek(fp, (fpos_t)0, SEEK_END)) == -1) {
-                       if ((fp->_flags & __SOPT) || __sflush(fp) ||
-                           (pos = _sseek(fp, (fpos_t)0, SEEK_CUR)) == -1)
-                               return (1);
-                       else {
-                               *offset = pos;
-                               return (0);
+               /* XXX: Reuse __SALC for O_APPEND. */
+               if (fp->_flags & (__SAPP|__SALC)) {
+                       int serrno = errno;
+
+                       errno = 0;
+                       if ((pos = _sseek(fp, (fpos_t)0, SEEK_END)) == -1) {
+                               if (errno == ESPIPE ||
+                                   (fp->_flags & __SOPT) || __sflush(fp) ||
+                                   (pos =
+                                   _sseek(fp, (fpos_t)0, SEEK_CUR)) == -1)
+                                       return (1);
+                               else {
+                                       errno = serrno;
+                                       *offset = pos;
+                                       return (0);
+                               }
                        }
+                       errno = serrno;
                }
                /*
                 * Writing.  Any buffered characters cause the
index 44ee0ab4121086c9c18a1701ed957e72e670d1bc..fc2e74b356b9d56f6a69405176271279ac669304 100644 (file)
@@ -117,7 +117,8 @@ _swrite(FILE *fp, char const *buf, int n)
        ret = (*fp->_write)(fp->_cookie, buf, n);
        /* __SOFF removed even on success in case O_APPEND mode is set. */
        if (ret >= 0) {
-               if ((fp->_flags & (__SAPP|__SOFF)) == (__SAPP|__SOFF) &&
+               /* XXX: Reuse __SALC for O_APPEND. */
+               if ((fp->_flags & __SOFF) && !(fp->_flags & __SALC) &&
                    fp->_offset <= OFF_MAX - ret)
                        fp->_offset += ret;
                else