From af192db22606efda9c422c0de93312ac657d1571 Mon Sep 17 00:00:00 2001 From: Simon Hoinkis Date: Tue, 24 Jan 2023 22:28:55 +0100 Subject: [PATCH 1/4] iox-#1855 Check state condition and notify if 'true' when attaching states to the WaitSet --- .../include/iceoryx_posh/internal/popo/wait_set.inl | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/iceoryx_posh/include/iceoryx_posh/internal/popo/wait_set.inl b/iceoryx_posh/include/iceoryx_posh/internal/popo/wait_set.inl index 6c58efef01..a8035a2782 100644 --- a/iceoryx_posh/include/iceoryx_posh/internal/popo/wait_set.inl +++ b/iceoryx_posh/include/iceoryx_posh/internal/popo/wait_set.inl @@ -233,6 +233,12 @@ WaitSet::attachState(T& stateOrigin, stateOrigin, TriggerHandle(*m_conditionVariableDataPtr, {*this, &WaitSet::removeTrigger}, uniqueId), stateType); + + auto& trigger = m_triggerArray[uniqueId]; + if (trigger->isStateConditionSatisfied()) + { + ConditionNotifier(*m_conditionVariableDataPtr, uniqueId).notify(); + } }); } @@ -259,6 +265,12 @@ inline expected WaitSet::attachState( .and_then([&](auto& uniqueId) { NotificationAttorney::enableState( stateOrigin, TriggerHandle(*m_conditionVariableDataPtr, {*this, &WaitSet::removeTrigger}, uniqueId)); + + auto& trigger = m_triggerArray[uniqueId]; + if (trigger->isStateConditionSatisfied()) + { + ConditionNotifier(*m_conditionVariableDataPtr, uniqueId).notify(); + } }); } From fc89f72ee9401a266f0459b9dad5ba2d8e916e0e Mon Sep 17 00:00:00 2001 From: Simon Hoinkis Date: Tue, 24 Jan 2023 22:29:36 +0100 Subject: [PATCH 2/4] iox-#1855 Add tests for state condition check on 'WaitSet::attachState' --- .../test/moduletests/test_popo_waitset.cpp | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/iceoryx_posh/test/moduletests/test_popo_waitset.cpp b/iceoryx_posh/test/moduletests/test_popo_waitset.cpp index 2853c5f60b..4d4dbae746 100644 --- a/iceoryx_posh/test/moduletests/test_popo_waitset.cpp +++ b/iceoryx_posh/test/moduletests/test_popo_waitset.cpp @@ -1761,4 +1761,30 @@ TEST_F(WaitSet_test, TimedWaitUnblocksAfterMarkForDestructionCall) t.join(); } +TEST_F(WaitSet_test, WaitSetReturnsIfStateTriggeredBeforeAttachingWithEventType) +{ + ::testing::Test::RecordProperty("TEST_ID", "407dc160-a50c-45b3-84bc-92a5f186fc14"); + m_simpleEvents[0U].m_autoResetTrigger = false; + m_simpleEvents[0U].trigger(); + + ASSERT_FALSE(m_sut->attachState(m_simpleEvents[0U], SimpleState1::STATE1).has_error()); + + auto triggerVector = m_sut->timedWait(iox::units::Duration::fromSeconds(1337)); + ASSERT_THAT(triggerVector.size(), Eq(1U)); + EXPECT_TRUE(triggerVector[0U]->doesOriginateFrom(&m_simpleEvents[0U])); +} + +TEST_F(WaitSet_test, WaitSetReturnsIfStateTriggeredBeforeAttachingWithEventId) +{ + ::testing::Test::RecordProperty("TEST_ID", "5753de85-7b34-4024-bd50-938c8885d269"); + m_simpleEvents[0U].m_autoResetTrigger = false; + m_simpleEvents[0U].trigger(); + + ASSERT_FALSE(m_sut->attachState(m_simpleEvents[0U], 0U).has_error()); + + auto triggerVector = m_sut->timedWait(iox::units::Duration::fromSeconds(1337)); + ASSERT_THAT(triggerVector.size(), Eq(1U)); + EXPECT_TRUE(triggerVector[0U]->doesOriginateFrom(&m_simpleEvents[0U])); +} + } // namespace From bea7318b2052e22b3aa146b0e0222d5ef8bcec44 Mon Sep 17 00:00:00 2001 From: Simon Hoinkis Date: Tue, 24 Jan 2023 22:31:58 +0100 Subject: [PATCH 3/4] iox-#1855 Add release note entry for 'WaitSet::wait' return bugfix Signed-off-by: Simon Hoinkis --- doc/website/release-notes/iceoryx-unreleased.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/website/release-notes/iceoryx-unreleased.md b/doc/website/release-notes/iceoryx-unreleased.md index 1ff673c346..54e96133b8 100644 --- a/doc/website/release-notes/iceoryx-unreleased.md +++ b/doc/website/release-notes/iceoryx-unreleased.md @@ -63,6 +63,7 @@ - Avoid UB when accessing `iox::expected` [\#1750](https://github.com/eclipse-iceoryx/iceoryx/issues/1750) - Fix double move in `vector::emplace` [\#1823](https://github.com/eclipse-iceoryx/iceoryx/issues/1823) - Default roudi_config.toml path is not used [\#1826](https://github.com/eclipse-iceoryx/iceoryx/issues/1826) +- `WaitSet::wait` returns if data was send before `WaitSet::attachState(.., State::HAS_{DATA, REQUEST, RESPONSE})` [\#1855](https://github.com/eclipse-iceoryx/iceoryx/issues/1855) **Refactoring:** From ab389670258ed2bb4b7f5e4ae0ee7ba51aa7d0e5 Mon Sep 17 00:00:00 2001 From: Simon Hoinkis Date: Wed, 25 Jan 2023 12:08:20 +0100 Subject: [PATCH 4/4] iox-#1855 Add test cases for scenario where we 'WaitSet::wait' for a 2nd time Signed-off-by: Simon Hoinkis --- .../test/moduletests/test_popo_waitset.cpp | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/iceoryx_posh/test/moduletests/test_popo_waitset.cpp b/iceoryx_posh/test/moduletests/test_popo_waitset.cpp index 4d4dbae746..6cf856f90f 100644 --- a/iceoryx_posh/test/moduletests/test_popo_waitset.cpp +++ b/iceoryx_posh/test/moduletests/test_popo_waitset.cpp @@ -1787,4 +1787,41 @@ TEST_F(WaitSet_test, WaitSetReturnsIfStateTriggeredBeforeAttachingWithEventId) EXPECT_TRUE(triggerVector[0U]->doesOriginateFrom(&m_simpleEvents[0U])); } +TEST_F(WaitSet_test, WaitSetReturnsAgainIfStateTriggeredBeforeAttachingWithEventType) +{ + ::testing::Test::RecordProperty("TEST_ID", "c86d2592-e8e5-4acc-b468-0a82be82fe7c"); + m_simpleEvents[0U].m_autoResetTrigger = false; + m_simpleEvents[0U].trigger(); + + ASSERT_FALSE(m_sut->attachState(m_simpleEvents[0U], SimpleState1::STATE1).has_error()); + + auto triggerVector1 = m_sut->timedWait(iox::units::Duration::fromSeconds(1337)); + ASSERT_THAT(triggerVector1.size(), Eq(1U)); + EXPECT_TRUE(triggerVector1[0U]->doesOriginateFrom(&m_simpleEvents[0U])); + + // Waiting for another time should lead to the same result + auto triggerVector2 = m_sut->timedWait(iox::units::Duration::fromSeconds(1337)); + ASSERT_THAT(triggerVector2.size(), Eq(1U)); + EXPECT_TRUE(triggerVector2[0U]->doesOriginateFrom(&m_simpleEvents[0U])); +} + +TEST_F(WaitSet_test, WaitSetReturnsAgainIfStateTriggeredBeforeAttachingWithEventId) +{ + ::testing::Test::RecordProperty("TEST_ID", "b07c9e09-f497-4bfa-9403-633d15363f5e"); + m_simpleEvents[0U].m_autoResetTrigger = false; + m_simpleEvents[0U].trigger(); + + ASSERT_FALSE(m_sut->attachState(m_simpleEvents[0U], 0U).has_error()); + + auto triggerVector1 = m_sut->timedWait(iox::units::Duration::fromSeconds(1337)); + ASSERT_THAT(triggerVector1.size(), Eq(1U)); + EXPECT_TRUE(triggerVector1[0U]->doesOriginateFrom(&m_simpleEvents[0U])); + + // Waiting for another time should lead to the same result + auto triggerVector2 = m_sut->timedWait(iox::units::Duration::fromSeconds(1337)); + ASSERT_THAT(triggerVector2.size(), Eq(1U)); + EXPECT_TRUE(triggerVector2[0U]->doesOriginateFrom(&m_simpleEvents[0U])); +} + + } // namespace