diff --git a/Zend/zend_call_stack.c b/Zend/zend_call_stack.c index 42db6b7e79392..f869d1a4002b8 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 bdea17a476959..29f1a5463d1c2 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; }