diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2018-08-07 18:10:29 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2018-08-07 18:10:29 -0400 |
commit | 5c831bb1eb6b22cd1705b98188b7d1b0633e7c54 (patch) | |
tree | 4c8000b9288db41ff690633006361b0f69a370a7 /gdb/common/scoped_mmap.h | |
parent | Make index reading functions more modular (diff) | |
download | binutils-gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.tar.gz binutils-gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.tar.bz2 binutils-gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.zip |
Introduce mmap_file function
New in v2:
- As Tom pointed out, we don't need to keep the fd around after
mmapping. This simplifies things quite a bit, since we don't need a
new class. It's now just a function that returns a scoped_mmap.
We already have scoped_mmap, which is a thin RAII layer over mmap. If
one simply wants to mmap an entire file for reading, it takes a bit of
boilerplate. This patch introduces the mmap_file function to make this
easier.
gdb/ChangeLog:
* Makefile.in (COMMON_SFILES): Add common/scoped_mmap.c.
* common/scoped_mmap.c: New file.
* common/scoped_mmap.h (destroy): New method.
(~scoped_mmap, reset): Use destroy.
(scoped_mmap): New move constructor.
(mmap_file): New declaration.
* unittests/scoped_mmap-selftests.c (test_normal,
test_invalid_filename, run_tests): New functions.
(_initialize_scoped_mmap_selftests): Register selftest.
Diffstat (limited to 'gdb/common/scoped_mmap.h')
-rw-r--r-- | gdb/common/scoped_mmap.h | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/gdb/common/scoped_mmap.h b/gdb/common/scoped_mmap.h index 6070c37c409..b446163fba5 100644 --- a/gdb/common/scoped_mmap.h +++ b/gdb/common/scoped_mmap.h @@ -41,8 +41,18 @@ public: ~scoped_mmap () { - if (m_mem != MAP_FAILED) - munmap (m_mem, m_length); + destroy (); + } + + scoped_mmap (scoped_mmap &&rhs) + { + destroy (); + + m_mem = rhs.m_mem; + m_length = rhs.m_length; + + rhs.m_mem = MAP_FAILED; + rhs.m_length = 0; } DISABLE_COPY_AND_ASSIGN (scoped_mmap); @@ -58,8 +68,7 @@ public: void reset (void *addr, size_t length, int prot, int flags, int fd, off_t offset) noexcept { - if (m_mem != MAP_FAILED) - munmap (m_mem, m_length); + destroy (); m_length = length; m_mem = mmap (addr, m_length, prot, flags, fd, offset); @@ -69,9 +78,18 @@ public: void *get () const noexcept { return m_mem; } private: + void destroy () + { + if (m_mem != MAP_FAILED) + munmap (m_mem, m_length); + } + void *m_mem; size_t m_length; }; +/* Map FILENAME in memory. Throw an error if anything goes wrong. */ +scoped_mmap mmap_file (const char *filename); + #endif /* HAVE_SYS_MMAN_H */ #endif /* SCOPED_MMAP_H */ |