1*635a8641SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #include "base/files/file_tracing.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker #include "base/atomicops.h" 8*635a8641SAndroid Build Coastguard Worker #include "base/files/file.h" 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker using base::subtle::AtomicWord; 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker namespace base { 13*635a8641SAndroid Build Coastguard Worker 14*635a8641SAndroid Build Coastguard Worker namespace { 15*635a8641SAndroid Build Coastguard Worker AtomicWord g_provider; 16*635a8641SAndroid Build Coastguard Worker } 17*635a8641SAndroid Build Coastguard Worker GetProvider()18*635a8641SAndroid Build Coastguard WorkerFileTracing::Provider* GetProvider() { 19*635a8641SAndroid Build Coastguard Worker AtomicWord provider = base::subtle::Acquire_Load(&g_provider); 20*635a8641SAndroid Build Coastguard Worker return reinterpret_cast<FileTracing::Provider*>(provider); 21*635a8641SAndroid Build Coastguard Worker } 22*635a8641SAndroid Build Coastguard Worker 23*635a8641SAndroid Build Coastguard Worker // static IsCategoryEnabled()24*635a8641SAndroid Build Coastguard Workerbool FileTracing::IsCategoryEnabled() { 25*635a8641SAndroid Build Coastguard Worker FileTracing::Provider* provider = GetProvider(); 26*635a8641SAndroid Build Coastguard Worker return provider && provider->FileTracingCategoryIsEnabled(); 27*635a8641SAndroid Build Coastguard Worker } 28*635a8641SAndroid Build Coastguard Worker 29*635a8641SAndroid Build Coastguard Worker // static SetProvider(FileTracing::Provider * provider)30*635a8641SAndroid Build Coastguard Workervoid FileTracing::SetProvider(FileTracing::Provider* provider) { 31*635a8641SAndroid Build Coastguard Worker base::subtle::Release_Store(&g_provider, 32*635a8641SAndroid Build Coastguard Worker reinterpret_cast<AtomicWord>(provider)); 33*635a8641SAndroid Build Coastguard Worker } 34*635a8641SAndroid Build Coastguard Worker ScopedEnabler()35*635a8641SAndroid Build Coastguard WorkerFileTracing::ScopedEnabler::ScopedEnabler() { 36*635a8641SAndroid Build Coastguard Worker FileTracing::Provider* provider = GetProvider(); 37*635a8641SAndroid Build Coastguard Worker if (provider) 38*635a8641SAndroid Build Coastguard Worker provider->FileTracingEnable(this); 39*635a8641SAndroid Build Coastguard Worker } 40*635a8641SAndroid Build Coastguard Worker ~ScopedEnabler()41*635a8641SAndroid Build Coastguard WorkerFileTracing::ScopedEnabler::~ScopedEnabler() { 42*635a8641SAndroid Build Coastguard Worker FileTracing::Provider* provider = GetProvider(); 43*635a8641SAndroid Build Coastguard Worker if (provider) 44*635a8641SAndroid Build Coastguard Worker provider->FileTracingDisable(this); 45*635a8641SAndroid Build Coastguard Worker } 46*635a8641SAndroid Build Coastguard Worker ScopedTrace()47*635a8641SAndroid Build Coastguard WorkerFileTracing::ScopedTrace::ScopedTrace() : id_(nullptr) {} 48*635a8641SAndroid Build Coastguard Worker ~ScopedTrace()49*635a8641SAndroid Build Coastguard WorkerFileTracing::ScopedTrace::~ScopedTrace() { 50*635a8641SAndroid Build Coastguard Worker if (id_) { 51*635a8641SAndroid Build Coastguard Worker FileTracing::Provider* provider = GetProvider(); 52*635a8641SAndroid Build Coastguard Worker if (provider) 53*635a8641SAndroid Build Coastguard Worker provider->FileTracingEventEnd(name_, id_); 54*635a8641SAndroid Build Coastguard Worker } 55*635a8641SAndroid Build Coastguard Worker } 56*635a8641SAndroid Build Coastguard Worker Initialize(const char * name,const File * file,int64_t size)57*635a8641SAndroid Build Coastguard Workervoid FileTracing::ScopedTrace::Initialize(const char* name, 58*635a8641SAndroid Build Coastguard Worker const File* file, 59*635a8641SAndroid Build Coastguard Worker int64_t size) { 60*635a8641SAndroid Build Coastguard Worker id_ = &file->trace_enabler_; 61*635a8641SAndroid Build Coastguard Worker name_ = name; 62*635a8641SAndroid Build Coastguard Worker GetProvider()->FileTracingEventBegin(name_, id_, file->tracing_path_, size); 63*635a8641SAndroid Build Coastguard Worker } 64*635a8641SAndroid Build Coastguard Worker 65*635a8641SAndroid Build Coastguard Worker } // namespace base 66