From d3a37a8b5da87a77be8f8df8c3c75f337ac03a8e Mon Sep 17 00:00:00 2001 From: Aleksandar Donchev Date: Tue, 26 Sep 2017 16:07:00 +0200 Subject: A filedescriptor removal will set an invalidation flag which will prevent calls on the invalidated objects in the current iteration. Signed-off-by: Christian Linke Change-Id: I9d5d3c434ac9fad62c76a76145c731b538aeb1e3 --- AudioManagerUtilities/include/CAmSocketHandler.h | 11 ++-- AudioManagerUtilities/src/CAmSocketHandler.cpp | 58 ++++++++++++++-------- .../AmSocketHandlerTest/CAmSocketHandlerTest.cpp | 9 ++-- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/AudioManagerUtilities/include/CAmSocketHandler.h b/AudioManagerUtilities/include/CAmSocketHandler.h index 7baa496..d14c1a3 100644 --- a/AudioManagerUtilities/include/CAmSocketHandler.h +++ b/AudioManagerUtilities/include/CAmSocketHandler.h @@ -217,6 +217,7 @@ class CAmSocketHandler { struct sh_poll_s //! prepareCB; //preperation callback @@ -226,7 +227,7 @@ class CAmSocketHandler void* userData; sh_poll_s() : - handle(0), pollfdValue(), prepareCB(), firedCB(), checkCB(), dispatchCB(), userData(0) + isValid(true), handle(0), pollfdValue(), prepareCB(), firedCB(), checkCB(), dispatchCB(), userData(0) {} }; @@ -302,9 +303,11 @@ class CAmSocketHandler bool mRecreatePollfds; //! listPoll; - VectorListPoll_t cloneListPoll; + std::list listPoll; VectorListPoll_t::iterator listmPollIt; VectorListPollfd_t::iterator itMfdPollingArray; VectorListPollfd_t fdPollingArray; //!handle == handle) @@ -442,10 +444,24 @@ am_Error_e CAmSocketHandler::removeFDPoll(const sh_pollHandle_t handle) iterator = mListPoll.erase(iterator); mSetPollKeys.pollHandles.erase(handle); mRecreatePollfds = true; - return (E_OK); + break; } } - return (E_UNKNOWN); + + if (iterator == mListPoll.end()) + return (E_UNKNOWN); + + VectorListPoll_t::iterator iteratorActivePolls = mListActivePolls.begin(); + for (; iteratorActivePolls != mListActivePolls.end(); ++iteratorActivePolls) + { + if (iteratorActivePolls->handle == handle) + { + iteratorActivePolls->isValid = false; + break; + } + } + + return (E_OK); } /** @@ -985,11 +1001,11 @@ void CAmSocketHandler::prepare(am::CAmSocketHandler::sh_poll_s& row) /** * fire callback */ -void CAmSocketHandler::fire(sh_poll_s& a) +void CAmSocketHandler::fire(const sh_poll_s* a) { try { - a.firedCB(a.pollfdValue, a.handle, a.userData); + a->firedCB(a->pollfdValue, a->handle, a->userData); } catch (std::exception& e) { logError("Sockethandler: Exception in Preparecallback,caught", e.what()); @@ -999,23 +1015,23 @@ void CAmSocketHandler::fire(sh_poll_s& a) /** * should disptach */ -bool CAmSocketHandler::noDispatching(const sh_poll_s& a) +bool CAmSocketHandler::noDispatching(const sh_poll_s* a) { //remove from list of there is no checkCB - if (nullptr == a.checkCB) + if (nullptr == a->checkCB || false==a->isValid ) return (true); - return (!a.checkCB(a.handle, a.userData)); + return (!a->checkCB(a->handle, a->userData)); } /** * disptach */ -bool CAmSocketHandler::dispatchingFinished(const sh_poll_s& a) +bool CAmSocketHandler::dispatchingFinished(const sh_poll_s* a) { //remove from list of there is no dispatchCB - if (nullptr == a.dispatchCB) + if (nullptr == a->dispatchCB || false==a->isValid ) return (true); - return (!a.dispatchCB(a.handle, a.userData)); + return (!a->dispatchCB(a->handle, a->userData)); } /** diff --git a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp index 129f896..07f6aaf 100644 --- a/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp +++ b/AudioManagerUtilities/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp @@ -36,9 +36,12 @@ //todo: expand test, implement more usecases //todo: test removeFD +#undef ENABLED_SOCKETHANDLER_TEST_OUTPUT +#undef ENABLED_TIMERS_TEST_OUTPUT + #define SOCK_PATH "/tmp/mysock" -#define SOCKET_TEST_LOOPS_COUNT 10 +#define SOCKET_TEST_LOOPS_COUNT 50 #define TIMERS_TO_TEST 500 using namespace testing; @@ -464,7 +467,7 @@ TEST(CAmSocketHandlerTest, timersStressTest) timespec timeoutTime; timeoutTime.tv_sec = 0; - timeoutTime.tv_nsec = 50000000;// 0,05 + timeoutTime.tv_nsec = 10000000;// 0,01 std::vector timers; @@ -896,7 +899,7 @@ CAmSamplePluginStressTest::CAmSamplePluginStressTest(CAmSocketHandler *mySocketH userData.f = 1.f; timespec timeoutTime; timeoutTime.tv_sec = 0; - timeoutTime.tv_nsec = 500000000;// 0,5 + timeoutTime.tv_nsec = 10000000;// 0,01 for(int i=0;i