1*6777b538SAndroid Build Coastguard Worker // Copyright 2017 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "base/threading/scoped_blocking_call.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include "base/lazy_instance.h"
8*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_local.h"
9*6777b538SAndroid Build Coastguard Worker #include "base/threading/thread_restrictions.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/base_tracing.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/tracing_buildflags.h"
13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
14*6777b538SAndroid Build Coastguard Worker
15*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(ENABLE_BASE_TRACING)
16*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/protos/perfetto/trace/track_event/source_location.pbzero.h" // nogncheck
17*6777b538SAndroid Build Coastguard Worker #endif // BUILDFLAG(ENABLE_BASE_TRACING)
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
20*6777b538SAndroid Build Coastguard Worker #include "base/auto_reset.h"
21*6777b538SAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/base/attributes.h"
22*6777b538SAndroid Build Coastguard Worker #endif
23*6777b538SAndroid Build Coastguard Worker
24*6777b538SAndroid Build Coastguard Worker namespace base {
25*6777b538SAndroid Build Coastguard Worker
26*6777b538SAndroid Build Coastguard Worker namespace {
27*6777b538SAndroid Build Coastguard Worker
28*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
29*6777b538SAndroid Build Coastguard Worker // Used to verify that the trace events used in the constructor do not result in
30*6777b538SAndroid Build Coastguard Worker // instantiating a ScopedBlockingCall themselves (which would cause an infinite
31*6777b538SAndroid Build Coastguard Worker // reentrancy loop).
32*6777b538SAndroid Build Coastguard Worker ABSL_CONST_INIT thread_local bool construction_in_progress = false;
33*6777b538SAndroid Build Coastguard Worker #endif
34*6777b538SAndroid Build Coastguard Worker
35*6777b538SAndroid Build Coastguard Worker } // namespace
36*6777b538SAndroid Build Coastguard Worker
ScopedBlockingCall(const Location & from_here,BlockingType blocking_type)37*6777b538SAndroid Build Coastguard Worker ScopedBlockingCall::ScopedBlockingCall(const Location& from_here,
38*6777b538SAndroid Build Coastguard Worker BlockingType blocking_type)
39*6777b538SAndroid Build Coastguard Worker : UncheckedScopedBlockingCall(
40*6777b538SAndroid Build Coastguard Worker blocking_type,
41*6777b538SAndroid Build Coastguard Worker UncheckedScopedBlockingCall::BlockingCallType::kRegular) {
42*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
43*6777b538SAndroid Build Coastguard Worker const AutoReset<bool> resetter(&construction_in_progress, true, false);
44*6777b538SAndroid Build Coastguard Worker #endif
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker internal::AssertBlockingAllowed();
47*6777b538SAndroid Build Coastguard Worker TRACE_EVENT_BEGIN(
48*6777b538SAndroid Build Coastguard Worker "base", "ScopedBlockingCall", [&](perfetto::EventContext ctx) {
49*6777b538SAndroid Build Coastguard Worker ctx.event()->set_source_location_iid(
50*6777b538SAndroid Build Coastguard Worker base::trace_event::InternedSourceLocation::Get(&ctx, from_here));
51*6777b538SAndroid Build Coastguard Worker });
52*6777b538SAndroid Build Coastguard Worker }
53*6777b538SAndroid Build Coastguard Worker
~ScopedBlockingCall()54*6777b538SAndroid Build Coastguard Worker ScopedBlockingCall::~ScopedBlockingCall() {
55*6777b538SAndroid Build Coastguard Worker TRACE_EVENT_END("base");
56*6777b538SAndroid Build Coastguard Worker }
57*6777b538SAndroid Build Coastguard Worker
58*6777b538SAndroid Build Coastguard Worker namespace internal {
59*6777b538SAndroid Build Coastguard Worker
60*6777b538SAndroid Build Coastguard Worker ScopedBlockingCallWithBaseSyncPrimitives::
ScopedBlockingCallWithBaseSyncPrimitives(const Location & from_here,BlockingType blocking_type)61*6777b538SAndroid Build Coastguard Worker ScopedBlockingCallWithBaseSyncPrimitives(const Location& from_here,
62*6777b538SAndroid Build Coastguard Worker BlockingType blocking_type)
63*6777b538SAndroid Build Coastguard Worker : UncheckedScopedBlockingCall(
64*6777b538SAndroid Build Coastguard Worker blocking_type,
65*6777b538SAndroid Build Coastguard Worker UncheckedScopedBlockingCall::BlockingCallType::kBaseSyncPrimitives) {
66*6777b538SAndroid Build Coastguard Worker #if DCHECK_IS_ON()
67*6777b538SAndroid Build Coastguard Worker const AutoReset<bool> resetter(&construction_in_progress, true, false);
68*6777b538SAndroid Build Coastguard Worker #endif
69*6777b538SAndroid Build Coastguard Worker
70*6777b538SAndroid Build Coastguard Worker internal::AssertBaseSyncPrimitivesAllowed();
71*6777b538SAndroid Build Coastguard Worker TRACE_EVENT_BEGIN(
72*6777b538SAndroid Build Coastguard Worker "base", "ScopedBlockingCallWithBaseSyncPrimitives",
73*6777b538SAndroid Build Coastguard Worker [&](perfetto::EventContext ctx) {
74*6777b538SAndroid Build Coastguard Worker perfetto::protos::pbzero::SourceLocation* source_location_data =
75*6777b538SAndroid Build Coastguard Worker ctx.event()->set_source_location();
76*6777b538SAndroid Build Coastguard Worker source_location_data->set_file_name(from_here.file_name());
77*6777b538SAndroid Build Coastguard Worker source_location_data->set_function_name(from_here.function_name());
78*6777b538SAndroid Build Coastguard Worker });
79*6777b538SAndroid Build Coastguard Worker }
80*6777b538SAndroid Build Coastguard Worker
81*6777b538SAndroid Build Coastguard Worker ScopedBlockingCallWithBaseSyncPrimitives::
~ScopedBlockingCallWithBaseSyncPrimitives()82*6777b538SAndroid Build Coastguard Worker ~ScopedBlockingCallWithBaseSyncPrimitives() {
83*6777b538SAndroid Build Coastguard Worker TRACE_EVENT_END("base");
84*6777b538SAndroid Build Coastguard Worker }
85*6777b538SAndroid Build Coastguard Worker
86*6777b538SAndroid Build Coastguard Worker } // namespace internal
87*6777b538SAndroid Build Coastguard Worker
88*6777b538SAndroid Build Coastguard Worker } // namespace base
89