summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AudioManagerDaemon/src/CAmCommandSender.cpp2
-rw-r--r--AudioManagerDaemon/src/CAmControlReceiver.cpp7
-rw-r--r--AudioManagerDaemon/src/CAmControlSender.cpp4
-rw-r--r--AudioManagerDaemon/src/CAmRoutingSender.cpp2
-rw-r--r--AudioManagerDaemon/src/CAmSocketHandler.cpp37
-rwxr-xr-xAudioManagerDaemon/src/main.cpp8
-rw-r--r--include/shared/CAmSocketHandler.h56
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<std::string>& 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<std::string>& 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 TClass> 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 TClass> 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<CAmSocketHandler> receiverCallbackT;
+ TAmShPollCheck<CAmSocketHandler> checkerCallbackT;
+
private:
+
+ static CAmSocketHandler* mInstance;
+ int mPipe[2];
+
struct sh_timer_s //!<struct that holds information of timers
{
sh_timerHandle_t handle; //!<the handle of the timer