blob: 92216220bed54affb0a8b30797aebd14cec3ca6d [file] [log] [blame] [edit]
#include <pthread.h>
#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