File indexing completed on 2024-05-12 05:32:16

0001 /*
0002     SPDX-FileCopyrightText: 2023 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #pragma once
0008 
0009 #include <sys/mman.h>
0010 #include <utility>
0011 
0012 namespace KWin
0013 {
0014 
0015 class MemoryMap
0016 {
0017 public:
0018     MemoryMap()
0019         : m_data(MAP_FAILED)
0020         , m_size(0)
0021     {
0022     }
0023 
0024     MemoryMap(int size, int prot, int flags, int fd, off_t offset)
0025         : m_data(mmap(nullptr, size, prot, flags, fd, offset))
0026         , m_size(size)
0027     {
0028     }
0029 
0030     MemoryMap(MemoryMap &&other)
0031         : m_data(std::exchange(other.m_data, MAP_FAILED))
0032         , m_size(std::exchange(other.m_size, 0))
0033     {
0034     }
0035 
0036     ~MemoryMap()
0037     {
0038         if (m_data != MAP_FAILED) {
0039             munmap(m_data, m_size);
0040         }
0041     }
0042 
0043     MemoryMap &operator=(MemoryMap &&other)
0044     {
0045         if (m_data != MAP_FAILED) {
0046             munmap(m_data, m_size);
0047         }
0048         m_data = std::exchange(other.m_data, MAP_FAILED);
0049         m_size = std::exchange(other.m_size, 0);
0050         return *this;
0051     }
0052 
0053     inline bool isValid() const
0054     {
0055         return m_data != MAP_FAILED;
0056     }
0057 
0058     inline void *data() const
0059     {
0060         return m_data;
0061     }
0062 
0063     inline int size() const
0064     {
0065         return m_size;
0066     }
0067 
0068 private:
0069     void *m_data;
0070     int m_size;
0071 };
0072 
0073 } // namespace KWin