99#include " dummyAllocationBuffer.hpp"
1010#include " outputContainer.hpp"
1111#include " referenceCounter.hpp"
12+ #include " spinlock.hpp"
1213
1314#include < atomic>
1415#include < condition_variable>
@@ -45,18 +46,31 @@ class OutputStorage {
4546
4647 virtual void registerReader ([[maybe_unused]] const uint8_t readerIndex) noexcept
4748 {
48- std::unique_lock<std::mutex> lock (m_registrationMutex);
4949 m_readersCount++;
50+ while (!m_registrationLock.tryLock ()) {
51+ if (m_writersCount.load (std::memory_order_acquire) != 0 ) {
52+ m_registrationLock.unlock ();
53+ return ;
54+ }
55+ }
56+ /* std::unique_lock<std::mutex> lock(m_registrationMutex);
5057 m_registrationCondition.notify_all();
51- m_registrationCondition.wait (lock, [&]() { return m_writersCount > 0 ; });
58+ m_registrationCondition.wait(lock, [&]() { return m_writersCount > 0; });*/
5259 }
5360
5461 virtual void registerWriter ([[maybe_unused]] const uint8_t writerIndex) noexcept
5562 {
56- std::unique_lock<std::mutex> lock (m_registrationMutex);
63+ m_writersCount++;
64+ while (!m_registrationLock.tryLock ()) {
65+ if (m_readersCount.load (std::memory_order_acquire) != 0 ) {
66+ m_registrationLock.unlock ();
67+ return ;
68+ }
69+ }
70+ /* std::unique_lock<std::mutex> lock(m_registrationMutex);
5771 m_writersCount++;
5872 m_registrationCondition.notify_all();
59- m_registrationCondition.wait (lock, [&]() { return m_readersCount > 0 ; });
73+ m_registrationCondition.wait(lock, [&]() { return m_readersCount > 0; });*/
6074 }
6175
6276 virtual void unregisterWriter ([[maybe_unused]] const uint8_t writerId) noexcept
@@ -118,6 +132,7 @@ class OutputStorage {
118132private:
119133 std::condition_variable m_registrationCondition;
120134 std::mutex m_registrationMutex;
135+ Spinlock m_registrationLock;
121136};
122137
123138} // namespace ipxp::output
0 commit comments