summaryrefslogtreecommitdiffstats
path: root/remoting/host/desktop_environment.cc
diff options
context:
space:
mode:
Diffstat (limited to 'remoting/host/desktop_environment.cc')
-rw-r--r--remoting/host/desktop_environment.cc48
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.