diff options
author | Roland McGrath <roland@gnu.org> | 2002-08-02 01:27:53 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-08-02 01:27:53 +0000 |
commit | e42637b67781ed47a1581c6062421de514560cb3 (patch) | |
tree | 357b08520e6b39410be8266299d4657a98c10dad /libio/iofopen.c | |
parent | 0950889b810736fe7ad340a13a5ecf76672e1a84 (diff) | |
download | glibc-e42637b67781ed47a1581c6062421de514560cb3.zip glibc-e42637b67781ed47a1581c6062421de514560cb3.tar.gz glibc-e42637b67781ed47a1581c6062421de514560cb3.tar.bz2 |
2002-07-31 Roland McGrath <roland@frob.com>
* 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.
Diffstat (limited to 'libio/iofopen.c')
-rw-r--r-- | libio/iofopen.c | 54 |
1 files changed, 10 insertions, 44 deletions
diff --git a/libio/iofopen.c b/libio/iofopen.c index c1681a4..00a2c5f 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; |