Skip to content

Commit

Permalink
iox-eclipse-iceoryx#615 remove blocking options from variant queue
Browse files Browse the repository at this point in the history
Signed-off-by: Mathias Kraus <mathias.kraus@apex.ai>
  • Loading branch information
elBoberido authored and marthtz committed May 12, 2021
1 parent c42c47a commit e58f79f
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 148 deletions.
2 changes: 0 additions & 2 deletions iceoryx_utils/include/iceoryx_utils/cxx/variant_queue.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,6 @@ enum class VariantQueueTypes : uint64_t
SoFi_SingleProducerSingleConsumer = 1,
FiFo_MultiProducerSingleConsumer = 2,
SoFi_MultiProducerSingleConsumer = 3,
BlockingFiFo_SingleProducerSingleConsumer = 4,
BlockingFiFo_MultiProducerSingleConsumer = 5,
};

// remark: we need to consider to support the non-resizable queue as well
Expand Down
99 changes: 0 additions & 99 deletions iceoryx_utils/include/iceoryx_utils/internal/cxx/variant_queue.inl
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,6 @@ inline VariantQueue<ValueType, Capacity>::VariantQueue(const VariantQueueTypes t
m_fifo.template emplace<concurrent::ResizeableLockFreeQueue<ValueType, Capacity>>();
break;
}
case VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer:
{
m_fifo.template emplace<concurrent::TriggerQueue<ValueType, Capacity, concurrent::FiFo>>();
break;
}
case VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer:
{
m_fifo.template emplace<concurrent::TriggerQueue<ValueType, Capacity, concurrent::ResizeableLockFreeQueue>>();
break;
}
}
}

Expand Down Expand Up @@ -95,26 +85,6 @@ optional<ValueType> VariantQueue<ValueType, Capacity>::push(const ValueType& val
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::FiFo_MultiProducerSingleConsumer)>()
->push(value);
}
case VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer:
{
auto pushFailedSinceFiFoShouldBeDestroyed =
m_fifo
.template get_at_index<static_cast<uint64_t>(
VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer)>()
->push(value);

return (pushFailedSinceFiFoShouldBeDestroyed) ? cxx::nullopt : cxx::make_optional<ValueType>(value);
}
case VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer:
{
auto pushFailedSinceFiFoShouldBeDestroyed =
m_fifo
.template get_at_index<static_cast<uint64_t>(
VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer)>()
->push(value);

return (pushFailedSinceFiFoShouldBeDestroyed) ? cxx::nullopt : cxx::make_optional<ValueType>(value);
}
}

return cxx::nullopt;
Expand Down Expand Up @@ -147,19 +117,6 @@ inline optional<ValueType> VariantQueue<ValueType, Capacity>::pop() noexcept
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::FiFo_MultiProducerSingleConsumer)>()
->pop();
}
case VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(
VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer)>()
->pop();
}
case VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer)>()
->pop();
}
}

return cxx::nullopt;
Expand Down Expand Up @@ -189,19 +146,6 @@ inline bool VariantQueue<ValueType, Capacity>::empty() const noexcept
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::FiFo_MultiProducerSingleConsumer)>()
->empty();
}
case VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(
VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer)>()
->empty();
}
case VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer)>()
->empty();
}
}

return true;
Expand Down Expand Up @@ -234,21 +178,6 @@ inline uint64_t VariantQueue<ValueType, Capacity>::size() noexcept
->size();
break;
}
case VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(
VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer)>()
->size();
break;
}
case VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer)>()
->size();
break;
}
}

return 0U;
Expand Down Expand Up @@ -280,19 +209,6 @@ inline bool VariantQueue<ValueType, Capacity>::setCapacity(const uint64_t newCap
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::FiFo_MultiProducerSingleConsumer)>()
->setCapacity(newCapacity);
}
case VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer:
{
/// @todo must be implemented for FiFo
cxx::Expects(false);
return false;
}
case VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer:
{
// we may discard elements in the queue if the size is reduced and the fifo contains too many elements
return m_fifo
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer)>()
->setCapacity(newCapacity);
}
}
return false;
}
Expand Down Expand Up @@ -324,21 +240,6 @@ inline uint64_t VariantQueue<ValueType, Capacity>::capacity() const noexcept
->capacity();
break;
}
case VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(
VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer)>()
->capacity();
break;
}
case VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer:
{
return m_fifo
.template get_at_index<static_cast<uint64_t>(VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer)>()
->capacity();
break;
}
}

return 0U;
Expand Down
49 changes: 2 additions & 47 deletions iceoryx_utils/test/moduletests/test_cxx_variant_queue.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

#include "iceoryx_utils/cxx/variant_queue.hpp"
#include "test.hpp"
#include "testutils/watch_dog.hpp"

namespace
{
Expand All @@ -31,7 +30,6 @@ class VariantQueue_test : public Test
public:
void SetUp()
{
m_watchdog.watchAndActOnFailure([] { std::terminate(); });
}
void TearDown()
{
Expand All @@ -44,8 +42,7 @@ class VariantQueue_test : public Test
}

// if a new fifo type is added this variable has to be adjusted
uint64_t numberOfQueueTypes = 6U;
Watchdog m_watchdog{units::Duration::fromSeconds(2U)};
uint64_t numberOfQueueTypes = 4U;
};

TEST_F(VariantQueue_test, isEmptyWhenCreated)
Expand Down Expand Up @@ -115,14 +112,7 @@ TEST_F(VariantQueue_test, pushTwoElementsAfterSecondPopIsInvalid)
TEST_F(VariantQueue_test, handlesOverflow)
{
PerformTestForQueueTypes([](uint64_t typeID) {
VariantQueueTypes type = static_cast<VariantQueueTypes>(typeID);
if (type == VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer
|| type == VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer)
{
return;
}

VariantQueue<int, 2> sut(type);
VariantQueue<int, 2> sut(static_cast<VariantQueueTypes>(typeID));
// current SOFI can hold capacity +1 values, so push some more to ensure overflow
sut.push(14123);
sut.push(24123);
Expand All @@ -133,41 +123,6 @@ TEST_F(VariantQueue_test, handlesOverflow)
});
}

TEST_F(VariantQueue_test, blocksOnOverflow)
{
PerformTestForQueueTypes([](uint64_t typeID) {
VariantQueueTypes type = static_cast<VariantQueueTypes>(typeID);
if (!(type == VariantQueueTypes::BlockingFiFo_MultiProducerSingleConsumer
|| type == VariantQueueTypes::BlockingFiFo_SingleProducerSingleConsumer))
{
return;
}

VariantQueue<int, 2> sut(type);

for (uint64_t i = 0U; i < sut.capacity(); ++i)
{
sut.push(24123 + i);
}

std::atomic<uint64_t> counter{0U};
std::thread t([&] {
sut.push(1231);
++counter;
});

constexpr int64_t TIMEOUT_IN_MS = 100;
std::this_thread::sleep_for(std::chrono::milliseconds(TIMEOUT_IN_MS));
EXPECT_THAT(counter.load(), Eq(0U));
auto result = sut.pop();
ASSERT_THAT(result.has_value(), Eq(true));
EXPECT_THAT(*result, Eq(24123));
std::this_thread::sleep_for(std::chrono::milliseconds(TIMEOUT_IN_MS));
EXPECT_THAT(counter.load(), Eq(1U));
t.join();
});
}

TEST_F(VariantQueue_test, noPopWhenEmpty)
{
PerformTestForQueueTypes([](uint64_t typeID) {
Expand Down

0 comments on commit e58f79f

Please sign in to comment.