Skip to content

Commit 090ed09

Browse files
committed
using the older pthread_attr_getstack* interfaces.
calculating the guard_size on freebsd.
1 parent bb59003 commit 090ed09

File tree

2 files changed

+24
-4
lines changed

2 files changed

+24
-4
lines changed

Zend/Zend.m4

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ _LT_AC_TRY_DLOPEN_SELF([
146146
])
147147
148148
dnl Checks for library functions.
149-
AC_CHECK_FUNCS(getpid kill sigsetjmp pthread_getattr_np pthread_attr_get_np pthread_get_stackaddr_np pthread_attr_getstack pthread_stackseg_np gettid)
149+
AC_CHECK_FUNCS(getpid kill sigsetjmp pthread_getattr_np pthread_attr_get_np pthread_get_stackaddr_np pthread_stackseg_np gettid)
150150
151151
dnl Test whether the stack grows downwards
152152
dnl Assumes contiguous stack

Zend/zend_call_stack.c

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ ZEND_API void zend_call_stack_init(void) {
9595
}
9696
}
9797

98+
#ifdef __GNUC__
99+
/* pthread_attr_getstackaddr/size is a deprecated interface */
100+
# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
101+
#endif
102+
98103
#ifdef __linux__
99104
static bool zend_call_stack_is_main_thread(void) {
100105
# ifdef HAVE_GETTID
@@ -121,7 +126,11 @@ static bool zend_call_stack_get_linux_pthread(zend_call_stack *stack)
121126
return false;
122127
}
123128

124-
error = pthread_attr_getstack(&attr, &addr, &max_size);
129+
error = pthread_attr_getstackaddr(&attr, &addr);
130+
if (error) {
131+
return false;
132+
}
133+
error = pthread_attr_getstacksize(&attr, &max_size);
125134
if (error) {
126135
return false;
127136
}
@@ -270,10 +279,21 @@ static bool zend_call_stack_get_freebsd_pthread(zend_call_stack *stack)
270279
goto fail;
271280
}
272281

273-
error = pthread_attr_getstack(&attr, &addr, &max_size);
282+
error = pthread_attr_getstackaddr(&attr, &addr);
274283
if (error) {
275-
goto fail;
284+
return false;
276285
}
286+
error = pthread_attr_getstacksize(&attr, &max_size);
287+
if (error) {
288+
return false;
289+
}
290+
error = pthread_attr_getguardsize(&attr, &guard_size);
291+
if (error) {
292+
return false;
293+
}
294+
295+
addr = (char*)addr + guard_size;
296+
max_size -= guard_size;
277297

278298
stack->base = (int8_t*)addr + max_size;
279299
stack->max_size = max_size;

0 commit comments

Comments
 (0)