14#if defined(_WIN32) || defined(_WIN64)
18#ifndef WIN32_LEAN_AND_MEAN
19#define WIN32_LEAN_AND_MEAN
22#define CORIUM_HAS_POSIX_SHM 0
23#elif __has_include(<sys/mman.h>) && __has_include(<unistd.h>) && __has_include(<fcntl.h>)
28#define CORIUM_HAS_POSIX_SHM 1
30#define CORIUM_HAS_POSIX_SHM 0
45 [[nodiscard]]
void*
data() noexcept {
return _address; }
46 [[nodiscard]]
const void*
data() const noexcept {
return _address; }
47 [[nodiscard]] std::size_t
size() const noexcept {
return _size; }
48 [[nodiscard]]
bool isValid() const noexcept {
return _address !=
nullptr; }
49 [[nodiscard]]
bool isCreator() const noexcept {
return _isCreator; }
52 void* _address{
nullptr};
54 bool _isCreator{
false};
79 : _name(std::move(other._name)),
80 _address(other._address),
82 _isCreator(other._isCreator)
83#if defined(_WIN32) || defined(_WIN64)
84 , _handle(other._handle)
85#elif CORIUM_HAS_POSIX_SHM
89 other._address =
nullptr;
91 other._isCreator =
false;
92#if defined(_WIN32) || defined(_WIN64)
93 other._handle =
nullptr;
94#elif CORIUM_HAS_POSIX_SHM
101 if (
this != &other) {
103 _name = std::move(other._name);
104 _address = other._address;
106 _isCreator = other._isCreator;
107#if defined(_WIN32) || defined(_WIN64)
108 _handle = other._handle;
109 other._handle =
nullptr;
110#elif CORIUM_HAS_POSIX_SHM
114 other._address =
nullptr;
116 other._isCreator =
false;
129 _name = normalizeName(
name);
132#if defined(_WIN32) || defined(_WIN64)
137 _handle = CreateFileMappingA(
138 INVALID_HANDLE_VALUE,
141 static_cast<DWORD
>(
size >> 32),
142 static_cast<DWORD
>(
size & 0xFFFFFFFF),
146 _isCreator = (GetLastError() != ERROR_ALREADY_EXISTS);
149 _handle = OpenFileMappingA(desiredAccess, FALSE, _name.c_str());
157 _address = MapViewOfFile(_handle, desiredAccess, 0, 0,
size);
159 CloseHandle(_handle);
164#elif CORIUM_HAS_POSIX_SHM
166 mode_t permissions = 0666;
169 oflag = O_CREAT | O_RDWR;
176 _fd = ::shm_open(_name.c_str(), oflag, permissions);
183 if (::fstat(_fd, &sb) == 0 && sb.st_size <
static_cast<off_t
>(
size)) {
184 if (::ftruncate(_fd,
static_cast<off_t
>(
size)) != 0) {
194 _address = ::mmap(
nullptr,
size, prot, MAP_SHARED, _fd, 0);
195 if (_address == MAP_FAILED) {
212#if defined(_WIN32) || defined(_WIN64)
213 UnmapViewOfFile(_address);
215 CloseHandle(_handle);
218#elif CORIUM_HAS_POSIX_SHM
219 ::munmap(_address, _size);
234#if CORIUM_HAS_POSIX_SHM
235 std::string n = normalizeName(
name);
236 ::shm_unlink(n.c_str());
243 [[nodiscard]]
void*
data() noexcept {
return _address; }
244 [[nodiscard]]
const void*
data() const noexcept {
return _address; }
247 [[nodiscard]] std::size_t
size() const noexcept {
return _size; }
250 [[nodiscard]]
bool isValid() const noexcept {
return _address !=
nullptr; }
253 [[nodiscard]]
bool isCreator() const noexcept {
return _isCreator; }
256 [[nodiscard]]
const std::string&
name() const noexcept {
return _name; }
259 static std::string normalizeName(
const std::string&
name)
261#if !defined(_WIN32) && !defined(_WIN64)
262 if (
name.empty() ||
name[0] !=
'/') {
270 void* _address{
nullptr};
271 std::size_t _size{0};
272 bool _isCreator{
false};
274#if defined(_WIN32) || defined(_WIN64)
275 HANDLE _handle{
nullptr};
276#elif CORIUM_HAS_POSIX_SHM
Non-allocating wrapper for fixed raw memory regions (e.g. multi-core SRAM, DMA buffers,...
Definition SharedMemory.hpp:37
std::size_t size() const noexcept
Definition SharedMemory.hpp:47
const void * data() const noexcept
Definition SharedMemory.hpp:46
void * data() noexcept
Definition SharedMemory.hpp:45
constexpr RawMemoryBuffer() noexcept=default
bool isCreator() const noexcept
Definition SharedMemory.hpp:49
bool isValid() const noexcept
Definition SharedMemory.hpp:48
Cross-platform zero-copy shared memory region wrapper. Manages OS-level shared memory allocation,...
Definition SharedMemory.hpp:60
SharedMemory & operator=(const SharedMemory &)=delete
SharedMemory & operator=(SharedMemory &&other) noexcept
Definition SharedMemory.hpp:99
const std::string & name() const noexcept
Name identifier of shared memory.
Definition SharedMemory.hpp:256
bool isCreator() const noexcept
Check if this process created the memory segment (useful for initialization).
Definition SharedMemory.hpp:253
SharedMemory(SharedMemory &&other) noexcept
Definition SharedMemory.hpp:78
void close() noexcept
Close and unmap the shared memory segment.
Definition SharedMemory.hpp:209
std::size_t size() const noexcept
Size of mapped shared memory buffer.
Definition SharedMemory.hpp:247
SharedMemory() noexcept=default
void * data() noexcept
Raw pointer to mapped shared memory buffer.
Definition SharedMemory.hpp:243
bool isValid() const noexcept
Check if mapped region is valid.
Definition SharedMemory.hpp:250
static void unlink(const std::string &name) noexcept
Remove shared memory identifier from OS namespace (POSIX shm_unlink).
Definition SharedMemory.hpp:232
bool open(const std::string &name, std::size_t size, AccessMode mode=AccessMode::CreateOrOpen) noexcept
Create or attach to a shared memory region.
Definition SharedMemory.hpp:126
AccessMode
Definition SharedMemory.hpp:62
SharedMemory(const SharedMemory &)=delete
const void * data() const noexcept
Definition SharedMemory.hpp:244
Definition DomainSocket.hpp:35