Skip to content

Commit c2be481

Browse files
Zainullin DamirZainullin Damir
authored andcommitted
++
1 parent a875707 commit c2be481

4 files changed

Lines changed: 22 additions & 7 deletions

File tree

include/ipfixprobe/outputPlugin/outputStorage/b2OutputStorage.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class B2OutputStorage : public BOutputStorage<ElementType> {
7272
>= writerData.cachedLowestReaderGeneration
7373
|| !BOutputStorage<ElementType>::BucketAllocation::isValidBucketIndex(
7474
this->m_buckets[writerData.writePosition].bucketIndex)
75-
|| !this->m_buckets[writerData.writePosition].lock.try_lock()) {
75+
|| !this->m_buckets[writerData.writePosition].lock.tryLock()) {
7676
continue;
7777
}
7878
if (this->m_buckets[writerData.writePosition].generation.load(std::memory_order_acquire)

include/ipfixprobe/outputPlugin/outputStorage/bOutputStorage.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ class BOutputStorage : public OutputStorage<ElementType> {
141141
>= writerData.cachedLowestReaderGeneration
142142
|| !BucketAllocation::isValidBucketIndex(
143143
m_buckets[writerData.writePosition].bucketIndex)
144-
|| !m_buckets[writerData.writePosition].lock.try_lock()) {
144+
|| !m_buckets[writerData.writePosition].lock.tryLock()) {
145145
continue;
146146
}
147147
if (m_buckets[writerData.writePosition].generation.load(std::memory_order_acquire)

include/ipfixprobe/outputPlugin/outputStorage/outputStorage.hpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
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 {
118132
private:
119133
std::condition_variable m_registrationCondition;
120134
std::mutex m_registrationMutex;
135+
Spinlock m_registrationLock;
121136
};
122137

123138
} // namespace ipxp::output

include/ipfixprobe/outputPlugin/outputStorage/spinlock.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ class Spinlock {
1919
}
2020
}
2121

22-
bool try_lock() noexcept { return !flag.test_and_set(std::memory_order_acquire); }
22+
bool tryLock() noexcept { return !flag.test_and_set(std::memory_order_acquire); }
2323

2424
void unlock() noexcept { flag.clear(std::memory_order_release); }
2525
};

0 commit comments

Comments
 (0)