From dd0ee2e1022843c6a296a9141b7cab7ea74eec28 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 30 Aug 2002 07:07:16 +0000 Subject: Update. 2002-08-29 Ulrich Drepper * libio/fileops.c (_IO_new_file_fopen): Recognize new mode specifier 'm' to enable mmap I/O. * libio/libio.h (_IO_FILE): Rename _blksize field to _flags2. The former wasn't used (anymore?). (_IO_FLAGS2_MMAP): New define. * libio/genops.c (_IO_no_init): Initialize _flags2 field. * libio/iofopen.c (__fopen_maybe_mmap): Use mmap callbacks only if _IO_FLAGS2_MMAP bit is set. * libio/iofdopen.c (_IO_new_fdopen): Recognize 'm' mode specifier. Enable mmap-using mode only if 'm' was set. --- libio/iofdopen.c | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'libio/iofdopen.c') diff --git a/libio/iofdopen.c b/libio/iofdopen.c index 2fb493e785..e122562f48 100644 --- a/libio/iofdopen.c +++ b/libio/iofdopen.c @@ -59,8 +59,10 @@ _IO_new_fdopen (fd, mode) struct _IO_wide_data wd; } *new_f; int fd_flags; + int i; + int use_mmap = 0; - switch (*mode++) + switch (*mode) { case 'r': read_write = _IO_NO_WRITES; @@ -76,8 +78,26 @@ _IO_new_fdopen (fd, mode) MAYBE_SET_EINVAL; return NULL; } - if (mode[0] == '+' || (mode[0] == 'b' && mode[1] == '+')) - read_write &= _IO_IS_APPENDING; + for (i = 1; i < 5; ++i) + { + switch (*++mode) + { + case '\0': + break; + case '+': + read_write &= _IO_IS_APPENDING; + break; + case 'm': + use_mmap = 1; + continue; + case 'x': + case 'b': + default: + /* Ignore */ + continue; + } + break; + } #ifdef F_GETFL fd_flags = _IO_fcntl (fd, F_GETFL); #ifndef O_ACCMODE @@ -129,12 +149,13 @@ _IO_new_fdopen (fd, mode) call _IO_file_attach or else it will allocate a buffer immediately. */ _IO_no_init (&new_f->fp.file, 0, 0, &new_f->wd, #ifdef _G_HAVE_MMAP - (read_write & _IO_NO_WRITES) ? &_IO_wfile_jumps_maybe_mmap : + (use_mmap && (read_write & _IO_NO_WRITES)) + ? &_IO_wfile_jumps_maybe_mmap : #endif &INTUSE(_IO_wfile_jumps)); _IO_JUMPS (&new_f->fp) = #ifdef _G_HAVE_MMAP - (read_write & _IO_NO_WRITES) ? &_IO_file_jumps_maybe_mmap : + (use_mmap && (read_write & _IO_NO_WRITES)) ? &_IO_file_jumps_maybe_mmap : #endif &INTUSE(_IO_file_jumps); INTUSE(_IO_file_init) (&new_f->fp); -- cgit v1.2.3