From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 73169 invoked by alias); 18 Nov 2019 10:11:39 -0000 Mailing-List: contact newlib-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-cvs-owner@sourceware.org Received: (qmail 73124 invoked by uid 9078); 18 Nov 2019 10:11:39 -0000 Date: Mon, 18 Nov 2019 10:11:00 -0000 Message-ID: <20191118101139.73122.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: newlib-cvs@sourceware.org Subject: [newlib-cygwin] newlib: fix fseek optimization with SEEK_CUR X-Act-Checkin: newlib-cygwin X-Git-Author: Bastien Bouclet X-Git-Refname: refs/heads/master X-Git-Oldrev: 1626569222066ee601f6c41b29efcc95202674b7 X-Git-Newrev: 59362c80e3a02c011fd0ef3d7f07a20098d2a9d5 X-SW-Source: 2019-q4/txt/msg00016.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=59362c80e3a02c011fd0ef3d7f07a20098d2a9d5 commit 59362c80e3a02c011fd0ef3d7f07a20098d2a9d5 Author: Bastien Bouclet Date: Sat Nov 9 17:28:04 2019 +0100 newlib: fix fseek optimization with SEEK_CUR The call to fflush was invalidating the read buffer, preventing relative seeks to positions that would have been inside the read buffer from being optimized. The call to srefill would then re-read mostly the same data that was initially in the read buffer. Diff: --- newlib/libc/stdio/fseeko.c | 31 ++++++------------------------- newlib/libc/stdio64/fseeko64.c | 31 ++++++------------------------- 2 files changed, 12 insertions(+), 50 deletions(-) diff --git a/newlib/libc/stdio/fseeko.c b/newlib/libc/stdio/fseeko.c index 3e0f9e9..bbf1af4 100644 --- a/newlib/libc/stdio/fseeko.c +++ b/newlib/libc/stdio/fseeko.c @@ -141,31 +141,12 @@ _fseeko_r (struct _reent *ptr, switch (whence) { case SEEK_CUR: - /* - * In order to seek relative to the current stream offset, - * we have to first find the current stream offset a la - * ftell (see ftell for details). - */ - _fflush_r (ptr, fp); /* may adjust seek offset on append stream */ - if (fp->_flags & __SOFF) - curoff = fp->_offset; - else - { - curoff = seekfn (ptr, fp->_cookie, (_fpos_t) 0, SEEK_CUR); - if (curoff == -1L) - { - _newlib_flockfile_exit (fp); - return EOF; - } - } - if (fp->_flags & __SRD) - { - curoff -= fp->_r; - if (HASUB (fp)) - curoff -= fp->_ur; - } - else if (fp->_flags & __SWR && fp->_p != NULL) - curoff += fp->_p - fp->_bf._base; + curoff = _ftello_r(ptr, fp); + if (curoff == -1L) + { + _newlib_flockfile_exit (fp); + return EOF; + } offset += curoff; whence = SEEK_SET; diff --git a/newlib/libc/stdio64/fseeko64.c b/newlib/libc/stdio64/fseeko64.c index 0672086..f380055 100644 --- a/newlib/libc/stdio64/fseeko64.c +++ b/newlib/libc/stdio64/fseeko64.c @@ -142,31 +142,12 @@ _fseeko64_r (struct _reent *ptr, switch (whence) { case SEEK_CUR: - /* - * In order to seek relative to the current stream offset, - * we have to first find the current stream offset a la - * ftell (see ftell for details). - */ - _fflush_r (ptr, fp); /* may adjust seek offset on append stream */ - if (fp->_flags & __SOFF) - curoff = fp->_offset; - else - { - curoff = seekfn (ptr, fp->_cookie, (_fpos64_t) 0, SEEK_CUR); - if (curoff == -1L) - { - _newlib_flockfile_exit(fp); - return EOF; - } - } - if (fp->_flags & __SRD) - { - curoff -= fp->_r; - if (HASUB (fp)) - curoff -= fp->_ur; - } - else if (fp->_flags & __SWR && fp->_p != NULL) - curoff += fp->_p - fp->_bf._base; + curoff = _ftello64_r(ptr, fp); + if (curoff == -1L) + { + _newlib_flockfile_exit (fp); + return EOF; + } offset += curoff; whence = SEEK_SET;