1b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// Use of this source code is governed by a BSD-style license that can be
3b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// found in the LICENSE file.
4b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
5cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko#include "base/message_loop/message_loop_task_runner.h"
6b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
7b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/location.h"
8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/logging.h"
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/message_loop/incoming_task_queue.h"
10b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
11b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace internal {
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
14cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex VakulenkoMessageLoopTaskRunner::MessageLoopTaskRunner(
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    scoped_refptr<IncomingTaskQueue> incoming_queue)
16cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenko    : incoming_queue_(incoming_queue), valid_thread_id_(kInvalidThreadId) {
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
18b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
19cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkovoid MessageLoopTaskRunner::BindToCurrentThread() {
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  AutoLock lock(valid_thread_id_lock_);
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK_EQ(kInvalidThreadId, valid_thread_id_);
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  valid_thread_id_ = PlatformThread::CurrentId();
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
25cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkobool MessageLoopTaskRunner::PostDelayedTask(
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const tracked_objects::Location& from_here,
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const base::Closure& task,
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    base::TimeDelta delay) {
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK(!task.is_null()) << from_here.ToString();
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return incoming_queue_->AddToIncomingQueue(from_here, task, delay, true);
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
32b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
33cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkobool MessageLoopTaskRunner::PostNonNestableDelayedTask(
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const tracked_objects::Location& from_here,
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    const base::Closure& task,
36b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    base::TimeDelta delay) {
37b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK(!task.is_null()) << from_here.ToString();
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return incoming_queue_->AddToIncomingQueue(from_here, task, delay, false);
39b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
40b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
41cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex Vakulenkobool MessageLoopTaskRunner::RunsTasksOnCurrentThread() const {
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  AutoLock lock(valid_thread_id_lock_);
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return valid_thread_id_ == PlatformThread::CurrentId();
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
46cce46a0c214b37e8da48c522c83037e8ffa4f9fdAlex VakulenkoMessageLoopTaskRunner::~MessageLoopTaskRunner() {
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
48b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace internal
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
52