xref: /aosp_15_r20/external/cronet/base/profiler/stack_sampler_posix.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 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/profiler/stack_sampler.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <pthread.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <memory>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS) && \
16*6777b538SAndroid Build Coastguard Worker     (defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64))
17*6777b538SAndroid Build Coastguard Worker #include "base/check.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/profiler/frame_pointer_unwinder.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/profiler/stack_copier_signal.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/profiler/thread_delegate_posix.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/profiler/unwinder.h"
23*6777b538SAndroid Build Coastguard Worker #endif
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker namespace base {
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker namespace {
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS) && \
30*6777b538SAndroid Build Coastguard Worker     (defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64))
CreateUnwinders()31*6777b538SAndroid Build Coastguard Worker std::vector<std::unique_ptr<Unwinder>> CreateUnwinders() {
32*6777b538SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<Unwinder>> unwinders;
33*6777b538SAndroid Build Coastguard Worker   unwinders.push_back(std::make_unique<FramePointerUnwinder>());
34*6777b538SAndroid Build Coastguard Worker   return unwinders;
35*6777b538SAndroid Build Coastguard Worker }
36*6777b538SAndroid Build Coastguard Worker #endif
37*6777b538SAndroid Build Coastguard Worker 
38*6777b538SAndroid Build Coastguard Worker }  // namespace
39*6777b538SAndroid Build Coastguard Worker 
Create(SamplingProfilerThreadToken thread_token,ModuleCache * module_cache,UnwindersFactory core_unwinders_factory,RepeatingClosure record_sample_callback,StackSamplerTestDelegate * test_delegate)40*6777b538SAndroid Build Coastguard Worker std::unique_ptr<StackSampler> StackSampler::Create(
41*6777b538SAndroid Build Coastguard Worker     SamplingProfilerThreadToken thread_token,
42*6777b538SAndroid Build Coastguard Worker     ModuleCache* module_cache,
43*6777b538SAndroid Build Coastguard Worker     UnwindersFactory core_unwinders_factory,
44*6777b538SAndroid Build Coastguard Worker     RepeatingClosure record_sample_callback,
45*6777b538SAndroid Build Coastguard Worker     StackSamplerTestDelegate* test_delegate) {
46*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(IS_CHROMEOS) && \
47*6777b538SAndroid Build Coastguard Worker     (defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64))
48*6777b538SAndroid Build Coastguard Worker   DCHECK(!core_unwinders_factory);
49*6777b538SAndroid Build Coastguard Worker   return base::WrapUnique(
50*6777b538SAndroid Build Coastguard Worker       new StackSampler(std::make_unique<StackCopierSignal>(
51*6777b538SAndroid Build Coastguard Worker                            ThreadDelegatePosix::Create(thread_token)),
52*6777b538SAndroid Build Coastguard Worker                        BindOnce(&CreateUnwinders), module_cache,
53*6777b538SAndroid Build Coastguard Worker                        std::move(record_sample_callback), test_delegate));
54*6777b538SAndroid Build Coastguard Worker #else
55*6777b538SAndroid Build Coastguard Worker   return nullptr;
56*6777b538SAndroid Build Coastguard Worker #endif
57*6777b538SAndroid Build Coastguard Worker }
58*6777b538SAndroid Build Coastguard Worker 
GetStackBufferSize()59*6777b538SAndroid Build Coastguard Worker size_t StackSampler::GetStackBufferSize() {
60*6777b538SAndroid Build Coastguard Worker   size_t stack_size = PlatformThread::GetDefaultThreadStackSize();
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   pthread_attr_t attr;
63*6777b538SAndroid Build Coastguard Worker   if (stack_size == 0 && pthread_attr_init(&attr) == 0) {
64*6777b538SAndroid Build Coastguard Worker     if (pthread_attr_getstacksize(&attr, &stack_size) != 0)
65*6777b538SAndroid Build Coastguard Worker       stack_size = 0;
66*6777b538SAndroid Build Coastguard Worker     pthread_attr_destroy(&attr);
67*6777b538SAndroid Build Coastguard Worker   }
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker   // Maximum limits under NPTL implementation.
70*6777b538SAndroid Build Coastguard Worker   constexpr size_t kDefaultStackLimit = 4 * (1 << 20);
71*6777b538SAndroid Build Coastguard Worker   return stack_size > 0 ? stack_size : kDefaultStackLimit;
72*6777b538SAndroid Build Coastguard Worker }
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker }  // namespace base
75