xref: /aosp_15_r20/external/cronet/base/threading/scoped_blocking_call.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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