From 9c0acd5dc485e422a4a0e329e77ab31af721efeb Mon Sep 17 00:00:00 2001 From: christian mueller Date: Thu, 29 Mar 2012 17:40:07 +0200 Subject: * [GAM-49] worked in comments to last patches * changed dlt threadsafeness * changes on timers in CAmSockethandler * adopted test of Sockethandler to changes * add versioning scheme to documentation * added forgotten #include on CamDbusWrapper and CAmRoutingSenderAsync * adopted RoutingReceiverAsyncTests to new timers Signed-off-by: christian mueller --- include/shared/CAmDbusWrapper.h | 1 + include/shared/CAmDltWrapper.h | 125 +++++++------ include/shared/CAmSocketHandler.h | 358 +++++++++++++++++++++++--------------- 3 files changed, 285 insertions(+), 199 deletions(-) (limited to 'include') diff --git a/include/shared/CAmDbusWrapper.h b/include/shared/CAmDbusWrapper.h index 0a83bb4..020cf89 100644 --- a/include/shared/CAmDbusWrapper.h +++ b/include/shared/CAmDbusWrapper.h @@ -26,6 +26,7 @@ #include #include #include +#include #include "config.h" #include "CAmSocketHandler.h" diff --git a/include/shared/CAmDltWrapper.h b/include/shared/CAmDltWrapper.h index 7a55626..c9dd4c2 100644 --- a/include/shared/CAmDltWrapper.h +++ b/include/shared/CAmDltWrapper.h @@ -21,6 +21,7 @@ #include "config.h" #include +#include #ifdef WITH_DLT #include @@ -88,7 +89,6 @@ namespace am class CAmDltWrapper { public: - static pthread_mutex_t logMutex; static CAmDltWrapper* instance(const bool enableNoDLTDebug = false); void registerApp(const char *appid, const char * description); void registerContext(DltContext& handle, const char *contextid, const char * description); @@ -118,6 +118,7 @@ private: DltContext mDltContext; //!< the default context DltContextData mDltContextData; //!< contextdata static CAmDltWrapper* mpDLTWrapper; //!< pointer to the wrapper instance + static pthread_mutex_t mMutex; }; @@ -137,11 +138,9 @@ inline CAmDltWrapper* getWrapper() template void logInfo(T value) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); inst->init(DLT_LOG_INFO); inst->append(value); inst->send(); - pthread_mutex_unlock(&inst->logMutex); } /** @@ -152,12 +151,12 @@ template void logInfo(T value) template void logInfo(T value, T1 value1) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -169,13 +168,13 @@ template void logInfo(T value, T1 value1) template void logInfo(T value, T1 value1, T2 value2) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); inst->append(value2); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -188,14 +187,14 @@ template void logInfo(T value, T1 value1, template void logInfo(T value, T1 value1, T2 value2, T3 value3) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); inst->append(value2); inst->append(value3); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -209,7 +208,7 @@ template void logInfo(T value template void logInfo(T value, T1 value1, T2 value2, T3 value3, T4 value4) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); @@ -217,7 +216,7 @@ template void lo inst->append(value3); inst->append(value4); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -232,7 +231,7 @@ template void lo template void logInfo(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); @@ -241,7 +240,7 @@ templateappend(value4); inst->append(value5); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -257,7 +256,7 @@ template void logInfo(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); @@ -267,7 +266,7 @@ templateappend(value5); inst->append(value6); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -284,7 +283,7 @@ template void logInfo(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); @@ -295,7 +294,7 @@ templateappend(value6); inst->append(value7); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -313,7 +312,7 @@ template void logInfo(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); @@ -325,7 +324,7 @@ templateappend(value7); inst->append(value8); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -344,7 +343,7 @@ template void logInfo(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); @@ -357,7 +356,7 @@ templateappend(value8); inst->append(value9); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -377,7 +376,7 @@ template void logInfo(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_INFO); inst->append(value); inst->append(value1); @@ -391,7 +390,7 @@ templateappend(value9); inst->append(value10); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -401,11 +400,11 @@ template void logError(T value) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -416,12 +415,12 @@ template void logError(T value) template void logError(T value, T1 value1) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -433,13 +432,13 @@ template void logError(T value, T1 value1) template void logError(T value, T1 value1, T2 value2) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); inst->append(value2); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -452,14 +451,14 @@ template void logError(T value, T1 value1, template void logError(T value, T1 value1, T2 value2, T3 value3) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); inst->append(value2); inst->append(value3); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -473,7 +472,7 @@ template void logError(T valu template void logError(T value, T1 value1, T2 value2, T3 value3, T4 value4) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); @@ -481,7 +480,7 @@ template void lo inst->append(value3); inst->append(value4); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -496,7 +495,7 @@ template void lo template void logError(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); @@ -505,7 +504,7 @@ templateappend(value4); inst->append(value5); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -521,7 +520,7 @@ template void logError(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); @@ -531,7 +530,7 @@ templateappend(value5); inst->append(value6); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -548,7 +547,7 @@ template void logError(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); @@ -559,7 +558,7 @@ templateappend(value6); inst->append(value7); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -577,7 +576,7 @@ template void logError(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); @@ -589,7 +588,7 @@ templateappend(value7); inst->append(value8); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -608,7 +607,7 @@ template void logError(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); @@ -621,7 +620,7 @@ templateappend(value8); inst->append(value9); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -641,7 +640,7 @@ template void logError(T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8, T9 value9, T10 value10) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(DLT_LOG_ERROR); inst->append(value); inst->append(value1); @@ -655,7 +654,7 @@ templateappend(value9); inst->append(value10); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -667,11 +666,11 @@ template void log(DltContext* const context, DltLogLevelType loglevel, T value) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -684,12 +683,12 @@ template void log(DltContext* const context, DltLogLevelType logleve template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -703,13 +702,13 @@ template void log(DltContext* const context, DltLogLeve template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1, T2 value2) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); inst->append(value2); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -724,14 +723,14 @@ template void log(DltContext* const contex template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1, T2 value2, T3 value3) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); inst->append(value2); inst->append(value3); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -747,7 +746,7 @@ template void log(DltContext* template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1, T2 value2, T3 value3, T4 value4) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); @@ -755,7 +754,7 @@ template void lo inst->append(value3); inst->append(value4); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -772,7 +771,7 @@ template void lo template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); @@ -781,7 +780,7 @@ templateappend(value4); inst->append(value5); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -799,7 +798,7 @@ template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); @@ -809,7 +808,7 @@ templateappend(value5); inst->append(value6); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -828,7 +827,7 @@ template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); @@ -839,7 +838,7 @@ templateappend(value6); inst->append(value7); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } /** @@ -859,7 +858,7 @@ template void log(DltContext* const context, DltLogLevelType loglevel, T value, T1 value1, T2 value2, T3 value3, T4 value4, T5 value5, T6 value6, T7 value7, T8 value8) { CAmDltWrapper* inst(getWrapper()); - pthread_mutex_lock(&inst->logMutex); + inst->init(loglevel, context); inst->append(value); inst->append(value1); @@ -871,7 +870,7 @@ templateappend(value7); inst->append(value8); inst->send(); - pthread_mutex_unlock(&inst->logMutex); + } } diff --git a/include/shared/CAmSocketHandler.h b/include/shared/CAmSocketHandler.h index 83d2352..990ef0f 100644 --- a/include/shared/CAmSocketHandler.h +++ b/include/shared/CAmSocketHandler.h @@ -27,10 +27,13 @@ #include #include +#include //todo: remove me namespace am { -static volatile sig_atomic_t gDispatchDone = 0; //this global is used to stop the mainloop +#define MAX_NS 1000000000L + +static volatile sig_atomic_t gDispatchDone = 1; //this global is used to stop the mainloop typedef uint16_t sh_timerHandle_t; //! rListTimerIter; - - class CAmShSubstractTime //! rListTimerIter; //! mListPollfd_t; //! mListPoll_t; //!Call(row.pollfdValue, row.handle, row.userData); - } - }; - - class CAmShCallPrep - { - public: - CAmShCallPrep(){}; - void operator()(sh_poll_s& row) - { - if (row.prepareCB) - row.prepareCB->Call(row.handle, row.userData); - } - }; - - class CAmShCallTimer - { - public: - CAmShCallTimer(){}; - void operator()(sh_timer_s& row) - { - row.callback->Call(row.handle, row.userData); - } - }; - - class CAmShCountdownUp - { - public: - CAmShCountdownUp(){}; - bool operator()(sh_timer_s& row) - { - if (row.countdown.tv_nsec == 0 && row.countdown.tv_sec == 0) - return (true); - return (false); - } - }; - - class CAmShCountdownSame - { - private: - sh_timer_s mCompareValue; - public: - CAmShCountdownSame(sh_timer_s& a) : - mCompareValue(a) - {} - bool operator()(const sh_timer_s& b) - { - return ((mCompareValue.countdown.tv_sec == b.countdown.tv_sec) && (mCompareValue.countdown.tv_nsec == b.countdown.tv_nsec) ? true : false); - } - }; - bool fdIsValid(const int fd) const; - void initTimer(); void timerUp(); void timerCorrection(); - int timespec2ms(const timespec& time); timespec* insertTime(timespec& buffertime); - static bool compareCountdown(const sh_timer_s& a, const sh_timer_s& b) + /** + * compares countdown values + * @param a + * @param b + * @return true if b greater a + */ + inline static bool compareCountdown(const sh_timer_s& a, const sh_timer_s& b) { return ((a.countdown.tv_sec == b.countdown.tv_sec) ? (a.countdown.tv_nsec < b.countdown.tv_nsec) : (a.countdown.tv_sec < b.countdown.tv_sec)); } @@ -246,7 +171,7 @@ private: * @param b * @return subtracted value */ - static timespec timespecSub(const timespec& a, const timespec& b) + inline static timespec timespecSub(const timespec& a, const timespec& b) { timespec result; @@ -259,7 +184,7 @@ private: result.tv_sec = a.tv_sec - b.tv_sec; if (a.tv_nsec < b.tv_nsec) { - result.tv_nsec = a.tv_nsec + 1000000000L - b.tv_nsec; + result.tv_nsec = a.tv_nsec + MAX_NS - b.tv_nsec; result.tv_sec--; /* Borrow a second. */ } else @@ -270,20 +195,32 @@ private: return (result); } - static timespec timespecAdd(const timespec& a, const timespec b) + /** + * adds timespec values + * @param a + * @param b + * @return the added values + */ + inline timespec timespecAdd(const timespec& a, const timespec& b) { timespec result; result.tv_sec = a.tv_sec + b.tv_sec; result.tv_nsec = a.tv_nsec + b.tv_nsec; - if (result.tv_nsec >= 1000000000L) + if (result.tv_nsec >= MAX_NS) { result.tv_sec++; - result.tv_nsec = result.tv_nsec - 1000000000L; + result.tv_nsec = result.tv_nsec - MAX_NS; } return (result); } - static int timespecCompare(const timespec& a, const timespec& b) + /** + * comapares timespec values + * @param a + * @param b + * @return + */ + inline int timespecCompare(const timespec& a, const timespec& b) { //less if (a.tv_sec < b.tv_sec) @@ -302,11 +239,21 @@ private: return (0); } + /** + * functor to return all fired events + * @param a + * @return + */ inline static bool eventFired(const pollfd& a) { return (a.revents == 0 ? false : true); } + /** + * functor to help find the items that do not need dispatching + * @param a + * @return + */ inline static bool noDispatching(const sh_poll_s& a) { //remove from list of there is no checkCB @@ -315,6 +262,11 @@ private: return (!a.checkCB->Call(a.handle, a.userData)); } + /** + * checks if dispatching is already finished + * @param a + * @return + */ inline static bool dispatchingFinished(const sh_poll_s& a) { //remove from list of there is no dispatchCB @@ -323,14 +275,129 @@ private: return (!a.dispatchCB->Call(a.handle, a.userData)); } - mListPollfd_t mfdPollingArray; - mListPoll_t mListPoll; + class CAmShCopyPollfd //!< functor to copy filedescriptors into the poll array + { + private: + mListPollfd_t& mArray; + public: + CAmShCopyPollfd(mListPollfd_t& dest) : + mArray(dest) + { + } + void operator()(const sh_poll_s& row) + { + pollfd temp = row.pollfdValue; + temp.revents = 0; + mArray.push_back(temp); + } + }; + + class CAmShCallFire //!< functor to call the firecallbacks + { + public: + CAmShCallFire() + { + } + ; + void operator()(sh_poll_s& row) + { + row.firedCB->Call(row.pollfdValue, row.handle, row.userData); + } + }; + + class CAmShCallPrep //!< functor to call the preparation callbacks + { + public: + CAmShCallPrep() + { + } + ; + void operator()(sh_poll_s& row) + { + if (row.prepareCB) + row.prepareCB->Call(row.handle, row.userData); + } + }; + + class CAmShCallTimer //!Call(row.handle, row.userData); + } + }; + + class CAmShCountdownUp //! mListTimer; //! mListActiveTimer; //!::iterator it(mListActiveTimer.begin()); +// for(;it!=mListActiveTimer.end();++it) +// { +// std::cout<< "Handle " << it->handle << "sec " << it->countdown.tv_sec << "nsec " << it->countdown.tv_nsec< class TAmShPollFired: public IAmShPollFired @@ -386,12 +460,16 @@ private: public: TAmShPollFired(TClass* instance, void (TClass::*function)(const pollfd pollfd, const sh_pollHandle_t handle, void* userData)) : mInstance(instance), // - mFunction(function){}; + mFunction(function) + { + } + ; virtual void Call(const pollfd pollfd, const sh_pollHandle_t handle, void* userData) { (*mInstance.*mFunction)(pollfd, handle, userData); - }; + } + ; }; /** @@ -406,12 +484,16 @@ private: public: TAmShPollCheck(TClass* instance, bool (TClass::*function)(const sh_pollHandle_t handle, void* userData)) : mInstance(instance), // - mFunction(function){}; + mFunction(function) + { + } + ; virtual bool Call(const sh_pollHandle_t handle, void* userData) { return ((*mInstance.*mFunction)(handle, userData)); - }; + } + ; }; /** @@ -426,12 +508,16 @@ private: public: TAmShPollDispatch(TClass* instance, bool (TClass::*function)(const sh_pollHandle_t handle, void* userData)) : mInstance(instance), // - mFunction(function){}; + mFunction(function) + { + } + ; virtual bool Call(const sh_pollHandle_t handle, void* userData) { return ((*mInstance.*mFunction)(handle, userData)); - }; + } + ; }; } /* namespace am */ #endif /* SOCKETHANDLER_H_ */ -- cgit v1.2.1