| // 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 |