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/unittests/scoped_mmap-selftests.c | |
parent | 4485a1c1d8d2b4a20fca2e2b7d1aabcff383b222 (diff) | |
download | gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.zip gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.tar.gz gdb-5c831bb1eb6b22cd1705b98188b7d1b0633e7c54.tar.bz2 |
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/unittests/scoped_mmap-selftests.c')
-rw-r--r-- | gdb/unittests/scoped_mmap-selftests.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/gdb/unittests/scoped_mmap-selftests.c b/gdb/unittests/scoped_mmap-selftests.c index ece3d7a..d70a56a 100644 --- a/gdb/unittests/scoped_mmap-selftests.c +++ b/gdb/unittests/scoped_mmap-selftests.c @@ -25,6 +25,7 @@ #if defined(HAVE_SYS_MMAN_H) && defined(HAVE_UNISTD_H) #include "selftest.h" +#include "common/gdb_unlinker.h" #include <unistd.h> @@ -78,6 +79,57 @@ run_tests () } } /* namespace scoped_mmap */ + +namespace mmap_file +{ + +/* Test the standard usage of mmap_file. */ +static void +test_normal () +{ + char filename[] = "scoped_mmapped_file-selftest-XXXXXX"; + int fd = mkstemp (filename); + SELF_CHECK (fd >= 0); + + write (fd, "Hello!", 7); + close (fd); + + gdb::unlinker unlink_test_file (filename); + + { + ::scoped_mmap m = ::mmap_file (filename); + + SELF_CHECK (m.get () != MAP_FAILED); + SELF_CHECK (m.size () == 7); + SELF_CHECK (0 == strcmp ((char *) m.get (), "Hello!")); + } +} + +/* Calling mmap_file with a non-existent file should throw an exception. */ +static void +test_invalid_filename () +{ + bool threw = false; + + try { + ::scoped_mmap m = ::mmap_file ("/this/file/should/not/exist"); + } catch (gdb_exception &e) { + threw = true; + } + + SELF_CHECK (threw); +} + + +/* Run selftests. */ +static void +run_tests () +{ + test_normal (); + test_invalid_filename (); +} + +} /* namespace mmap_file */ } /* namespace selftests */ #endif /* !defined(HAVE_SYS_MMAN_H) || !defined(HAVE_UNISTD_H) */ @@ -88,5 +140,7 @@ _initialize_scoped_mmap_selftests () #if defined(HAVE_SYS_MMAN_H) && defined(HAVE_UNISTD_H) selftests::register_test ("scoped_mmap", selftests::scoped_mmap::run_tests); + selftests::register_test ("mmap_file", + selftests::mmap_file::run_tests); #endif } |