Fix for warnings due to wrapping issue on macOS

This commit is contained in:
Ken Van Hoeylandt 2026-09-18 00:43:23 +02:00
parent bc7530f589
commit a03daa4675

View File

@ -2,20 +2,15 @@
#include <stddef.h> #include <stddef.h>
/** /**
* 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) * Linked via -Wl,--wrap=pthread_attr_setstack (Tactility/CMakeLists.txt) on non-Apple platforms;
* hands every task a stack carved out of its own heap (pvPortMalloc) via this call. * reused as a dyld interpose target below on Apple platforms, whose linker lacks --wrap.
* 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.
*/ */
int __wrap_pthread_attr_setstack(pthread_attr_t* attr, void* stackaddr, size_t stacksize) { int __wrap_pthread_attr_setstack(pthread_attr_t* attr, void* stackaddr, size_t stacksize) {
(void)attr; (void)attr;
@ -23,3 +18,10 @@ int __wrap_pthread_attr_setstack(pthread_attr_t* attr, void* stackaddr, size_t s
(void)stacksize; (void)stacksize;
return 0; return 0;
} }
#ifdef __APPLE__
#include <mach-o/dyld-interposing.h>
DYLD_INTERPOSE(__wrap_pthread_attr_setstack, pthread_attr_setstack)
#endif