|  | // Copyright 2015 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "base/files/file_tracing.h" | 
|  |  | 
|  | #include "base/atomicops.h" | 
|  | #include "base/files/file.h" | 
|  |  | 
|  | using base::subtle::AtomicWord; | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | namespace { | 
|  | AtomicWord g_provider; | 
|  | } | 
|  |  | 
|  | FileTracing::Provider* GetProvider() { | 
|  | AtomicWord provider = base::subtle::Acquire_Load(&g_provider); | 
|  | return reinterpret_cast<FileTracing::Provider*>(provider); | 
|  | } | 
|  |  | 
|  | // static | 
|  | bool FileTracing::IsCategoryEnabled() { | 
|  | FileTracing::Provider* provider = GetProvider(); | 
|  | return provider && provider->FileTracingCategoryIsEnabled(); | 
|  | } | 
|  |  | 
|  | // static | 
|  | void FileTracing::SetProvider(FileTracing::Provider* provider) { | 
|  | base::subtle::Release_Store(&g_provider, | 
|  | reinterpret_cast<AtomicWord>(provider)); | 
|  | } | 
|  |  | 
|  | FileTracing::ScopedEnabler::ScopedEnabler() { | 
|  | FileTracing::Provider* provider = GetProvider(); | 
|  | if (provider) | 
|  | provider->FileTracingEnable(this); | 
|  | } | 
|  |  | 
|  | FileTracing::ScopedEnabler::~ScopedEnabler() { | 
|  | FileTracing::Provider* provider = GetProvider(); | 
|  | if (provider) | 
|  | provider->FileTracingDisable(this); | 
|  | } | 
|  |  | 
|  | FileTracing::ScopedTrace::ScopedTrace() : id_(nullptr) {} | 
|  |  | 
|  | FileTracing::ScopedTrace::~ScopedTrace() { | 
|  | if (id_) { | 
|  | FileTracing::Provider* provider = GetProvider(); | 
|  | if (provider) | 
|  | provider->FileTracingEventEnd(name_, id_); | 
|  | } | 
|  | } | 
|  |  | 
|  | void FileTracing::ScopedTrace::Initialize(const char* name, | 
|  | const File* file, | 
|  | int64_t size) { | 
|  | id_ = &file->trace_enabler_; | 
|  | name_ = name; | 
|  | GetProvider()->FileTracingEventBegin(name_, id_, file->tracing_path_, size); | 
|  | } | 
|  |  | 
|  | }  // namespace base |