Index: remoting/host/plugin/host_plugin.cc |
diff --git a/remoting/host/plugin/host_plugin.cc b/remoting/host/plugin/host_plugin.cc |
index 077637276f1768d00f579542df08f0139839ba7f..4c88551b24f8deedce13923440991f5c27a8789d 100644 |
--- a/remoting/host/plugin/host_plugin.cc |
+++ b/remoting/host/plugin/host_plugin.cc |
@@ -13,6 +13,7 @@ |
#include "base/logging.h" |
#include "base/stringize_macros.h" |
#include "remoting/base/plugin_message_loop_proxy.h" |
+#include "remoting/host/plugin/host_log_handler.h" |
#include "remoting/host/plugin/host_plugin_utils.h" |
#include "remoting/host/plugin/host_script_object.h" |
#include "third_party/npapi/bindings/npapi.h" |
@@ -43,6 +44,7 @@ uint64_t __cdecl __udivdi3(uint64_t a, uint64_t b) { |
#endif |
using remoting::g_npnetscape_funcs; |
+using remoting::HostLogHandler; |
using remoting::HostNPScriptObject; |
using remoting::StringFromNPIdentifier; |
@@ -352,6 +354,12 @@ NPError CreatePlugin(NPMIMEType pluginType, |
char** argv, |
NPSavedData* saved) { |
VLOG(2) << "CreatePlugin"; |
+ |
+ // Register a global log handler. |
+ // The LogMessage registration code is not thread-safe, so we need to perform |
+ // this while we're running in a single thread. |
+ HostLogHandler::RegisterLogMessageHandler(); |
+ |
HostNPPlugin* plugin = new HostNPPlugin(instance, mode); |
instance->pdata = plugin; |
if (!plugin->Init(argc, argn, argv, saved)) { |
@@ -366,6 +374,14 @@ NPError CreatePlugin(NPMIMEType pluginType, |
NPError DestroyPlugin(NPP instance, |
NPSavedData** save) { |
VLOG(2) << "DestroyPlugin"; |
+ |
+ // Normally, we would unregister the global log handler that we registered |
+ // in CreatePlugin. However, the LogHandler registration code is not thread- |
+ // safe so we could crash if we update (register or unregister) the |
+ // LogHandler while it's being read on another thread. |
+ // At this point, all our threads should be shutdown, but it's safer to leave |
+ // the handler registered until we're completely destroyed. |
+ |
HostNPPlugin* plugin = PluginFromInstance(instance); |
if (plugin) { |
plugin->Save(save); |