72089f74f3
- Run SDL from main() and place FreeRTOS in separate thread. This fixes macOS support. - Updated GitHub Actions to publish macOS simulator build for testing, updated amd64 to x86_64 for consistent naming.
35 lines
1.6 KiB
C
35 lines
1.6 KiB
C
#include <pthread.h>
|
|
#include <stddef.h>
|
|
|
|
/**
|
|
* 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__
|
|
|
|
// <mach-o/dyld-interposing.h> 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
|