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 ++++-- 6 files changed, 47 insertions(+), 13 deletions(-) (limited to 'AudioManagerDaemon/src') 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); -- cgit v1.2.1