#include #include "libc.h" #include "pthread_impl.h" #if !__EMSCRIPTEN_PTHREADS__ static struct pthread __main_pthread; pthread_t __pthread_self(void) { return &__main_pthread; } __attribute__((constructor)) void __emscripten_pthread_data_constructor(void) { __pthread_self()->locale = &libc.global_locale; } #endif // !__EMSCRIPTEN_PTHREADS__ #if __EMSCRIPTEN_PTHREADS__ // In pthreads, we must initialize the runtime at the proper time, which // is after memory is initialized and before any userland global ctors. // We must also keep this function alive so it is always called; without // pthreads, if pthread_self is used then this file will be included, // and if not then it's fine to not have this. EM_JS(void, initPthreadsJS, (void), { PThread.initRuntime(); }) // This must run before any userland ctors // Note that ASan constructor priority is 50, and we must be higher. EMSCRIPTEN_KEEPALIVE __attribute__((constructor(48))) void __emscripten_pthread_data_constructor(void) { initPthreadsJS(); pthread_self()->locale = &libc.global_locale; } #endif