diff options
Diffstat (limited to 'remoting/host/desktop_environment.cc')
-rw-r--r-- | remoting/host/desktop_environment.cc | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/remoting/host/desktop_environment.cc b/remoting/host/desktop_environment.cc index 8377ac7..bdc7ded 100644 --- a/remoting/host/desktop_environment.cc +++ b/remoting/host/desktop_environment.cc @@ -23,21 +23,30 @@ namespace remoting { // thread. This is neccessary so that DesktopEnvironment can be // deleted synchronously even while there are pending tasks on the // message queue. +// +// TODO(sergeyu): Merge this code with remoting::TaskThreadProxy. The +// problem solved by this class is very simular to the one solved by +// ScopedRunnableMethodFactory. The main difference is that this class +// is thread-safe. Change the interface to make it look more like +// ScopedRunnableMethodFactory and rename it to avoid confusion with +// MessageLoopProxy. class UIThreadProxy : public base::RefCountedThreadSafe<UIThreadProxy> { public: - UIThreadProxy(ChromotingHostContext* context) - : context_(context) { + UIThreadProxy(base::MessageLoopProxy* message_loop) + : message_loop_(message_loop) { } + // TODO(sergeyu): Rename this method. void Detach() { - DCHECK(context_->IsUIThread()); - context_ = NULL; + DCHECK(message_loop_->BelongsToCurrentThread()); + message_loop_ = NULL; } void CallOnUIThread(const tracked_objects::Location& from_here, const base::Closure& closure) { - if (context_) { - context_->PostTaskToUIThread(from_here, base::Bind( + scoped_refptr<base::MessageLoopProxy> message_loop = message_loop_; + if (message_loop) { + message_loop->PostTask(from_here, base::Bind( &UIThreadProxy::CallClosure, this, closure)); } } @@ -45,8 +54,9 @@ class UIThreadProxy : public base::RefCountedThreadSafe<UIThreadProxy> { void CallOnUIThreadDelayed(const tracked_objects::Location& from_here, const base::Closure& closure, int delay_ms) { - if (context_) { - context_->PostDelayedTaskToUIThread(from_here, base::Bind( + scoped_refptr<base::MessageLoopProxy> message_loop = message_loop_; + if (message_loop) { + message_loop->PostDelayedTask(from_here, base::Bind( &UIThreadProxy::CallClosure, this, closure), delay_ms); } } @@ -57,11 +67,11 @@ class UIThreadProxy : public base::RefCountedThreadSafe<UIThreadProxy> { virtual ~UIThreadProxy() { } void CallClosure(const base::Closure& closure) { - if (context_) + if (message_loop_) closure.Run(); } - ChromotingHostContext* context_; + scoped_refptr<base::MessageLoopProxy> message_loop_; DISALLOW_COPY_AND_ASSIGN(UIThreadProxy); }; @@ -98,14 +108,14 @@ DesktopEnvironment::DesktopEnvironment(ChromotingHostContext* context, local_input_monitor_(local_input_monitor), is_monitoring_local_inputs_(false), continue_timer_started_(false), - proxy_(new UIThreadProxy(context)) { + proxy_(new UIThreadProxy(context->ui_message_loop())) { } DesktopEnvironment::~DesktopEnvironment() { } void DesktopEnvironment::Shutdown() { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); MonitorLocalInputs(false); ShowDisconnectWindow(false, std::string()); @@ -131,7 +141,7 @@ void DesktopEnvironment::OnPause(bool pause) { } void DesktopEnvironment::ProcessOnConnect(const std::string& username) { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); MonitorLocalInputs(true); ShowDisconnectWindow(true, username); @@ -139,7 +149,7 @@ void DesktopEnvironment::ProcessOnConnect(const std::string& username) { } void DesktopEnvironment::ProcessOnLastDisconnect() { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); MonitorLocalInputs(false); ShowDisconnectWindow(false, std::string()); @@ -152,7 +162,7 @@ void DesktopEnvironment::ProcessOnPause(bool pause) { } void DesktopEnvironment::MonitorLocalInputs(bool enable) { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); if (enable == is_monitoring_local_inputs_) return; @@ -166,7 +176,7 @@ void DesktopEnvironment::MonitorLocalInputs(bool enable) { void DesktopEnvironment::ShowDisconnectWindow(bool show, const std::string& username) { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); if (show) { disconnect_window_->Show(host_, username); @@ -176,7 +186,7 @@ void DesktopEnvironment::ShowDisconnectWindow(bool show, } void DesktopEnvironment::ShowContinueWindow(bool show) { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); if (show) { continue_window_->Show(host_); @@ -186,7 +196,7 @@ void DesktopEnvironment::ShowContinueWindow(bool show) { } void DesktopEnvironment::StartContinueWindowTimer(bool start) { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); if (start && !continue_timer_started_) { continue_timer_target_time_ = base::Time::Now() + @@ -201,7 +211,7 @@ void DesktopEnvironment::StartContinueWindowTimer(bool start) { } void DesktopEnvironment::ContinueWindowTimerFunc() { - DCHECK(context_->IsUIThread()); + DCHECK(context_->ui_message_loop()->BelongsToCurrentThread()); // This function may be called prematurely if timer was stopped and // then started again. In that case we just ignore this call. |