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