diff options
author | Jukka Jylanki <jujjyl@gmail.com> | 2022-11-22 12:07:16 +0200 |
---|---|---|
committer | Ivan Maidanski <ivmai@mail.ru> | 2022-11-24 00:08:07 +0300 |
commit | 840bbcf603bc75e0b2da21ea9cbd84d1d63f14cf (patch) | |
tree | 43f4de57a2a2e920cdba5f4bc47ad9eff8fa9310 /CMakeLists.txt | |
parent | 421d2612e45bdc8305a220ee06f93461ed979d6d (diff) | |
download | bdwgc-840bbcf603bc75e0b2da21ea9cbd84d1d63f14cf.tar.gz |
Make Emscripten Asyncify feature optional
Issue #506 (bdwgc).
"-sASYNCIFY" is a relatively rarely used feature of Emscripten, most
developers do not use it, and it does not scale well to
moderate-to-large codebases. It incurs a heavy impact to code size
and performance, and carries other correctness problems that developers
must then adhere to regarding event loop message ordering.
This commit provides new option in cmake (-Denable_emscripten_asyncify)
and configure (--enable-emscripten-asyncify) scripts to turn on
Emscripten Asyncify feature on demand.
* CMakeLists.txt (enable_emscripten_asyncify): New option (off by
default).
* CMakeLists.txt (EMSCRIPTEN): Define using check_c_source_compiles.
* CMakeLists.txt [EMSCRIPTEN && enable_emscripten_asyncify]
(EMSCRIPTEN_ASYNCIFY): Define C macro.
* CMakeLists.txt [EMSCRIPTEN && enable_emscripten_asyncify]
(CMAKE_EXE_LINKER_FLAGS): Append "-sASYNCIFY" and
"-sASYNCIFY_STACK_SIZE=128000".
* configure.ac (emscripten): Remove quotes for the error directive
message.
* configure.ac [emscripten] (gc_cflags): Move comment and assignment
down (to be after reporting result for emscripten).
* configure.ac (emscripten-asyncify): New AC_ARG_ENABLE option; add
comment.
* configure.ac [enable_emscripten_asyncify && emscripten] (gc_cflags):
Add -D EMSCRIPTEN_ASYNCIFY; remove space after "-s".
* configure.ac [emscripten] (gc_cflags): Append "-sASYNCIFY" and
"-sASYNCIFY_STACK_SIZE=128000" only if enable_emscripten_asyncify.
* doc/README.macros (EMSCRIPTEN_ASYNCIFY): Document.
* os_dep.c [!ECOS && !NOSYS && !SYMBIAN && EMSCRIPTEN]: Make
USE_EMSCRIPTEN_SCAN_STACK has effect only if EMSCRIPTEN_ASYNCIFY.
* os_dep.c [THREADS && EMSCRIPTEN]: Include emscripten.h only if
EMSCRIPTEN_ASYNCIFY.
* os_dep.c [THREADS && EMSCRIPTEN] (scan_regs_cb,
GC_default_push_other_roots): Define as a function only if
EMSCRIPTEN_ASYNCIFY; update comment.
Co-authored-by: Ivan Maidanski <ivmai@mail.ru>
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 7917be50..8567e374 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -89,6 +89,7 @@ option(enable_single_obj_compilation "Compile all libgc source files into single option(disable_single_obj_compilation "Compile each libgc source file independently" OFF) option(enable_handle_fork "Attempt to ensure a usable collector after fork()" ON) option(disable_handle_fork "Prohibit installation of pthread_atfork() handlers" OFF) +option(enable_emscripten_asyncify "Use Emscripten asyncify feature" OFF) option(install_headers "Install header and pkg-config metadata files" ON) option(with_libatomic_ops "Use an external libatomic_ops" OFF) option(without_libatomic_ops "Use atomic_ops.h in libatomic_ops/src" OFF) @@ -546,6 +547,22 @@ if (HAVE_DLADDR) add_definitions("-DHAVE_DLADDR") endif() +# Check for emscripten; use asyncify feature if requested. +check_c_source_compiles(" +#ifndef __EMSCRIPTEN__\n +# error This is not Emscripten\n +#endif\n +int main(void) { return 0; }" + EMSCRIPTEN) +if (EMSCRIPTEN AND enable_emscripten_asyncify) + # Use this option if your program is targeting -sASYNCIFY. The latter is + # required to scan the stack, ASYNCIFY_STACK_SIZE is probably needed for + # gctest only. + add_definitions("-DEMSCRIPTEN_ASYNCIFY") + set(CMAKE_EXE_LINKER_FLAGS + "${CMAKE_EXE_LINKER_FLAGS} -sASYNCIFY -sASYNCIFY_STACK_SIZE=128000") +endif() + add_library(gc ${SRC}) target_link_libraries(gc PRIVATE ${ATOMIC_OPS_LIBS_CMAKE} ${THREADDLLIBS_LIST}) |