From e42637b67781ed47a1581c6062421de514560cb3 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 2 Aug 2002 01:27:53 +0000 Subject: 2002-07-31 Roland McGrath * libio/fileops.c (decide_maybe_mmap): New static function. Code taken from libio/iofopen.c:__fopen_maybe_mmap to try to mmap the file contents. Then switch the jump tables to the mmap tables if it worked, or the vanilla file tables if not. (_IO_file_underflow_maybe_mmap): New function. (_IO_file_seekoff_maybe_mmap): New function. (_IO_file_xsgetn_maybe_mmap): New function. (_IO_file_jumps_maybe_mmap): New variable, jump table using those. * libio/libioP.h: Declare those. * libio/wfileops.c (_IO_wfile_underflow_maybe_mmap): New function. (_IO_wfile_jumps_maybe_mmap): New variable, jump table using that. * libio/iofopen.c (__fopen_maybe_mmap): Don't try to mmap here. If the stream is read-only, set its jump tables to those new ones. * libio/iofdopen.c (_IO_new_fdopen) [_G_HAVE_MMAP]: Set the initial jump tables to the maybe_mmap ones, and don't call __fopen_maybe_mmap. We need the tables set before _IO_file_attach. --- libio/iofopen.c | 54 ++++++++++-------------------------------------------- 1 file changed, 10 insertions(+), 44 deletions(-) (limited to 'libio/iofopen.c') diff --git a/libio/iofopen.c b/libio/iofopen.c index c1681a4a10..00a2c5f073 100644 --- a/libio/iofopen.c +++ b/libio/iofopen.c @@ -43,50 +43,16 @@ __fopen_maybe_mmap (fp) #ifdef _G_HAVE_MMAP if (fp->_flags & _IO_NO_WRITES) { - /* We use the file in read-only mode. This could mean we can - mmap the file and use it without any copying. But not all - file descriptors are for mmap-able objects and on 32-bit - machines we don't want to map files which are too large since - this would require too much virtual memory. */ - struct _G_stat64 st; - - if (_IO_SYSSTAT (fp, &st) == 0 - && S_ISREG (st.st_mode) && st.st_size != 0 - /* Limit the file size to 1MB for 32-bit machines. */ - && (sizeof (ptrdiff_t) > 4 || st.st_size < 1*1024*1024) - /* Sanity check. */ - && (fp->_offset == _IO_pos_BAD || fp->_offset <= st.st_size)) - { - /* Try to map the file. */ - void *p; - -# ifdef _G_MMAP64 - p = _G_MMAP64 (NULL, st.st_size, PROT_READ, MAP_PRIVATE, - fp->_fileno, 0); -# else - p = __mmap (NULL, st.st_size, PROT_READ, MAP_PRIVATE, - fp->_fileno, 0); -# endif - if (p != MAP_FAILED) - { - /* OK, we managed to map the file. Set the buffer up - and use a special jump table with simplified - underflow functions which never tries to read - anything from the file. */ - INTUSE(_IO_setb) (fp, p, (char *) p + st.st_size, 0); - - if (fp->_offset == _IO_pos_BAD) - fp->_offset = 0; - - _IO_setg (fp, p, p + fp->_offset, p + fp->_offset); - - if (fp->_mode <= 0) - _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps_mmap; - else - _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_wfile_jumps_mmap; - fp->_wide_data->_wide_vtable = &_IO_wfile_jumps_mmap; - } - } + /* Since this is read-only, we might be able to mmap the contents + directly. We delay the decision until the first read attempt by + giving it a jump table containing functions that choose mmap or + vanilla file operations and reset the jump table accordingly. */ + + if (fp->_mode <= 0) + _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_file_jumps_maybe_mmap; + else + _IO_JUMPS ((struct _IO_FILE_plus *) fp) = &_IO_wfile_jumps_maybe_mmap; + fp->_wide_data->_wide_vtable = &_IO_wfile_jumps_maybe_mmap; } #endif return fp; -- cgit v1.2.3