15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
69ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jingle/glue/task_pump.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace jingle_glue {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TaskPump::TaskPump()
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : posted_wake_(false),
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      stopped_(false),
14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      weak_factory_(this) {
15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TaskPump::~TaskPump() {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TaskPump::WakeTasks() {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!stopped_ && !posted_wake_) {
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop* current_message_loop = base::MessageLoop::current();
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CHECK(current_message_loop);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Do the requested wake up.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    current_message_loop->PostTask(
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        FROM_HERE,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::Bind(&TaskPump::CheckAndRunTasks, weak_factory_.GetWeakPtr()));
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    posted_wake_ = true;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int64 TaskPump::CurrentTime() {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Only timeout tasks rely on this function.  Since we're not using
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // libjingle tasks for timeout, it's safe to return 0 here.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TaskPump::Stop() {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  stopped_ = true;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TaskPump::CheckAndRunTasks() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stopped_) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  posted_wake_ = false;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We shouldn't be using libjingle for timeout tasks, so we should
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // have no timeout tasks at all.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(akalin): Add HasTimeoutTask() back in TaskRunner class and
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // uncomment this check.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // DCHECK(!HasTimeoutTask())
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunTasks();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace jingle_glue
61