Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Unified Diff: remoting/client/plugin/chromoting_instance.cc

Issue 10454040: Replace ScopedThreadProxy with MessageLoopProxy & WeakPtrs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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));
}
}

Powered by Google App Engine
This is Rietveld 408576698