From 2210cb4fc3a9c89bb626a1132ad35e0ad512891d Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Wed, 9 Jun 2021 20:35:47 +0200 Subject: [PATCH] Implement move semantics for shared audio buffer --- src/common/audio-shm.cpp | 11 ++++++++++- src/common/audio-shm.h | 8 ++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/common/audio-shm.cpp b/src/common/audio-shm.cpp index 9e7d7a77..7aa1d7b5 100644 --- a/src/common/audio-shm.cpp +++ b/src/common/audio-shm.cpp @@ -30,5 +30,14 @@ AudioShmBuffer::~AudioShmBuffer() noexcept { // If either side drops this object then the buffer should always be // removed, so we'll do it on both sides to reduce the chance that we leak // shared memory - boost::interprocess::shared_memory_object::remove(config.name.c_str()); + if (!is_moved) { + boost::interprocess::shared_memory_object::remove(config.name.c_str()); + } +} + +AudioShmBuffer::AudioShmBuffer(AudioShmBuffer&& o) noexcept + : config(std::move(o.config)), + shm(std::move(o.shm)), + buffer(std::move(o.buffer)) { + o.is_moved = true; } diff --git a/src/common/audio-shm.h b/src/common/audio-shm.h index 2728c3c9..83dc5fe0 100644 --- a/src/common/audio-shm.h +++ b/src/common/audio-shm.h @@ -117,6 +117,12 @@ class AudioShmBuffer { */ ~AudioShmBuffer() noexcept; + AudioShmBuffer(const AudioShmBuffer&) = delete; + AudioShmBuffer& operator=(const AudioShmBuffer&) = delete; + + AudioShmBuffer(AudioShmBuffer&&) noexcept; + AudioShmBuffer& operator=(AudioShmBuffer&&) = delete; + /** * Get a pointer to the part of the buffer where this input audio channel is * stored in. @@ -142,4 +148,6 @@ class AudioShmBuffer { private: boost::interprocess::shared_memory_object shm; boost::interprocess::mapped_region buffer; + + bool is_moved = false; };