diff --git a/Platforms/platform-posix/source/pthread_stack_wrap.c b/Platforms/platform-posix/source/pthread_stack_wrap.c index 01ff6ca80..5095a6ea1 100644 --- a/Platforms/platform-posix/source/pthread_stack_wrap.c +++ b/Platforms/platform-posix/source/pthread_stack_wrap.c @@ -2,20 +2,15 @@ #include /** - * Linked in with -Wl,--wrap=pthread_attr_setstack (see Tactility/CMakeLists.txt). + * FreeRTOS's POSIX port hands every task a stack carved from its own heap (pvPortMalloc) via this call. + * pthread_attr_setstack requires page alignment that pvPortMalloc doesn't guarantee. + * When it succeeds anyway, the task's real pthread stack ends up living inside that small FreeRTOS heap region, + * where a thread doing heavier stack work (e.g. Mesa GL shader compilation) can silently corrupt adjacent heap_4 objects. + * No-op'ing the call instead leaves every task's pthread_attr_t at its pthread_attr_init() default, + * so pthread_create() gives it a real, properly sized stack. * - * FreeRTOS's POSIX port (Libraries/FreeRTOS-Kernel/portable/ThirdParty/GCC/Posix/port.c) - * hands every task a stack carved out of its own heap (pvPortMalloc) via this call. - * pthread_attr_setstack requires page alignment, which pvPortMalloc doesn't guarantee; - * when it happens to succeed anyway (allocator alignment can vary run to run), the - * task's real pthread stack ends up living inside that small FreeRTOS heap region - - * fine for typical embedded task code, but a desktop GL driver doing on-the-fly shader - * compilation on that thread (e.g. Mesa on first frame present) can overflow it and - * silently corrupt adjacent heap_4 objects. - * - * Wrapping the call out entirely (rather than patching the vendored port.c) leaves every - * task's pthread_attr_t at its pthread_attr_init() default, so pthread_create() always - * gives it a real, properly allocated default-size stack instead. + * Linked via -Wl,--wrap=pthread_attr_setstack (Tactility/CMakeLists.txt) on non-Apple platforms; + * reused as a dyld interpose target below on Apple platforms, whose linker lacks --wrap. */ int __wrap_pthread_attr_setstack(pthread_attr_t* attr, void* stackaddr, size_t stacksize) { (void)attr; @@ -23,3 +18,10 @@ int __wrap_pthread_attr_setstack(pthread_attr_t* attr, void* stackaddr, size_t s (void)stacksize; return 0; } + +#ifdef __APPLE__ +#include + +DYLD_INTERPOSE(__wrap_pthread_attr_setstack, pthread_attr_setstack) + +#endif