blob: 2d178ca2e473a86d2d0260a202e1711cb4a6e924 [file]
/*
* Copyright 2021 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
#include <pthread.h>
#include <stdlib.h>
#include <emscripten.h>
#include <emscripten/stack.h>
#include <emscripten/threading.h>
#include <emscripten/eventloop.h>
#include "threading_internal.h"
static int _main_argc;
static char** _main_argv;
int __main_argc_argv(int argc, char *argv[]);
weak int __main_void(void) {
return __main_argc_argv(_main_argc, _main_argv);
}
static void* _main_thread(void* param) {
// This is the main runtime thread for the application.
emscripten_set_thread_name(pthread_self(), "Application main thread");
// Will either call user's __main_void or weak version above.
int rtn = __main_void();
if (!emscripten_runtime_keepalive_check()) {
exit(rtn);
}
return NULL;
}
EMSCRIPTEN_KEEPALIVE int _emscripten_proxy_main(int argc, char** argv) {
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
// Use the size of the current stack, which is the normal size of the stack
// that main() would have without PROXY_TO_PTHREAD.
pthread_attr_setstacksize(&attr, emscripten_stack_get_base() - emscripten_stack_get_end());
// Pass special ID -1 to the list of transferred canvases to denote that the
// thread creation should instead take a list of canvases that are specified
// from the command line with -sOFFSCREENCANVASES_TO_PTHREAD linker flag.
emscripten_pthread_attr_settransferredcanvases(&attr, (const char*)-1);
_main_argc = argc;
_main_argv = argv;
pthread_t thread;
int rc = pthread_create(&thread, &attr, _main_thread, NULL);
pthread_attr_destroy(&attr);
if (rc == 0) {
// Mark the thread as strongly referenced, so that Node.js doesn't exit
// while the pthread is running.
_emscripten_thread_set_strongref(thread);
}
return rc;
}