aboutsummaryrefslogtreecommitdiff
path: root/devel/electron38/files/patch-base_profiler_stack__base__address__posix.cc
diff options
context:
space:
mode:
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.cc59
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