From 104255615d643a2278d8430a876413793563ab36 Mon Sep 17 00:00:00 2001 From: christian linke Date: Thu, 29 Nov 2012 16:00:05 +0100 Subject: * make AudioManager rundown cleaner. Now an extra created pipe is used to trigger the mainloop one last time before the AudioManager exits. Signed-off-by: christian linke --- AudioManagerDaemon/src/CAmCommandSender.cpp | 2 +- AudioManagerDaemon/src/CAmControlReceiver.cpp | 7 +--- AudioManagerDaemon/src/CAmControlSender.cpp | 4 +- AudioManagerDaemon/src/CAmRoutingSender.cpp | 2 +- AudioManagerDaemon/src/CAmSocketHandler.cpp | 37 +++++++++++++++++- AudioManagerDaemon/src/main.cpp | 8 +++- include/shared/CAmSocketHandler.h | 56 +++++++++++++++++++++++++++ 7 files changed, 103 insertions(+), 13 deletions(-) diff --git a/AudioManagerDaemon/src/CAmCommandSender.cpp b/AudioManagerDaemon/src/CAmCommandSender.cpp index 87f9005..1494bc1 100644 --- a/AudioManagerDaemon/src/CAmCommandSender.cpp +++ b/AudioManagerDaemon/src/CAmCommandSender.cpp @@ -133,7 +133,7 @@ CAmCommandSender::CAmCommandSender(const std::vector& listOfPluginD CAmCommandSender::~CAmCommandSender() { - unloadLibraries(); + //unloadLibraries(); } am_Error_e CAmCommandSender::startupInterfaces(CAmCommandReceiver *iCommandReceiver) diff --git a/AudioManagerDaemon/src/CAmControlReceiver.cpp b/AudioManagerDaemon/src/CAmControlReceiver.cpp index 2ee225a..f78a0f3 100644 --- a/AudioManagerDaemon/src/CAmControlReceiver.cpp +++ b/AudioManagerDaemon/src/CAmControlReceiver.cpp @@ -483,12 +483,7 @@ void CAmControlReceiver::confirmControllerReady() void CAmControlReceiver::confirmControllerRundown() { - logInfo ("CAmControlReceiver::confirmControllerRundown(), exiting regularly"); - //once the controller is ready, it will exit. - CAmDltWrapper* inst(getWrapper()); - inst->deinit(); - exit (0); - //todo: one time implement here system interaction with NSM + logInfo ("CAmControlReceiver::confirmControllerRundown(), will exit now"); } am_Error_e CAmControlReceiver::getSocketHandler(CAmSocketHandler *& socketHandler) diff --git a/AudioManagerDaemon/src/CAmControlSender.cpp b/AudioManagerDaemon/src/CAmControlSender.cpp index 82446ce..569e4c4 100644 --- a/AudioManagerDaemon/src/CAmControlSender.cpp +++ b/AudioManagerDaemon/src/CAmControlSender.cpp @@ -74,8 +74,8 @@ CAmControlSender::CAmControlSender(std::string controlPluginFile) : CAmControlSender::~CAmControlSender() { - if (mlibHandle) - dlclose(mlibHandle); + //if (mlibHandle) + // dlclose(mlibHandle); } am_Error_e CAmControlSender::hookUserConnectionRequest(const am_sourceID_t sourceID, const am_sinkID_t sinkID, am_mainConnectionID_t & mainConnectionID) diff --git a/AudioManagerDaemon/src/CAmRoutingSender.cpp b/AudioManagerDaemon/src/CAmRoutingSender.cpp index ea9e00a..05078a9 100644 --- a/AudioManagerDaemon/src/CAmRoutingSender.cpp +++ b/AudioManagerDaemon/src/CAmRoutingSender.cpp @@ -143,7 +143,7 @@ CAmRoutingSender::CAmRoutingSender(const std::vector& listOfPluginD CAmRoutingSender::~CAmRoutingSender() { - unloadLibraries(); + //unloadLibraries(); HandlesMap::iterator it = mlistActiveHandles.begin(); //clean up heap if existent diff --git a/AudioManagerDaemon/src/CAmSocketHandler.cpp b/AudioManagerDaemon/src/CAmSocketHandler.cpp index 9bef60e..f7c4ace 100644 --- a/AudioManagerDaemon/src/CAmSocketHandler.cpp +++ b/AudioManagerDaemon/src/CAmSocketHandler.cpp @@ -34,16 +34,33 @@ namespace am { +CAmSocketHandler* CAmSocketHandler::mInstance=NULL; + CAmSocketHandler::CAmSocketHandler() : + mPipe(), mListPoll(), // mListTimer(), // mListActiveTimer(), // mLastInsertedHandle(0), // mLastInsertedPollHandle(0), // mRecreatePollfds(true), // - mStartTime() + mStartTime(), // + receiverCallbackT(this, &CAmSocketHandler::receiverCallback),// + checkerCallbackT(this, &CAmSocketHandler::checkerCallback)// { gDispatchDone = 1; + mInstance=this; + + if (pipe(mPipe) == -1) + { + logError("CAmSerializer could not create pipe!"); + } + + //add the pipe to the poll - nothing needs to be proccessed here we just need the pipe to trigger the ppoll + short event = 0; + sh_pollHandle_t handle; + event |= POLLIN; + addFDPoll(mPipe[0], event, NULL, &receiverCallbackT, &checkerCallbackT, NULL, NULL, handle); } CAmSocketHandler::~CAmSocketHandler() @@ -500,6 +517,24 @@ void CAmSocketHandler::timerCorrection() } } +void CAmSocketHandler::exit_mainloop() +{ + //end the while loop + stop_listening(); + + //fire the ending filedescriptor + int p(1); + write(mPipe[1], &p, sizeof(p)); +} + +void CAmSocketHandler::static_exit_mainloop() +{ + if (mInstance!=0) + { + mInstance->exit_mainloop(); + } +} + /** * is used to set the pointer for the ppoll command * @param buffertime diff --git a/AudioManagerDaemon/src/main.cpp b/AudioManagerDaemon/src/main.cpp index 3d552f5..6b84ba3 100755 --- a/AudioManagerDaemon/src/main.cpp +++ b/AudioManagerDaemon/src/main.cpp @@ -265,10 +265,15 @@ static void signalHandler(int sig, siginfo_t *siginfo, void *context) (void) siginfo; (void) context; logInfo("signal handler was called, signal",sig); - gDispatchDone = 1; //todo: maually fire the mainloop CAmControlSender::CallsetControllerRundown(); + //deinit the DLT + CAmDltWrapper* inst(getWrapper()); + inst->deinit(); + + CAmSocketHandler::static_exit_mainloop(); + } void mainProgram() @@ -377,7 +382,6 @@ int main(int argc, char *argv[], char** envp) exit(EXIT_FAILURE); } - close(fd0); close(fd1); close(fd2); diff --git a/include/shared/CAmSocketHandler.h b/include/shared/CAmSocketHandler.h index 990ef0f..1c3383d 100644 --- a/include/shared/CAmSocketHandler.h +++ b/include/shared/CAmSocketHandler.h @@ -111,6 +111,40 @@ public: class CAmSocketHandler { public: + template class TAmShPollFired: public IAmShPollFired + { + private: + TClass* mInstance; + void (TClass::*mFunction)(const pollfd pollfd, const sh_pollHandle_t handle, void* userData); + + public: + TAmShPollFired(TClass* instance, void (TClass::*function)(const pollfd pollfd, const sh_pollHandle_t handle, void* userData)) : + mInstance(instance), // + mFunction(function) {}; + + virtual void Call(const pollfd pollfd, const sh_pollHandle_t handle, void* userData) + { + (*mInstance.*mFunction)(pollfd, handle, userData); + }; + }; + + template class TAmShPollCheck: public IAmShPollCheck + { + private: + TClass* mInstance; + bool (TClass::*mFunction)(const sh_pollHandle_t handle, void* userData); + + public: + TAmShPollCheck(TClass* instance, bool (TClass::*function)(const sh_pollHandle_t handle, void* userData)) : + mInstance(instance), // + mFunction(function) {}; + + virtual bool Call(const sh_pollHandle_t handle, void* userData) + { + return ((*mInstance.*mFunction)(handle, userData)); + }; + }; + CAmSocketHandler(); ~CAmSocketHandler(); @@ -124,7 +158,29 @@ public: am_Error_e stopTimer(const sh_timerHandle_t handle); void start_listenting(); void stop_listening(); + void exit_mainloop(); + static void static_exit_mainloop(); + void receiverCallback(const pollfd pollfd, const sh_pollHandle_t handle, void* userData) + { + (void) pollfd; + (void) handle; + (void) userData; + }; + bool checkerCallback(const sh_pollHandle_t handle, void* userData) + { + (void) handle; + (void) userData; + return (false); + }; + + TAmShPollFired receiverCallbackT; + TAmShPollCheck checkerCallbackT; + private: + + static CAmSocketHandler* mInstance; + int mPipe[2]; + struct sh_timer_s //!