xref: /aosp_15_r20/external/libchrome/base/files/file_tracing.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
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 Worker FileTracing::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 Worker bool 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 Worker void 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 Worker FileTracing::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 Worker FileTracing::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 Worker FileTracing::ScopedTrace::ScopedTrace() : id_(nullptr) {}
48*635a8641SAndroid Build Coastguard Worker 
~ScopedTrace()49*635a8641SAndroid Build Coastguard Worker FileTracing::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 Worker void 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