194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez// Copyright 2016 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
594ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/threading/thread_task_runner_handle.h"
694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez
794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include <utility>
8b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
9b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/lazy_instance.h"
1094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/logging.h"
1194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez#include "base/threading/sequenced_task_runner_handle.h"
12b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat#include "base/threading/thread_local.h"
13b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
14b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace base {
15b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
16b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratnamespace {
17b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
1894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavezbase::LazyInstance<base::ThreadLocalPointer<ThreadTaskRunnerHandle>>::Leaky
19b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat    lazy_tls_ptr = LAZY_INSTANCE_INITIALIZER;
20b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
21b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace
22b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
23b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static
24b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratscoped_refptr<SingleThreadTaskRunner> ThreadTaskRunnerHandle::Get() {
25b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  ThreadTaskRunnerHandle* current = lazy_tls_ptr.Pointer()->Get();
26b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK(current);
27b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  return current->task_runner_;
28b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
29b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
30b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat// static
31b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Eratbool ThreadTaskRunnerHandle::IsSet() {
3294ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  return !!lazy_tls_ptr.Pointer()->Get();
33b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
34b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
35b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratThreadTaskRunnerHandle::ThreadTaskRunnerHandle(
3694ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    scoped_refptr<SingleThreadTaskRunner> task_runner)
3794ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez    : task_runner_(std::move(task_runner)) {
38b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK(task_runner_->BelongsToCurrentThread());
3994ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  // No SequencedTaskRunnerHandle (which includes ThreadTaskRunnerHandles)
4094ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  // should already be set for this thread.
4194ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  DCHECK(!SequencedTaskRunnerHandle::IsSet());
42b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  lazy_tls_ptr.Pointer()->Set(this);
43b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
44b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
45b8cf94937c52feb53b55c39e3f82094d27de464cDaniel EratThreadTaskRunnerHandle::~ThreadTaskRunnerHandle() {
46b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK(task_runner_->BelongsToCurrentThread());
47b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat  DCHECK_EQ(lazy_tls_ptr.Pointer()->Get(), this);
4894ffa55491333f3dcc701befd0d2652922916d99Luis Hector Chavez  lazy_tls_ptr.Pointer()->Set(nullptr);
49b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}
50b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat
51b8cf94937c52feb53b55c39e3f82094d27de464cDaniel Erat}  // namespace base
52