diff options
author | Peter Hatina <phatina@redhat.com> | 2012-03-08 10:03:26 +0100 |
---|---|---|
committer | Peter Hatina <phatina@redhat.com> | 2012-03-08 10:35:25 +0100 |
commit | 3dba6b2035e1082472062e575104d9fe2ea86d78 (patch) | |
tree | 9b801e10abcfa778bfecf22f9a8345e1d7be0242 | |
parent | a149653a803d9d2034390e5ed5401067400dc61f (diff) |
Drop sigchld handler
-rw-r--r-- | SpiceXPI/src/plugin/plugin.cpp | 61 | ||||
-rw-r--r-- | SpiceXPI/src/plugin/plugin.h | 4 |
2 files changed, 31 insertions, 34 deletions
diff --git a/SpiceXPI/src/plugin/plugin.cpp b/SpiceXPI/src/plugin/plugin.cpp index e53639e..39f2e81 100644 --- a/SpiceXPI/src/plugin/plugin.cpp +++ b/SpiceXPI/src/plugin/plugin.cpp @@ -57,6 +57,11 @@ #include <signal.h> #include <glib.h> +extern "C" { +#include <pthread.h> +#include <signal.h> +} + #include "nsCOMPtr.h" // for plugins @@ -177,10 +182,9 @@ void NS_DestroyPluginInstance(nsPluginInstanceBase *aPlugin) // nsPluginInstance class implementation // -std::map<pid_t, nsPluginInstance *> nsPluginInstance::s_children; - nsPluginInstance::nsPluginInstance(NPP aInstance): nsPluginInstanceBase(), + m_pid_controller(-1), m_instance(aInstance), m_initialized(PR_FALSE), m_scriptable_peer(NULL) @@ -195,11 +199,6 @@ nsPluginInstance::nsPluginInstance(NPP aInstance): m_tmp_dir = mkdtemp(tmp_dir); m_connected_status = -2; - - struct sigaction chld; - chld.sa_sigaction = SigchldRoutine; - chld.sa_flags = SA_NOCLDSTOP | SA_RESTART | SA_SIGINFO; - sigaction(SIGCHLD, &chld, NULL); } nsPluginInstance::~nsPluginInstance() @@ -567,9 +566,8 @@ void nsPluginInstance::Connect() return; } - pid_t child = fork(); - g_debug("child pid: %"G_GUINT64_FORMAT, (guint64)child); - if (child == 0) + m_pid_controller = fork(); + if (m_pid_controller == 0) { close(pipe_fds[1]); pipe_fds[1] = -1; @@ -592,10 +590,14 @@ void nsPluginInstance::Connect() } else { + g_debug("child pid: %"G_GUINT64_FORMAT, (guint64)m_pid_controller); + close(pipe_fds[0]); pipe_fds[0] = -1; - s_children[child] = this; + pthread_t controller_thread_id; + pthread_create(&controller_thread_id, NULL, ControllerWaitHelper, + reinterpret_cast<void*>(this)); close(pipe_fds[1]); pipe_fds[1] = -1; @@ -687,15 +689,7 @@ void nsPluginInstance::Show() void nsPluginInstance::Disconnect() { - for (std::map<pid_t, nsPluginInstance *>::iterator it = s_children.begin(); - it != s_children.end(); ++it) - { - if (it->second == this) - { - kill(it->first, SIGTERM); - break; - } - } + kill(m_pid_controller, SIGTERM); } void nsPluginInstance::ConnectedStatus(PRInt32 *retval) @@ -768,24 +762,27 @@ void nsPluginInstance::CallOnDisconnected(int code) NPN_ReleaseVariantValue(&var_on_disconnected); } -void nsPluginInstance::SigchldRoutine(int sig, siginfo_t *info, void *uap) +void *nsPluginInstance::ControllerWaitHelper(void *opaque) { - g_debug("child finished, pid: %"G_GUINT64_FORMAT, (guint64)info->si_pid); - int exit_code; - waitpid(info->si_pid, &exit_code, 0); + nsPluginInstance *fake_this = reinterpret_cast<nsPluginInstance *>(opaque); + if (!fake_this) + return NULL; - if (!getenv("SPICE_XPI_DEBUG")) { - nsPluginInstance *fake_this = s_children[info->si_pid]; - if (fake_this == NULL) { - g_critical("Invalid children signal"); - return; - } + int exit_code; + waitpid(fake_this->m_pid_controller, &exit_code, 0); + g_debug("child finished, pid: %"G_GUINT64_FORMAT, (guint64)exit_code); + fake_this->m_connected_status = fake_this->m_external_controller.TranslateRC(exit_code); + if (!getenv("SPICE_XPI_DEBUG")) + { fake_this->CallOnDisconnected(exit_code); fake_this->m_external_controller.Disconnect(); } - - s_children.erase(info->si_pid); + + unlink(fake_this->m_trust_store_file.c_str()); + fake_this->m_trust_store_file.clear(); + fake_this->m_pid_controller = -1; + return NULL; } // ============================== diff --git a/SpiceXPI/src/plugin/plugin.h b/SpiceXPI/src/plugin/plugin.h index c6f77ef..8481120 100644 --- a/SpiceXPI/src/plugin/plugin.h +++ b/SpiceXPI/src/plugin/plugin.h @@ -163,7 +163,7 @@ public: NPObject *GetScriptablePeer(); private: - static void SigchldRoutine(int sig, siginfo_t *info, void *uap); + static void *ControllerWaitHelper(void *opaque); void WriteToPipe(const void *data, uint32_t size); void SendInit(); void SendMsg(uint32_t id); @@ -174,7 +174,7 @@ private: void CallOnDisconnected(int code); private: - static std::map<pid_t, nsPluginInstance *> s_children; + pid_t m_pid_controller; PRInt32 m_connected_status; SpiceController m_external_controller; |