summaryrefslogtreecommitdiffstats
path: root/remoting
diff options
context:
space:
mode:
authorsergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-01 23:19:56 +0000
committersergeyu@chromium.org <sergeyu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-01 23:19:56 +0000
commitb76b5230077ff86ea1c4e6bf5a9c10b54a6d3b21 (patch)
treeb0918e201cac24284b093a9e05a4fc4442c5761d /remoting
parente3ec1f486d7d8bb02bbe0aee915ab3e6ff90a367 (diff)
downloadchromium_src-b76b5230077ff86ea1c4e6bf5a9c10b54a6d3b21.zip
chromium_src-b76b5230077ff86ea1c4e6bf5a9c10b54a6d3b21.tar.gz
chromium_src-b76b5230077ff86ea1c4e6bf5a9c10b54a6d3b21.tar.bz2
Make JingleThreadMessageLoop usable without JingleThread.
BUG=None TEST=Unittests Review URL: http://codereview.chromium.org/7302002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@91388 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'remoting')
-rw-r--r--remoting/jingle_glue/jingle_thread.cc74
-rw-r--r--remoting/jingle_glue/jingle_thread.h14
2 files changed, 49 insertions, 39 deletions
diff --git a/remoting/jingle_glue/jingle_thread.cc b/remoting/jingle_glue/jingle_thread.cc
index 9dc3915..2f3ba00 100644
--- a/remoting/jingle_glue/jingle_thread.cc
+++ b/remoting/jingle_glue/jingle_thread.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -15,16 +15,33 @@ namespace remoting {
const uint32 kRunTasksMessageId = 1;
const uint32 kStopMessageId = 2;
-class JingleThread::JingleMessagePump : public base::MessagePump,
- public talk_base::MessageHandler {
+namespace {
+
+class JingleMessagePump : public base::MessagePump,
+ public talk_base::MessageHandler {
public:
- JingleMessagePump(JingleThread* thread) : thread_(thread) { }
+ JingleMessagePump(talk_base::Thread* thread)
+ : thread_(thread), delegate_(NULL) {
+ }
+
+ virtual void Run(Delegate* delegate) {
+ delegate_ = delegate;
+
+ talk_base::Thread::Current()->Thread::Run();
+ // Call Restart() so that we can run again.
+ talk_base::Thread::Current()->Restart();
+
+ delegate_ = NULL;
+ }
+
+ virtual void Quit() {
+ talk_base::Thread::Current()->Quit();
+ }
- virtual void Run(Delegate* delegate) { NOTIMPLEMENTED(); }
- virtual void Quit() { NOTIMPLEMENTED(); }
virtual void ScheduleWork() {
thread_->Post(this, kRunTasksMessageId);
}
+
virtual void ScheduleDelayedWork(const base::TimeTicks& time) {
delayed_work_time_ = time;
ScheduleNextDelayedTask();
@@ -32,21 +49,19 @@ class JingleThread::JingleMessagePump : public base::MessagePump,
void OnMessage(talk_base::Message* msg) {
DCHECK(msg->message_id == kRunTasksMessageId);
+ DCHECK(delegate_);
// Clear currently pending messages in case there were delayed tasks.
// Will schedule it again from ScheduleNextDelayedTask() if neccessary.
thread_->Clear(this, kRunTasksMessageId);
- // This code is executed whenever we get new message in |message_loop_|.
- // JingleMessagePump posts new tasks in the jingle thread.
- // TODO(sergeyu): Remove it when JingleThread moved on Chromium's
- // base::Thread.
- base::MessagePump::Delegate* delegate = thread_->message_loop();
// Process all pending tasks.
while (true) {
- if (delegate->DoWork())
+ if (delegate_->DoWork())
continue;
- if (delegate->DoDelayedWork(&delayed_work_time_))
+ if (delegate_->DoDelayedWork(&delayed_work_time_))
+ continue;
+ if (delegate_->DoIdleWork())
continue;
break;
}
@@ -56,8 +71,6 @@ class JingleThread::JingleMessagePump : public base::MessagePump,
private:
void ScheduleNextDelayedTask() {
- DCHECK_EQ(thread_->message_loop(), MessageLoop::current());
-
if (!delayed_work_time_.is_null()) {
base::TimeTicks now = base::TimeTicks::Now();
int delay = static_cast<int>((delayed_work_time_ - now).InMilliseconds());
@@ -69,27 +82,20 @@ class JingleThread::JingleMessagePump : public base::MessagePump,
}
}
- JingleThread* thread_;
+ talk_base::Thread* thread_;
+ Delegate* delegate_;
base::TimeTicks delayed_work_time_;
};
-class JingleThread::JingleMessageLoop : public MessageLoop {
- public:
- JingleMessageLoop(JingleThread* thread)
- : MessageLoop(MessageLoop::TYPE_IO) {
- pump_ = new JingleMessagePump(thread);
- }
+} // namespace
- void Initialize() {
- jingle_message_loop_state_.reset(new AutoRunState(this));
- }
+JingleThreadMessageLoop::JingleThreadMessageLoop(talk_base::Thread* thread)
+ : MessageLoop(MessageLoop::TYPE_IO) {
+ pump_ = new JingleMessagePump(thread);
+}
- private:
- // AutoRunState sets |state_| for this message loop. It needs to be
- // created here because we never call Run() or RunAllPending() for
- // the thread.
- scoped_ptr<AutoRunState> jingle_message_loop_state_;
-};
+JingleThreadMessageLoop::~JingleThreadMessageLoop() {
+}
TaskPump::TaskPump() {
}
@@ -121,8 +127,7 @@ void JingleThread::Start() {
}
void JingleThread::Run() {
- JingleMessageLoop message_loop(this);
- message_loop.Initialize();
+ JingleThreadMessageLoop message_loop(this);
message_loop_ = &message_loop;
TaskPump task_pump;
@@ -131,7 +136,7 @@ void JingleThread::Run() {
// Signal after we've initialized |message_loop_| and |task_pump_|.
started_event_.Signal();
- Thread::Run();
+ message_loop.Run();
stopped_event_.Signal();
@@ -153,7 +158,6 @@ MessageLoop* JingleThread::message_loop() {
return message_loop_;
}
- // Returns task pump if the thread is running, otherwise NULL is returned.
TaskPump* JingleThread::task_pump() {
return task_pump_;
}
diff --git a/remoting/jingle_glue/jingle_thread.h b/remoting/jingle_glue/jingle_thread.h
index a7201e1..1db62f3 100644
--- a/remoting/jingle_glue/jingle_thread.h
+++ b/remoting/jingle_glue/jingle_thread.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -31,6 +31,15 @@ class TaskPump : public talk_base::MessageHandler,
virtual void OnMessage(talk_base::Message* pmsg);
};
+class JingleThreadMessageLoop : public MessageLoop {
+ public:
+ JingleThreadMessageLoop(talk_base::Thread* thread);
+ virtual ~JingleThreadMessageLoop();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(JingleThreadMessageLoop);
+};
+
// TODO(sergeyu): This class should be changed to inherit from Chromiums
// base::Thread instead of libjingle's thread.
class JingleThread : public talk_base::Thread,
@@ -56,9 +65,6 @@ class JingleThread : public talk_base::Thread,
TaskPump* task_pump();
private:
- class JingleMessageLoop;
- class JingleMessagePump;
-
virtual void OnMessage(talk_base::Message* msg);
TaskPump* task_pump_;