From c7ef1ef0126023ca8a377f00ae9aebb81bc34d37 Mon Sep 17 00:00:00 2001 From: Christian Linke Date: Tue, 16 Feb 2016 17:44:08 +0100 Subject: Added overflow handling for timer and poll handles Signed-off-by: Christian Linke --- AudioManagerUtilities/include/CAmSocketHandler.h | 7 +++- AudioManagerUtilities/src/CAmSocketHandler.cpp | 44 ++++++++++++++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/AudioManagerUtilities/include/CAmSocketHandler.h b/AudioManagerUtilities/include/CAmSocketHandler.h index 1a988c5..edf19fd 100644 --- a/AudioManagerUtilities/include/CAmSocketHandler.h +++ b/AudioManagerUtilities/include/CAmSocketHandler.h @@ -23,6 +23,7 @@ #include #include #include +#include #include #include //todo: remove me @@ -30,6 +31,8 @@ namespace am { #define MAX_NS 1000000000L +#define MAX_TIMERHANDLE INT16_MAX +#define MAX_POLLHANDLE INT16_MAX typedef uint16_t sh_timerHandle_t; //! mSetPollKeys; //!A set of all used ppoll keys mListPoll_t mListPoll; //! mSetTimerKeys; //!A set of all used timer keys std::list mListTimer; //! mListActiveTimer; //!handle == handle) { iterator = mListPoll.erase(iterator); + mSetPollKeys.erase(handle); mRecreatePollfds = true; return (E_OK); } @@ -255,8 +275,25 @@ am_Error_e CAmSocketHandler::addTimer(const timespec timeouts, IAmShTimerCallBac sh_timer_s timerItem; //create a new handle for the timer - handle = ++mLastInsertedHandle; //todo: overflow ruling !o - timerItem.handle = handle; + sh_timerHandle_t lastTimerHandle(mLastInsertedHandle); + do + { + ++mLastInsertedHandle; + if (mLastInsertedHandle == MAX_TIMERHANDLE) + { + mLastInsertedHandle = 0; + } + if (lastTimerHandle==mLastInsertedHandle) + { + logError(__PRETTY_FUNCTION__,"Could not create new timers, too many open!"); + return (am_Error_e::E_NOT_POSSIBLE); + } + + } while (mSetTimerKeys.find(mLastInsertedHandle) != mSetTimerKeys.end()); + + mSetTimerKeys.insert(mLastInsertedHandle); + + timerItem.handle = mLastInsertedHandle; timerItem.countdown = timeouts; timerItem.callback = callback; timerItem.userData = userData; @@ -292,6 +329,7 @@ am_Error_e CAmSocketHandler::removeTimer(const sh_timerHandle_t handle) if (it->handle == handle) { it = mListTimer.erase(it); + mSetTimerKeys.erase(handle); return (E_OK); } } -- cgit v1.2.1