Chromium Code Reviews| Index: remoting/client/plugin/chromoting_instance.cc |
| diff --git a/remoting/client/plugin/chromoting_instance.cc b/remoting/client/plugin/chromoting_instance.cc |
| index fec261e1798b874631f86002ad74df10a2ab56fc..75953c3372557fb77d206917cbb0f9f760f02104 100644 |
| --- a/remoting/client/plugin/chromoting_instance.cc |
| +++ b/remoting/client/plugin/chromoting_instance.cc |
| @@ -97,7 +97,8 @@ std::string ConnectionErrorToString(ChromotingInstance::ConnectionError error) { |
| // while sending the log message to the UI. |
| static bool g_logging_to_plugin = false; |
| static bool g_has_logging_instance = false; |
| -static ChromotingInstance* g_logging_instance = NULL; |
| +static scoped_refptr<base::MessageLoopProxy> g_logging_message_loop; |
|
Sergey Ulanov
2012/05/29 18:58:30
This adds a static finalizer. Use CR_DEFINE_STATIC
Sergey Ulanov
2012/05/29 18:58:30
SingleThreadTaskRunner please.
Wez
2012/05/30 00:18:39
Done.
Wez
2012/05/30 00:18:39
Done.
|
| +static base::WeakPtr<ChromotingInstance> g_logging_instance; |
|
Sergey Ulanov
2012/05/29 18:58:30
This adds a static finalizer. Use CR_DEFINE_STATIC
Wez
2012/05/30 00:18:39
Done.
|
| static logging::LogMessageHandlerFunction g_logging_old_handler = NULL; |
| static base::LazyInstance<base::Lock>::Leaky |
| @@ -139,7 +140,7 @@ ChromotingInstance::ChromotingInstance(PP_Instance pp_instance) |
| plugin_message_loop_( |
| new PluginMessageLoopProxy(&plugin_thread_delegate_)), |
| context_(plugin_message_loop_), |
| - thread_proxy_(new ScopedThreadProxy(plugin_message_loop_)) { |
| + weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
| RequestInputEvents(PP_INPUTEVENT_CLASS_MOUSE | PP_INPUTEVENT_CLASS_WHEEL); |
| RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); |
| @@ -159,7 +160,7 @@ ChromotingInstance::~ChromotingInstance() { |
| // Detach the log proxy so we don't log anything else to the UI. |
| // This needs to be done before the instance is unregistered for logging. |
| - thread_proxy_->Detach(); |
| + //thread_proxy_->Detach(); |
| // Unregister this instance so that debug log messages will no longer be sent |
| // to it. This will stop all logging in all Chromoting instances. |
| @@ -175,10 +176,7 @@ ChromotingInstance::~ChromotingInstance() { |
| // Stopping the context shuts down all chromoting threads. |
| context_.Stop(); |
| - // Delete |thread_proxy_| before we detach |plugin_message_loop_|, |
| - // otherwise ScopedThreadProxy may DCHECK when being destroyed. |
| - thread_proxy_.reset(); |
| - |
| + // Ensure that nothing touches the plugin thread delegate after this point. |
| plugin_message_loop_->Detach(); |
| } |
| @@ -614,7 +612,8 @@ void ChromotingInstance::RegisterLoggingInstance() { |
| // and display them to the user. |
| // If multiple plugins are run, then the last one registered will handle all |
| // logging for all instances. |
| - g_logging_instance = this; |
| + g_logging_instance = weak_factory_.GetWeakPtr(); |
| + g_logging_message_loop = plugin_message_loop_; |
| g_has_logging_instance = true; |
| } |
| @@ -622,12 +621,13 @@ void ChromotingInstance::UnregisterLoggingInstance() { |
| base::AutoLock lock(g_logging_lock.Get()); |
| // Don't unregister unless we're the currently registered instance. |
| - if (this != g_logging_instance) |
| + if (this != g_logging_instance.get()) |
| return; |
| // Unregister this instance for logging. |
| g_has_logging_instance = false; |
| - g_logging_instance = NULL; |
| + g_logging_instance.reset(); |
| + g_logging_message_loop = NULL; |
| VLOG(1) << "Unregistering global log handler"; |
| } |
| @@ -652,21 +652,20 @@ bool ChromotingInstance::LogToUI(int severity, const char* file, int line, |
| // Do not LOG anything while holding this lock or else the code will |
| // deadlock while trying to re-get the lock we're already in. |
| base::AutoLock lock(g_logging_lock.Get()); |
| - if (g_logging_instance && |
| + if (g_logging_message_loop.get() && |
| // If |g_logging_to_plugin| is set and we're on the logging thread, then |
| // this LOG message came from handling a previous LOG message and we |
| // should skip it to avoid an infinite loop of LOG messages. |
| // We don't have a lock around |g_in_processtoui|, but that's OK since |
| // the value is only read/written on the logging thread. |
| - (!g_logging_instance->plugin_message_loop_->BelongsToCurrentThread() || |
| + (!g_logging_message_loop->BelongsToCurrentThread() || |
|
Sergey Ulanov
2012/05/29 18:58:30
Races are still possible in this code. The logging
Wez
2012/05/30 00:18:39
There is already a lock held at this point (g_logg
|
| !g_logging_to_plugin)) { |
| std::string message = remoting::GetTimestampString(); |
| message += (str.c_str() + message_start); |
| - // |thread_proxy_| is safe to use here because we detach it before |
| - // tearing down the |g_logging_instance|. |
| - g_logging_instance->thread_proxy_->PostTask( |
| + |
| + g_logging_message_loop->PostTask( |
| FROM_HERE, base::Bind(&ChromotingInstance::ProcessLogToUI, |
| - base::Unretained(g_logging_instance), message)); |
| + g_logging_instance, message)); |
| } |
| } |