From 14b827049aed9fbd33df84f3428b98f27a7b216e Mon Sep 17 00:00:00 2001 From: David CARLIER Date: Fri, 29 Sep 2023 11:47:23 +0100 Subject: [PATCH] zend call stack support for haiku w/o using posix pthread api but the (#12103) underlying native BeOs one. --- Zend/zend_call_stack.c | 33 +++++++++++++++++++++++++++++++++ Zend/zend_call_stack.h | 3 +++ 2 files changed, 36 insertions(+) diff --git a/Zend/zend_call_stack.c b/Zend/zend_call_stack.c index 42db6b7e793..f869d1a4002 100644 --- a/Zend/zend_call_stack.c +++ b/Zend/zend_call_stack.c @@ -55,6 +55,9 @@ typedef int boolean_t; # include # include #endif +#ifdef __HAIKU__ +# include +#endif #ifdef __linux__ #include #endif @@ -507,6 +510,32 @@ static bool zend_call_stack_get_openbsd(zend_call_stack *stack) return false; } #endif /* defined(__OpenBSD__) */ +#if defined(__HAIKU__) +static bool zend_call_stack_get_haiku(zend_call_stack *stack) +{ + thread_id id; + thread_info ti; + size_t guard_size; + + // unlikely, main thread ought to be always available but we never know + if ((id = find_thread(NULL)) == B_NAME_NOT_FOUND || get_thread_info(id, &ti) != B_OK) { + return false; + } + + // USER_STACK_GUARD_SIZE + guard_size = sysconf(_SC_PAGESIZE) * 4; + + stack->base = ti.stack_end; + stack->max_size = ((size_t)ti.stack_end - (size_t)ti.stack_base) - guard_size; + + return true; +} +#else +static bool zend_call_stack_get_haiku(zend_call_stack *stack) +{ + return false; +} +#endif /* defined(__HAIKU__) */ #if defined(__NetBSD__) # ifdef HAVE_PTHREAD_GETATTR_NP @@ -648,6 +677,10 @@ ZEND_API bool zend_call_stack_get(zend_call_stack *stack) return true; } + if (zend_call_stack_get_haiku(stack)) { + return true; + } + return false; } diff --git a/Zend/zend_call_stack.h b/Zend/zend_call_stack.h index bdea17a4769..29f1a5463d1 100644 --- a/Zend/zend_call_stack.h +++ b/Zend/zend_call_stack.h @@ -86,6 +86,9 @@ static inline size_t zend_call_stack_default_size(void) } return 512 * 1024; #endif +#ifdef __HAIKU__ + return 64 * 4096; +#endif return 2 * 1024 * 1024; }