#include #include /** * 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. * * Linked via -Wl,--wrap=pthread_attr_setstack (this module's own 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; (void)stackaddr; (void)stacksize; return 0; } #ifdef __APPLE__ // isn't a public SDK header (it ships with dyld's own source, not // Xcode/Command Line Tools), so this reimplements its DYLD_INTERPOSE macro locally. #define TT_DYLD_INTERPOSE(replacement, replacee) \ __attribute__((used)) static struct { const void* replacement; const void* replacee; } \ tt_interpose_##replacee __attribute__((section("__DATA,__interpose"))) = { \ (const void*)(unsigned long)&(replacement), (const void*)(unsigned long)&(replacee) \ }; TT_DYLD_INTERPOSE(__wrap_pthread_attr_setstack, pthread_attr_setstack) #endif