Index: remoting/jingle_glue/jingle_thread.cc |
diff --git a/remoting/jingle_glue/jingle_thread.cc b/remoting/jingle_glue/jingle_thread.cc |
index f13477ec73901d97cb0ec8509ad647b266f7d325..450381ed3d121d15f23346c716ccc0f419687ee2 100644 |
--- a/remoting/jingle_glue/jingle_thread.cc |
+++ b/remoting/jingle_glue/jingle_thread.cc |
@@ -15,21 +15,66 @@ namespace remoting { |
const uint32 kRunTasksMessageId = 1; |
const uint32 kStopMessageId = 2; |
-class JingleThread::JingleMessagePump : public base::MessagePump { |
+class JingleThread::JingleMessagePump : public base::MessagePump, |
+ public talk_base::MessageHandler { |
public: |
JingleMessagePump(JingleThread* thread) : thread_(thread) { } |
- virtual void Run(Delegate* delegate) { NOTIMPLEMENTED() ;} |
+ virtual void Run(Delegate* delegate) { NOTIMPLEMENTED(); } |
virtual void Quit() { NOTIMPLEMENTED(); } |
virtual void ScheduleWork() { |
- thread_->Post(thread_, kRunTasksMessageId); |
+ thread_->Post(this, kRunTasksMessageId); |
} |
virtual void ScheduleDelayedWork(const base::Time& time) { |
- NOTIMPLEMENTED(); |
+ delayed_work_time_ = time; |
+ ScheduleNextDelayedTask(); |
+ } |
+ |
+ void OnMessage(talk_base::Message* msg) { |
+ DCHECK(msg->message_id == 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(); |
+ // Loop until we run out of work. |
+ while (true) { |
+ if (!delegate->DoWork()) |
+ break; |
+ } |
+ |
+ // Process all pending tasks. |
+ while (true) { |
+ if (delegate->DoWork()) |
+ continue; |
+ if (delegate->DoDelayedWork(&delayed_work_time_)) |
+ continue; |
+ break; |
+ } |
+ |
+ ScheduleNextDelayedTask(); |
} |
private: |
+ |
+ void ScheduleNextDelayedTask() { |
+ DCHECK_EQ(thread_->message_loop(), MessageLoop::current()); |
+ |
+ thread_->Clear(this, kRunTasksMessageId); |
+ if (!delayed_work_time_.is_null()) { |
+ base::Time now = base::Time::Now(); |
+ int delay = static_cast<int>((delayed_work_time_ - now).InMilliseconds()); |
+ if (delay > 0) { |
+ thread_->PostDelayed(delay, this, kRunTasksMessageId); |
+ } else { |
+ thread_->Post(this, kRunTasksMessageId); |
+ } |
+ } |
+ } |
+ |
JingleThread* thread_; |
+ base::Time delayed_work_time_; |
}; |
class JingleThread::JingleMessageLoop : public MessageLoop { |
@@ -107,25 +152,14 @@ TaskPump* JingleThread::task_pump() { |
} |
void JingleThread::OnMessage(talk_base::Message* msg) { |
- if (msg->message_id == 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 = message_loop_; |
- // Loop until we run out of work. |
- while (true) { |
- if (!delegate->DoWork()) |
- break; |
- } |
- } else if (msg->message_id == kStopMessageId) { |
- // Stop the thread only if there are no more messages left in the queue, |
- // otherwise post another task to try again later. |
- if (msgq_.size() > 0 || fPeekKeep_) { |
- Post(this, kStopMessageId); |
- } else { |
- MessageQueue::Quit(); |
- } |
+ DCHECK(msg->message_id == kStopMessageId); |
+ |
+ // Stop the thread only if there are no more messages left in the queue, |
+ // otherwise post another task to try again later. |
+ if (msgq_.size() > 0 || fPeekKeep_) { |
+ Post(this, kStopMessageId); |
+ } else { |
+ MessageQueue::Quit(); |
} |
} |