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