| 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(); | 
| } | 
| } | 
|  | 
|  |