diff options
Diffstat (limited to 'devel/electron38/files/patch-base_profiler_stack__base__address__posix.cc')
-rw-r--r-- | devel/electron38/files/patch-base_profiler_stack__base__address__posix.cc | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/devel/electron38/files/patch-base_profiler_stack__base__address__posix.cc b/devel/electron38/files/patch-base_profiler_stack__base__address__posix.cc new file mode 100644 index 000000000000..8abc060ed861 --- /dev/null +++ b/devel/electron38/files/patch-base_profiler_stack__base__address__posix.cc @@ -0,0 +1,59 @@ +--- base/profiler/stack_base_address_posix.cc.orig 2025-04-22 20:15:27 UTC ++++ base/profiler/stack_base_address_posix.cc +@@ -18,6 +18,10 @@ + #include "base/files/scoped_file.h" + #endif + ++#if BUILDFLAG(IS_BSD) ++#include <pthread_np.h> ++#endif ++ + #if BUILDFLAG(IS_CHROMEOS) + extern "C" void* __libc_stack_end; + #endif +@@ -49,7 +53,21 @@ uintptr_t GetThreadStackBaseAddressImpl(pthread_t pthr + + #if !BUILDFLAG(IS_LINUX) + uintptr_t GetThreadStackBaseAddressImpl(pthread_t pthread_id) { ++#if BUILDFLAG(IS_OPENBSD) ++ stack_t ss; ++ void *address; ++ size_t size; ++ if (pthread_stackseg_np(pthread_id, &ss) != 0) ++ return 0; ++ size = ss.ss_size; ++ address = (void*)((size_t) ss.ss_sp - ss.ss_size); ++#else + pthread_attr_t attr; ++#if BUILDFLAG(IS_FREEBSD) ++ int result; ++ pthread_attr_init(&attr); ++ pthread_attr_get_np(pthread_id, &attr); ++#else + // pthread_getattr_np will crash on ChromeOS & Linux if we are in the sandbox + // and pthread_id refers to a different thread, due to the use of + // sched_getaffinity(). +@@ -62,12 +80,14 @@ uintptr_t GetThreadStackBaseAddressImpl(pthread_t pthr + << logging::SystemErrorCodeToString(result); + // See crbug.com/617730 for limitations of this approach on Linux-like + // systems. ++#endif + void* address; + size_t size; + result = pthread_attr_getstack(&attr, &address, &size); + CHECK_EQ(result, 0) << "pthread_attr_getstack returned " + << logging::SystemErrorCodeToString(result); + pthread_attr_destroy(&attr); ++#endif + const uintptr_t base_address = reinterpret_cast<uintptr_t>(address) + size; + return base_address; + } +@@ -84,7 +104,7 @@ std::optional<uintptr_t> GetThreadStackBaseAddress(Pla + // trying to work around the problem. + return std::nullopt; + #else +- const bool is_main_thread = id.raw() == GetCurrentProcId(); ++ const bool is_main_thread = id.raw() == (checked_cast<uint64_t>(GetCurrentProcId())); + if (is_main_thread) { + #if BUILDFLAG(IS_ANDROID) + // The implementation of pthread_getattr_np() in Bionic reads proc/self/maps |