summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchristian mueller <christian.ei.mueller@bmw.de>2012-03-29 17:40:07 +0200
committerchristian mueller <christian.ei.mueller@bmw.de>2012-03-29 17:40:07 +0200
commit9c0acd5dc485e422a4a0e329e77ab31af721efeb (patch)
treea9d6e331c0bc23790f0614f880354946c430b522
parent2566c2aaaf8f43b184a037e227e8bf2c747c7679 (diff)
downloadaudiomanager-9c0acd5dc485e422a4a0e329e77ab31af721efeb.tar.gz
* [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 <map> on CamDbusWrapper and CAmRoutingSenderAsync * adopted RoutingReceiverAsyncTests to new timers Signed-off-by: christian mueller <christian.ei.mueller@bmw.de>
-rw-r--r--AudioManagerDaemon/docx/images/versioning.pngbin0 -> 23647 bytes
-rw-r--r--AudioManagerDaemon/src/CAmDbusWrapper.cpp12
-rw-r--r--AudioManagerDaemon/src/CAmDltWrapper.cpp4
-rw-r--r--AudioManagerDaemon/src/CAmSocketHandler.cpp194
-rw-r--r--AudioManagerDaemon/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp21
-rw-r--r--PluginRoutingInterfaceAsync/include/CAmRoutingSenderAsync.h1
-rw-r--r--PluginRoutingInterfaceAsync/test/CAmRoutingReceiverAsync.cpp12
-rw-r--r--include/shared/CAmDbusWrapper.h1
-rw-r--r--include/shared/CAmDltWrapper.h125
-rw-r--r--include/shared/CAmSocketHandler.h358
10 files changed, 445 insertions, 283 deletions
diff --git a/AudioManagerDaemon/docx/images/versioning.png b/AudioManagerDaemon/docx/images/versioning.png
new file mode 100644
index 0000000..9b587ba
--- /dev/null
+++ b/AudioManagerDaemon/docx/images/versioning.png
Binary files differ
diff --git a/AudioManagerDaemon/src/CAmDbusWrapper.cpp b/AudioManagerDaemon/src/CAmDbusWrapper.cpp
index 115d33d..97b4ccd 100644
--- a/AudioManagerDaemon/src/CAmDbusWrapper.cpp
+++ b/AudioManagerDaemon/src/CAmDbusWrapper.cpp
@@ -132,7 +132,7 @@ CAmDbusWrapper::~CAmDbusWrapper()
*/
void CAmDbusWrapper::registerCallback(const DBusObjectPathVTable* vtable, const std::string& path, void* userdata)
{
- logInfo("DBusWrapper::~registerCallback register callback:", path);
+ logInfo("DBusWrapper::registerCallback register callback:", path);
std::string completePath = std::string(DBUS_SERVICE_OBJECT_PATH) + "/" + path;
dbus_error_init(&mDBusError);
@@ -314,10 +314,9 @@ dbus_bool_t CAmDbusWrapper::addTimeoutDelegate(DBusTimeout *timeout, void* userD
//prepare handle and callback. new is eval, but there is no other choice because we need the pointer!
sh_timerHandle_t* handle = new sh_timerHandle_t;
mpListTimerhandles.push_back(handle);
- IAmShTimerCallBack* buffer = &pDbusTimerCallback;
//add the timer to the pollLoop
- mpSocketHandler->addTimer(pollTimeout, buffer, *handle, timeout);
+ mpSocketHandler->addTimer(pollTimeout, &pDbusTimerCallback, *handle, timeout);
//save the handle with dbus context
dbus_timeout_set_data(timeout, handle, NULL);
@@ -427,7 +426,7 @@ void CAmDbusWrapper::toggleTimeoutDelegate(DBusTimeout *timeout, void* userData)
int localTimeout = dbus_timeout_get_interval(timeout);
pollTimeout.tv_sec = localTimeout / 1000;
pollTimeout.tv_nsec = (localTimeout % 1000) * 1000000;
- mpSocketHandler->restartTimer(*handle, pollTimeout);
+ mpSocketHandler->updateTimer(*handle, pollTimeout);
}
else
{
@@ -441,10 +440,7 @@ void CAmDbusWrapper::dbusTimerCallback(sh_timerHandle_t handle, void *userData)
assert(userData!=NULL);
if (dbus_timeout_get_enabled((DBusTimeout*) userData))
{
- timespec ts;
- ts.tv_nsec = -1;
- ts.tv_sec = -1;
- mpSocketHandler->restartTimer(handle, ts);
+ mpSocketHandler->restartTimer(handle);
}
dbus_timeout_handle((DBusTimeout*) userData);
logInfo("DBusWrapper::dbusTimerCallback was called");
diff --git a/AudioManagerDaemon/src/CAmDltWrapper.cpp b/AudioManagerDaemon/src/CAmDltWrapper.cpp
index 5449d7d..61d79c2 100644
--- a/AudioManagerDaemon/src/CAmDltWrapper.cpp
+++ b/AudioManagerDaemon/src/CAmDltWrapper.cpp
@@ -30,7 +30,7 @@ namespace am
{
CAmDltWrapper* CAmDltWrapper::mpDLTWrapper = NULL;
-pthread_mutex_t CAmDltWrapper::logMutex = PTHREAD_MUTEX_INITIALIZER;
+pthread_mutex_t CAmDltWrapper::mMutex = PTHREAD_MUTEX_INITIALIZER;
CAmDltWrapper *CAmDltWrapper::instance(const bool enableNoDLTDebug)
{
@@ -96,6 +96,7 @@ void CAmDltWrapper::registerContext(DltContext& handle, const char *contextid, c
void CAmDltWrapper::init(DltLogLevelType loglevel, DltContext* context)
{
(void) loglevel;
+ pthread_mutex_lock(&mMutex);
if (!context)
context = &mDltContext;
#ifdef WITH_DLT
@@ -115,6 +116,7 @@ void CAmDltWrapper::send()
mDltContextData.buffer.str("");
mDltContextData.buffer.clear();
#endif
+ pthread_mutex_unlock(&mMutex);
}
void CAmDltWrapper::append(const int8_t value)
diff --git a/AudioManagerDaemon/src/CAmSocketHandler.cpp b/AudioManagerDaemon/src/CAmSocketHandler.cpp
index a6c4be9..27cb4bb 100644
--- a/AudioManagerDaemon/src/CAmSocketHandler.cpp
+++ b/AudioManagerDaemon/src/CAmSocketHandler.cpp
@@ -43,7 +43,7 @@ CAmSocketHandler::CAmSocketHandler() :
mRecreatePollfds(true), //
mStartTime()
{
- gDispatchDone = 0;
+ gDispatchDone = 1;
}
CAmSocketHandler::~CAmSocketHandler()
@@ -82,8 +82,7 @@ void CAmSocketHandler::start_listenting()
mRecreatePollfds = false;
}
- if (!mListActiveTimer.empty())
- timerCorrection();
+ timerCorrection();
//block until something is on a filedescriptor
@@ -102,7 +101,6 @@ void CAmSocketHandler::start_listenting()
}
}
- clock_gettime(CLOCK_MONOTONIC, &mStartTime);
if (pollStatus != 0) //only check filedescriptors if there was a change
{
//todo: here could be a timer that makes sure naughty plugins return!
@@ -153,6 +151,16 @@ void CAmSocketHandler::start_listenting()
void CAmSocketHandler::stop_listening()
{
gDispatchDone = 1;
+
+ //this is for all running timers only - we need to handle the additional offset here
+ if (!mListActiveTimer.empty())
+ {
+ timespec currentTime, correctionTime;
+ clock_gettime(CLOCK_MONOTONIC, &currentTime);
+ correctionTime = timespecSub(currentTime, mStartTime);
+ std::for_each(mListActiveTimer.begin(), mListActiveTimer.end(), CAmShSubstractTime(correctionTime));
+ }
+
}
/**
@@ -224,7 +232,7 @@ am_Error_e CAmSocketHandler::removeFDPoll(const sh_pollHandle_t handle)
* @param userData pointer always passed with the call
* @return E_OK in case of success
*/
-am_Error_e CAmSocketHandler::addTimer(const timespec timeouts, IAmShTimerCallBack*& callback, sh_timerHandle_t& handle, void * userData)
+am_Error_e CAmSocketHandler::addTimer(const timespec timeouts, IAmShTimerCallBack* callback, sh_timerHandle_t& handle, void * userData)
{
assert(!((timeouts.tv_sec==0) && (timeouts.tv_nsec==0)));
assert(callback!=NULL);
@@ -235,11 +243,17 @@ am_Error_e CAmSocketHandler::addTimer(const timespec timeouts, IAmShTimerCallBac
handle = ++mLastInsertedHandle; //todo: overflow ruling !o
timerItem.handle = handle;
timerItem.countdown = timeouts;
- timerItem.timeout = timeouts;
timerItem.callback = callback;
timerItem.userData = userData;
mListTimer.push_back(timerItem);
+
+ //we add here the time difference between startTime and currenttime, because this time will be substracted later on in timecorrection
+ timespec currentTime;
+ clock_gettime(CLOCK_MONOTONIC, &currentTime);
+ if (!gDispatchDone) //the mainloop is started
+ timerItem.countdown = timespecAdd(timeouts, timespecSub(currentTime, mStartTime));
+
mListActiveTimer.push_back(timerItem);
mListActiveTimer.sort(compareCountdown);
return (E_OK);
@@ -257,7 +271,7 @@ am_Error_e CAmSocketHandler::removeTimer(const sh_timerHandle_t handle)
//stop the current timer
stopTimer(handle);
- std::list<sh_timer_s>::iterator it = mListTimer.begin();
+ std::list<sh_timer_s>::iterator it(mListTimer.begin());
for (; it != mListTimer.end(); ++it)
{
if (it->handle == handle)
@@ -270,36 +284,117 @@ am_Error_e CAmSocketHandler::removeTimer(const sh_timerHandle_t handle)
}
/**
- * restarts a timer and updates with a new interval
+ * restarts a timer and updates with a new interva
* @param handle handle to the timer
* @param timeouts new timout time
* @return E_OK on success, E_NON_EXISTENT if the handle was not found
*/
-am_Error_e CAmSocketHandler::restartTimer(const sh_timerHandle_t handle, const timespec timeouts)
+am_Error_e CAmSocketHandler::updateTimer(const sh_timerHandle_t handle, const timespec timeouts)
{
+ //update the mList ....
sh_timer_s timerItem;
- std::list<sh_timer_s>::iterator it = mListTimer.begin();
+ std::list<sh_timer_s>::iterator it(mListTimer.begin()), activeIt(mListActiveTimer.begin());
+ bool found(false);
for (; it != mListTimer.end(); ++it)
{
if (it->handle == handle)
{
+ it->countdown = timeouts;
timerItem = *it;
+ found = true;
break;
}
}
+ if (!found)
+ return (E_NON_EXISTENT);
+
+ found = false;
- timerItem.timeout=timeouts;
- timerItem.countdown=timeouts;
+ //we add here the time difference between startTime and currenttime, because this time will be substracted later on in timecorrection
+ timespec currentTime, timeoutsCorrected;
+ clock_gettime(CLOCK_MONOTONIC, &currentTime);
+ if (!gDispatchDone) //the mainloop is started
+ timeoutsCorrected = timespecAdd(timeouts, timespecSub(currentTime, mStartTime));
+
+ for (; activeIt != mListActiveTimer.end(); ++activeIt)
+ {
+ if (activeIt->handle == handle)
+ {
+ activeIt->countdown = timeoutsCorrected;
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ timerItem.countdown = timeoutsCorrected;
mListActiveTimer.push_back(timerItem);
+
mListActiveTimer.sort(compareCountdown);
return (E_OK);
}
+/**
+ * restarts a timer with the original value
+ * @param handle
+ * @return E_OK on success, E_NON_EXISTENT if the handle was not found
+ */
+am_Error_e CAmSocketHandler::restartTimer(const sh_timerHandle_t handle)
+{
+ sh_timer_s timerItem; //!<the original timer value
+ //find the original value
+ std::list<sh_timer_s>::iterator it(mListTimer.begin()), activeIt(mListActiveTimer.begin());
+ bool found(false);
+ for (; it != mListTimer.end(); ++it)
+ {
+ if (it->handle == handle)
+ {
+ timerItem = *it;
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ return (E_NON_EXISTENT);
+
+ found = false;
+
+ //we add here the time difference between startTime and currenttime, because this time will be substracted later on in timecorrection
+ timespec currentTime, timeoutsCorrected;
+ clock_gettime(CLOCK_MONOTONIC, &currentTime);
+ if (!gDispatchDone) //the mainloop is started
+ {
+ timeoutsCorrected = timespecAdd(timerItem.countdown, timespecSub(currentTime, mStartTime));
+ timerItem.countdown = timeoutsCorrected;
+ }
+
+ for (; activeIt != mListActiveTimer.end(); ++activeIt)
+ {
+ if (activeIt->handle == handle)
+ {
+ activeIt->countdown = timerItem.countdown;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found)
+ mListActiveTimer.push_back(timerItem);
+
+ mListActiveTimer.sort(compareCountdown);
+
+ return (E_OK);
+}
+
+/**
+ * stops a timer
+ * @param handle
+ * @return E_OK on success, E_NON_EXISTENT if the handle was not found
+ */
am_Error_e CAmSocketHandler::stopTimer(const sh_timerHandle_t handle)
{
//go through the list and remove the timer with the handle
- std::list<sh_timer_s>::iterator it = mListActiveTimer.begin();
+ std::list<sh_timer_s>::iterator it(mListActiveTimer.begin());
for (; it != mListActiveTimer.end(); ++it)
{
if (it->handle == handle)
@@ -313,9 +408,7 @@ am_Error_e CAmSocketHandler::stopTimer(const sh_timerHandle_t handle)
/**
* updates the eventFlags of a poll
- * @param handle buffertime.tv_nsec = mTimeout.tv_nsec;
- buffertime.tv_sec = mTimeout.tv_sec;
- return ((mTimeout.tv_nsec == -1 && mTimeout.tv_sec == -1) ? NULL : &buffertime);
+ * @param handle
* @param events
* @return @return E_OK on succsess, E_NON_EXISTENT if fd was not found
*/
@@ -350,11 +443,13 @@ bool CAmSocketHandler::fdIsValid(const int fd) const
*/
void CAmSocketHandler::timerUp()
{
- //first we need to correct all the countdown values by the one who fired
- std::for_each(mListActiveTimer.begin(), mListActiveTimer.end(), CAmShSubstractTime(mListActiveTimer.begin()->countdown));
+ //find out the timedifference to starttime
+ timespec currentTime, diffTime;
+ clock_gettime(CLOCK_MONOTONIC, &currentTime);
+ diffTime = timespecSub(currentTime, mStartTime);
- //then find the last value that is zero. Since the first value is subtracted, we will always have the first one
- std::list<sh_timer_s>::reverse_iterator overflowIter = std::find_if(mListActiveTimer.rbegin(), mListActiveTimer.rend(), CAmShCountdownUp());
+ //now we need to substract the diffTime from all timers and see if they are up
+ std::list<sh_timer_s>::reverse_iterator overflowIter = std::find_if(mListActiveTimer.rbegin(), mListActiveTimer.rend(), CAmShCountdownUp(diffTime));
//copy all fired timers into a list
std::vector<sh_timer_s> tempList(overflowIter, mListActiveTimer.rend());
@@ -368,17 +463,7 @@ void CAmSocketHandler::timerUp()
}
/**
- * convert timespec to milliseconds
- * @param time time in timespec
- * @return time in milliseconds
- */
-inline int CAmSocketHandler::timespec2ms(const timespec & time)
-{
- return ((time.tv_nsec == -1 && time.tv_sec == -1) ? -1 : time.tv_sec * 1000 + time.tv_nsec / 1000000);
-}
-
-/**
- * correct timers
+ * correct timers and fire the ones who are up
*/
void CAmSocketHandler::timerCorrection()
{
@@ -386,28 +471,38 @@ void CAmSocketHandler::timerCorrection()
timespec currentTime, correctionTime;
clock_gettime(CLOCK_MONOTONIC, &currentTime);
correctionTime = timespecSub(currentTime, mStartTime);
+ mStartTime = currentTime;
- //subtract the correction value from all items in the list
- std::for_each(mListActiveTimer.begin(), mListActiveTimer.end(), CAmShSubstractTime(correctionTime));
+ if (!mListActiveTimer.empty())
+ {
- //find the last occurrence of zero -> timer overflowed
- std::list<sh_timer_s>::reverse_iterator overflowIter = std::find_if(mListActiveTimer.rbegin(), mListActiveTimer.rend(), CAmShCountdownUp());
+ //subtract the correction value from all items in the list
+ std::for_each(mListActiveTimer.begin(), mListActiveTimer.end(), CAmShSubstractTime(correctionTime));
- //only if a timer overflowed
- if (overflowIter != mListActiveTimer.rend())
- {
- //copy all timer that need to be called to a new list
- std::vector<sh_timer_s> tempList(overflowIter, mListActiveTimer.rend());
+ //find the last occurrence of zero -> timer overflowed
+ std::list<sh_timer_s>::reverse_iterator overflowIter = std::find_if(mListActiveTimer.rbegin(), mListActiveTimer.rend(), CAmShCountdownZero());
+
+ //only if a timer overflowed
+ if (overflowIter != mListActiveTimer.rend())
+ {
+ //copy all timers that need to be called to a new list
+ std::vector<sh_timer_s> tempList(overflowIter, mListActiveTimer.rend());
- //erase all fired timers
- std::list<sh_timer_s>::iterator it(overflowIter.base());
- mListActiveTimer.erase(mListActiveTimer.begin(), it);
+ //erase all fired timers
+ std::list<sh_timer_s>::iterator it(overflowIter.base());
+ mListActiveTimer.erase(mListActiveTimer.begin(), it);
- //call the callbacks for the timers
- std::for_each(tempList.begin(), tempList.end(), CAmShCallTimer());
+ //call the callbacks for the timers
+ std::for_each(tempList.begin(), tempList.end(), CAmShCallTimer());
+ }
}
}
+/**
+ * is used to set the pointer for the ppoll command
+ * @param buffertime
+ * @return
+ */
inline timespec* CAmSocketHandler::insertTime(timespec& buffertime)
{
if (!mListActiveTimer.empty())
@@ -421,14 +516,5 @@ inline timespec* CAmSocketHandler::insertTime(timespec& buffertime)
}
}
-/**
- * functor to easy substract from each countdown
- * @param t value to substract from
- */
-void CAmSocketHandler::CAmShSubstractTime::operator ()(sh_timer_s & t) const
-{
- t.countdown = timespecSub(t.countdown, param);
-}
-
}
diff --git a/AudioManagerDaemon/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp b/AudioManagerDaemon/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp
index 19e4772..d6aec07 100644
--- a/AudioManagerDaemon/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp
+++ b/AudioManagerDaemon/test/AmSocketHandlerTest/CAmSocketHandlerTest.cpp
@@ -68,18 +68,18 @@ void am::CAmTimerCb::timer1Callback(sh_timerHandle_t handle, void* userData)
timespec timeout;
timeout.tv_nsec = 0;
timeout.tv_sec = 1;
- mSocketHandler->restartTimer(handle,timeout);
+ mSocketHandler->updateTimer(handle,timeout);
}
void am::CAmTimerCb::timer2Callback(sh_timerHandle_t handle, void* userData)
{
(void) handle;
(void) userData;
- // std::cout << "callback2 called" << std::endl;
+ std::cout << "callback2 called" << std::endl;
timespec timeout;
timeout.tv_nsec = 011110000;
- timeout.tv_sec = 0;
- mSocketHandler->restartTimer(handle,timeout);
+ timeout.tv_sec = 1;
+ mSocketHandler->updateTimer(handle,timeout);
}
void am::CAmTimerCb::timer3Callback(sh_timerHandle_t, void* userData)
@@ -117,7 +117,6 @@ void* playWithUnixSocketServer(void* data)
TEST(CAmSocketHandlerTest,playWithTimers)
{
- gDispatchDone = 0;
CAmSocketHandler myHandler;
CAmTimerCb testCallback(&myHandler);
timespec timeoutTime, timeout2, timeout3, timeout4;
@@ -129,15 +128,11 @@ TEST(CAmSocketHandlerTest,playWithTimers)
timeout3.tv_sec = 3;
timeout4.tv_nsec = 0;
timeout4.tv_sec = 20;
- IAmShTimerCallBack* buf = &testCallback.pTimer1Callback;
- IAmShTimerCallBack* buf2 = &testCallback.pTimer2Callback;
- IAmShTimerCallBack* buf3 = &testCallback.pTimer3Callback;
- IAmShTimerCallBack* buf4 = &testCallback.pTimer4Callback;
sh_timerHandle_t handle;
- myHandler.addTimer(timeoutTime, buf, handle, NULL);
- myHandler.addTimer(timeout2, buf2, handle, NULL);
- myHandler.addTimer(timeout3, buf3, handle, NULL);
- myHandler.addTimer(timeout4, buf4, handle, NULL);
+ myHandler.addTimer(timeoutTime, &testCallback.pTimer1Callback, handle, NULL);
+ myHandler.addTimer(timeout2, &testCallback.pTimer2Callback, handle, NULL);
+ myHandler.addTimer(timeout3, &testCallback.pTimer3Callback, handle, NULL);
+ myHandler.addTimer(timeout4, &testCallback.pTimer4Callback, handle, NULL);
myHandler.start_listenting();
}
diff --git a/PluginRoutingInterfaceAsync/include/CAmRoutingSenderAsync.h b/PluginRoutingInterfaceAsync/include/CAmRoutingSenderAsync.h
index ac78eba..c0da207 100644
--- a/PluginRoutingInterfaceAsync/include/CAmRoutingSenderAsync.h
+++ b/PluginRoutingInterfaceAsync/include/CAmRoutingSenderAsync.h
@@ -22,6 +22,7 @@
#include "IAmRoutingReceiverShadow.h"
#include <semaphore.h>
#include <memory.h>
+#include <map>
namespace am
{
diff --git a/PluginRoutingInterfaceAsync/test/CAmRoutingReceiverAsync.cpp b/PluginRoutingInterfaceAsync/test/CAmRoutingReceiverAsync.cpp
index 55e706a..13c9806 100644
--- a/PluginRoutingInterfaceAsync/test/CAmRoutingReceiverAsync.cpp
+++ b/PluginRoutingInterfaceAsync/test/CAmRoutingReceiverAsync.cpp
@@ -79,13 +79,12 @@ void CAmEnvironment::SetUp()
timespec t;
t.tv_nsec = 0;
- t.tv_sec = 2;
+ t.tv_sec = 1;
sh_timerHandle_t handle;
- IAmShTimerCallBack *buf = &ptimerCallback;
//lets use a timeout so the test will finish
- pSocketHandler.addTimer(t, buf, handle, (void*) NULL);
+ pSocketHandler.addTimer(t, &ptimerCallback, handle, (void*) NULL);
pSocketHandler.start_listenting();
}
@@ -155,11 +154,8 @@ void CAmEnvironment::timerCallback(sh_timerHandle_t handle, void *userData)
{
(void) handle;
(void) userData;
+ pSocketHandler.restartTimer(handle);
pSocketHandler.stop_listening();
- timespec t;
- t.tv_nsec = 0;
- t.tv_sec = 2;
- pSocketHandler.restartTimer(handle, t);
}
void CAmRoutingReceiverAsync::TearDown()
@@ -410,7 +406,7 @@ TEST_F(CAmRoutingReceiverAsync,connectAbortTooLate)
am_sinkID_t sinkID = 1;
am_ConnectionFormat_e format = CF_GENIVI_ANALOG;
- EXPECT_CALL(pReceiveInterface,ackConnect(_,connectionID,E_OK)).Times(1);
+ EXPECT_CALL(pReceiveInterface,ackConnect(_,connectionID,E_OK)).Times(2);
ASSERT_EQ(E_OK, pRouter->asyncConnect(handle,connectionID,sourceID,sinkID,format));
sleep(3);
ASSERT_EQ(E_NON_EXISTENT, pRouter->asyncAbort(handle));
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 <dbus/dbus.h>
#include <string>
#include <list>
+#include <map>
#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 <string>
+#include <pthread.h>
#ifdef WITH_DLT
#include <dlt/dlt.h>
@@ -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<typename T> 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<typename T> void logInfo(T value)
template<typename T, typename T1> 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<typename T, typename T1> void logInfo(T value, T1 value1)
template<typename T, typename T1, typename T2> 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<typename T, typename T1, typename T2> void logInfo(T value, T1 value1,
template<typename T, typename T1, typename T2, typename T3> 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<typename T, typename T1, typename T2, typename T3> void logInfo(T value
template<typename T, typename T1, typename T2, typename T3, typename T4> 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<typename T, typename T1, typename T2, typename T3, typename T4> void lo
inst->append(value3);
inst->append(value4);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -232,7 +231,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4> void lo
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value4);
inst->append(value5);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -257,7 +256,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value5);
inst->append(value6);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -284,7 +283,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value6);
inst->append(value7);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -313,7 +312,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value7);
inst->append(value8);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -344,7 +343,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value8);
inst->append(value9);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -377,7 +376,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value9);
inst->append(value10);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -401,11 +400,11 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T> 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<typename T> void logError(T value)
template<typename T, typename T1> 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<typename T, typename T1> void logError(T value, T1 value1)
template<typename T, typename T1, typename T2> 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<typename T, typename T1, typename T2> void logError(T value, T1 value1,
template<typename T, typename T1, typename T2, typename T3> 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<typename T, typename T1, typename T2, typename T3> void logError(T valu
template<typename T, typename T1, typename T2, typename T3, typename T4> 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<typename T, typename T1, typename T2, typename T3, typename T4> void lo
inst->append(value3);
inst->append(value4);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -496,7 +495,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4> void lo
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value4);
inst->append(value5);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -521,7 +520,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value5);
inst->append(value6);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -548,7 +547,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value6);
inst->append(value7);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -577,7 +576,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value7);
inst->append(value8);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -608,7 +607,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value8);
inst->append(value9);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -641,7 +640,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8, typename T9, typename T10> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value9);
inst->append(value10);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -667,11 +666,11 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T> 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<typename T> void log(DltContext* const context, DltLogLevelType logleve
template<typename T, typename T1> 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<typename T, typename T1> void log(DltContext* const context, DltLogLeve
template<typename T, typename T1, typename T2> 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<typename T, typename T1, typename T2> void log(DltContext* const contex
template<typename T, typename T1, typename T2, typename T3> 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<typename T, typename T1, typename T2, typename T3> void log(DltContext*
template<typename T, typename T1, typename T2, typename T3, typename T4> 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<typename T, typename T1, typename T2, typename T3, typename T4> void lo
inst->append(value3);
inst->append(value4);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -772,7 +771,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4> void lo
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value4);
inst->append(value5);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -799,7 +798,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value5);
inst->append(value6);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -828,7 +827,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(value6);
inst->append(value7);
inst->send();
- pthread_mutex_unlock(&inst->logMutex);
+
}
/**
@@ -859,7 +858,7 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
template<typename T, typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8> 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 @@ template<typename T, typename T1, typename T2, typename T3, typename T4, typenam
inst->append(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 <map>
#include <signal.h>
+#include <iostream> //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; //!<this is a handle for a timer to be used with the SocketHandler
typedef uint16_t sh_pollHandle_t; //!<this is a handle for a filedescriptor to be used with the SocketHandler
@@ -42,7 +45,10 @@ class IAmShPollPrepare
{
public:
virtual void Call(const sh_pollHandle_t handle, void* userData)=0;
- virtual ~IAmShPollPrepare(){};
+ virtual ~IAmShPollPrepare()
+ {
+ }
+ ;
};
/**
@@ -52,7 +58,10 @@ class IAmShPollFired
{
public:
virtual void Call(const pollfd pollfd, const sh_pollHandle_t handle, void* userData)=0;
- virtual ~ IAmShPollFired(){};
+ virtual ~ IAmShPollFired()
+ {
+ }
+ ;
};
/**
@@ -62,7 +71,10 @@ class IAmShPollCheck
{
public:
virtual bool Call(const sh_pollHandle_t handle, void* userData)=0;
- virtual ~ IAmShPollCheck(){};
+ virtual ~ IAmShPollCheck()
+ {
+ }
+ ;
};
/**
@@ -72,7 +84,10 @@ class IAmShPollDispatch
{
public:
virtual bool Call(const sh_pollHandle_t handle, void* userData)=0;
- virtual ~ IAmShPollDispatch(){};
+ virtual ~ IAmShPollDispatch()
+ {
+ }
+ ;
};
/**
@@ -82,7 +97,10 @@ class IAmShTimerCallBack
{
public:
virtual void Call(const sh_timerHandle_t handle, void* userData)=0;
- virtual ~IAmShTimerCallBack(){};
+ virtual ~IAmShTimerCallBack()
+ {
+ }
+ ;
};
/**
@@ -99,9 +117,10 @@ public:
am_Error_e addFDPoll(const int fd, const short event, IAmShPollPrepare *prepare, IAmShPollFired *fired, IAmShPollCheck *check, IAmShPollDispatch *dispatch, void* userData, sh_pollHandle_t& handle);
am_Error_e removeFDPoll(const sh_pollHandle_t handle);
am_Error_e updateEventFlags(const sh_pollHandle_t handle, const short events);
- am_Error_e addTimer(const timespec timeouts, IAmShTimerCallBack*& callback, sh_timerHandle_t& handle, void* userData);
+ am_Error_e addTimer(const timespec timeouts, IAmShTimerCallBack* callback, sh_timerHandle_t& handle, void* userData);
am_Error_e removeTimer(const sh_timerHandle_t handle);
- am_Error_e restartTimer(const sh_timerHandle_t handle, const timespec timeouts);
+ am_Error_e restartTimer(const sh_timerHandle_t handle);
+ am_Error_e updateTimer(const sh_timerHandle_t handle, const timespec timeouts);
am_Error_e stopTimer(const sh_timerHandle_t handle);
void start_listenting();
void stop_listening();
@@ -110,30 +129,19 @@ private:
{
sh_timerHandle_t handle; //!<the handle of the timer
timespec countdown; //!<the countdown, this value is decreased every time the timer is up
- timespec timeout; //!<the original timer value
IAmShTimerCallBack* callback; //!<the callbackfunction
void * userData; //!<saves a void pointer together with the rest.
};
- typedef std::reverse_iterator<sh_timer_s> rListTimerIter;
-
- class CAmShSubstractTime //!<functor to easy substract from each countdown value
- {
- private:
- timespec param;
- public:
- CAmShSubstractTime(timespec param) :
- param(param){}
- inline void operator()(sh_timer_s& t) const;
- };
+ typedef std::reverse_iterator<sh_timer_s> rListTimerIter; //!<typedef for reverseiterator on timer lists
struct sh_poll_s //!<struct that holds information about polls
{
sh_pollHandle_t handle; //!<handle to uniquely adress a filedesriptor
- IAmShPollPrepare *prepareCB;
- IAmShPollFired *firedCB;
- IAmShPollCheck *checkCB;
- IAmShPollDispatch *dispatchCB;
+ IAmShPollPrepare *prepareCB; //!<pointer to preperation callback
+ IAmShPollFired *firedCB; //!<pointer to fired callback
+ IAmShPollCheck *checkCB; //!< pointer to check callback
+ IAmShPollDispatch *dispatchCB; //!<pointer to dispatch callback
pollfd pollfdValue; //!<the array for polling the filedescriptors
void *userData; //!<userdata saved together with the callback.
};
@@ -141,101 +149,18 @@ private:
typedef std::vector<pollfd> mListPollfd_t; //!<vector of filedescriptors
typedef std::vector<sh_poll_s> mListPoll_t; //!<list for the callbacks
- class CAmShCopyPollfd
- {
- 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 CAmShMatchingFd
- {
- private:
- int mFD, mEventFlag;
- public:
- CAmShMatchingFd(int fd, int eventFlag) :
- mFD(fd), //
- mEventFlag(eventFlag)
- { }
- bool operator()(const sh_poll_s& a)
- {
- return (((a.pollfdValue.fd == mFD) && (a.pollfdValue.events == mEventFlag)) ? true : false);
- }
- };
-
- class CAmShCallFire
- {
- public:
- CAmShCallFire(){};
- void operator()(sh_poll_s& row)
- {
- row.firedCB->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 //!<functor to call a timer
+ {
+ public:
+ CAmShCallTimer()
+ {
+ }
+ ;
+ void operator()(sh_timer_s& row)
+ {
+ row.callback->Call(row.handle, row.userData);
+ }
+ };
+
+ class CAmShCountdownUp //!<functor that checks if a timer is up
+ {
+ private:
+ timespec mDiffTime;
+ public:
+ CAmShCountdownUp(const timespec& differenceTime) :
+ mDiffTime(differenceTime)
+ {
+ }
+ ;
+ bool operator()(const sh_timer_s& row)
+ {
+ timespec sub = timespecSub(row.countdown, mDiffTime);
+ if (sub.tv_nsec == 0 && sub.tv_sec == 0)
+ return (true);
+ return (false);
+ }
+ };
+
+ class CAmShCountdownZero //!<functor that checks if a timer is zero
+ {
+ public:
+ CAmShCountdownZero()
+ {
+ }
+ ;
+ bool operator()(const sh_timer_s& row)
+ {
+ if (row.countdown.tv_nsec == 0 && row.countdown.tv_sec == 0)
+ return (true);
+ return (false);
+ }
+ };
+
+ class CAmShSubstractTime //!<functor to easy substract from each countdown value
+ {
+ private:
+ timespec param;
+ public:
+ CAmShSubstractTime(timespec param) :
+ param(param)
+ {
+ }
+ inline void operator()(sh_timer_s& t)
+ {
+ t.countdown = timespecSub(t.countdown, param);
+ }
+ };
+
+ mListPollfd_t mfdPollingArray; //!<the polling array for ppoll
+ mListPoll_t mListPoll; //!<list that holds all information for the ppoll
std::list<sh_timer_s> mListTimer; //!<list of all timers
std::list<sh_timer_s> mListActiveTimer; //!<list of all currently active timers
- sh_timerHandle_t mLastInsertedHandle;
- sh_pollHandle_t mLastInsertedPollHandle;
- bool mRecreatePollfds;
- timespec mStartTime;
+ sh_timerHandle_t mLastInsertedHandle; //!<keeps track of the last inserted timer handle
+ sh_pollHandle_t mLastInsertedPollHandle; //!<keeps track of the last inserted poll handle
+ bool mRecreatePollfds; //!<when this is true, the poll list needs to be recreated
+ timespec mStartTime; //!<here the actual time is saved for timecorrection
+
+// void debugPrintTimerList ()
+// {
+// std::list<sh_timer_s>::iterator it(mListActiveTimer.begin());
+// for(;it!=mListActiveTimer.end();++it)
+// {
+// std::cout<< "Handle " << it->handle << "sec " << it->countdown.tv_sec << "nsec " << it->countdown.tv_nsec<<std::endl;
+// }
+// }
}
;
@@ -346,7 +413,10 @@ private:
public:
TAmShTimerCallBack(TClass* instance, void (TClass::*function)(sh_timerHandle_t handle, void* userData)) :
mInstance(instance), //
- mFunction(function){};
+ mFunction(function)
+ {
+ }
+ ;
virtual void Call(sh_timerHandle_t handle, void* userData)
{
@@ -366,15 +436,19 @@ private:
public:
TAmShPollPrepare(TClass* instance, void (TClass::*function)(const sh_timerHandle_t handle, void* userData)) :
mInstance(instance), //
- mFunction(function){};
+ mFunction(function)
+ {
+ }
+ ;
virtual void Call(const sh_timerHandle_t handle, void* userData)
{
(*mInstance.*mFunction)(handle, userData);
- };
+ }
+ ;
};
-/**
+/**make private, not public
* template for a callback
*/
template<class TClass> 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_ */