12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- /* scoped_mmap, automatically unmap files
- Copyright (C) 2018-2022 Free Software Foundation, Inc.
- This file is part of GDB.
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
- #ifndef COMMON_SCOPED_MMAP_H
- #define COMMON_SCOPED_MMAP_H
- #ifdef HAVE_SYS_MMAN_H
- #include <sys/mman.h>
- /* A smart-pointer-like class to mmap() and automatically munmap() a memory
- mapping. */
- class scoped_mmap
- {
- public:
- scoped_mmap () noexcept : m_mem (MAP_FAILED), m_length (0) {}
- scoped_mmap (void *addr, size_t length, int prot, int flags, int fd,
- off_t offset) noexcept : m_length (length)
- {
- m_mem = mmap (addr, m_length, prot, flags, fd, offset);
- }
- ~scoped_mmap ()
- {
- destroy ();
- }
- scoped_mmap (scoped_mmap &&rhs) noexcept
- : 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);
- ATTRIBUTE_UNUSED_RESULT void *release () noexcept
- {
- void *mem = m_mem;
- m_mem = MAP_FAILED;
- m_length = 0;
- return mem;
- }
- void reset (void *addr, size_t length, int prot, int flags, int fd,
- off_t offset) noexcept
- {
- destroy ();
- m_length = length;
- m_mem = mmap (addr, m_length, prot, flags, fd, offset);
- }
- size_t size () const noexcept { return m_length; }
- 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 /* COMMON_SCOPED_MMAP_H */
|