garbage: register and unregister GC threads manually from a module

This decouples thread primitives from the garbage collector and allows us to
build nucl once more.
This commit is contained in:
Daniel Kochmański 2024-12-09 11:26:07 +01:00
parent e2681805f3
commit 3042e5657d
5 changed files with 44 additions and 57 deletions

26
src/aclocal.m4 vendored
View file

@ -274,9 +274,10 @@ SHAREDPREFIX='lib'
LIBPREFIX='lib'
LIBEXT='a'
PICFLAG='-fPIC'
THREAD_CFLAGS=''
THREAD_CFLAGS='-DGC_NO_THREAD_REDIRECTS'
THREAD_LIBS=''
THREAD_GC_FLAGS='--enable-threads=posix'
CFLAGS=''
INSTALL_TARGET='install'
THREAD_OBJ="$THREAD_OBJ threads/thread threads/mutex threads/condition_variable threads/semaphore threads/barrier threads/mailbox threads/rwlock"
clibs='-lm'
@ -285,7 +286,7 @@ SONAME_LDFLAGS=''
case "${host_os}" in
linux-android*)
thehost='ANDROID'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH='-Wl,--rpath,~A'
@ -300,7 +301,7 @@ case "${host_os}" in
# libdir may have a dollar expression inside
linux*)
thehost='linux'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -314,7 +315,7 @@ case "${host_os}" in
;;
gnu*)
thehost='gnu'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -327,7 +328,7 @@ case "${host_os}" in
;;
kfreebsd*-gnu)
thehost='kfreebsd'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -377,8 +378,6 @@ case "${host_os}" in
;;
openbsd*)
thehost='openbsd'
THREAD_CFLAGS=''
THREAD_LIBS=''
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH="-Wl,--rpath,~A"
@ -409,7 +408,7 @@ case "${host_os}" in
thehost='cygwin'
#enable_threads='no'
shared='yes'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -431,7 +430,7 @@ case "${host_os}" in
clibs=''
shared='yes'
enable_threads='yes'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_GC_FLAGS='--enable-threads=win32'
SHARED_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
BUNDLE_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
@ -460,7 +459,7 @@ case "${host_os}" in
SHARED_LDFLAGS="-dynamiclib ${LDFLAGS}"
BUNDLE_LDFLAGS="-bundle ${LDFLAGS}"
ECL_LDRPATH='-Wl,-rpath,~A'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
# The GMP library has not yet been ported to Intel or Arm-OSX
case "`uname -m`" in
@ -498,7 +497,7 @@ case "${host_os}" in
thehost='nonstop'
shared='yes'
PICFLAG='-call_shared'
THREAD_CFLAGS='-spthread'
THREAD_CFLAGS="-spthread ${THREAD_CFLAGS}"
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH='-Wld=\"-rld_l ~A\"'
@ -506,7 +505,6 @@ case "${host_os}" in
;;
haiku*)
thehost='haiku'
THREAD_LIBS=''
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH="-Wl,--rpath,~A"
@ -535,7 +533,7 @@ esac
case "${host}" in
*-nacl)
thehost='linux'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -547,7 +545,7 @@ case "${host}" in
;;
*-pnacl)
thehost='linux'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
dnl SHARED_LDFLAGS="-shared ${LDFLAGS}"
dnl BUNDLE_LDFLAGS="-shared ${LDFLAGS}"

View file

@ -1308,6 +1308,24 @@ init_cpu(cl_env_ptr the_env)
struct GC_stack_base stack;
GC_get_stack_base(&stack);
the_env->c_stack.org = (char*)stack.mem_base;
# ifdef ECL_THREADS
if (GC_thread_is_registered() == 0) {
GC_register_my_thread(&stack);
}
# endif
#endif
return ECL_NIL;
}
static cl_object
free_cpu(cl_env_ptr the_env)
{
#ifdef GBC_BOEHM
# ifdef ECL_THREADS
if (GC_thread_is_registered() == 1) {
GC_unregister_my_thread();
}
# endif
#endif
return ECL_NIL;
}
@ -1320,7 +1338,7 @@ static struct ecl_module module_gc = {
.enable = enable_gc,
.init_env = ecl_module_no_op_env,
.init_cpu = init_cpu,
.free_cpu = ecl_module_no_op_cpu,
.free_cpu = free_cpu,
.free_env = ecl_module_no_op_env,
.disable = disable_gc,
.destroy = ecl_module_no_op

View file

@ -123,28 +123,6 @@ init_tl_bindings(cl_object process, cl_env_ptr env)
#ifdef ECL_THREADS
static void
register_gc_thread()
{
#ifdef GBC_BOEHM
if (GC_thread_is_registered() == 0) {
struct GC_stack_base stack;
GC_get_stack_base(&stack);
GC_register_my_thread(&stack);
}
#endif
}
static void
unregister_gc_thread()
{
#ifdef GBC_BOEHM
if (GC_thread_is_registered() == 1) {
GC_unregister_my_thread();
}
#endif
}
/* Run a process in the current system thread. */
cl_env_ptr
ecl_adopt_cpu()
@ -153,7 +131,6 @@ ecl_adopt_cpu()
ecl_thread_t current;
if (the_env != NULL)
return the_env;
register_gc_thread();
ecl_set_process_self(current);
the_env = _ecl_alloc_env(0);
the_env->thread = current;
@ -177,7 +154,6 @@ ecl_disown_cpu()
#endif
ecl_modules_free_env(the_env);
_ecl_dealloc_env(the_env);
unregister_gc_thread();
}
#ifdef ECL_WINDOWS_THREADS

28
src/configure vendored
View file

@ -6100,9 +6100,10 @@ SHAREDPREFIX='lib'
LIBPREFIX='lib'
LIBEXT='a'
PICFLAG='-fPIC'
THREAD_CFLAGS=''
THREAD_CFLAGS='-DGC_NO_THREAD_REDIRECTS'
THREAD_LIBS=''
THREAD_GC_FLAGS='--enable-threads=posix'
CFLAGS=''
INSTALL_TARGET='install'
THREAD_OBJ="$THREAD_OBJ threads/thread threads/mutex threads/condition_variable threads/semaphore threads/barrier threads/mailbox threads/rwlock"
clibs='-lm'
@ -6111,7 +6112,7 @@ SONAME_LDFLAGS=''
case "${host_os}" in
linux-android*)
thehost='ANDROID'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH='-Wl,--rpath,~A'
@ -6130,7 +6131,7 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
# libdir may have a dollar expression inside
linux*)
thehost='linux'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -6146,7 +6147,7 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
;;
gnu*)
thehost='gnu'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -6161,7 +6162,7 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
;;
kfreebsd*-gnu)
thehost='kfreebsd'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -6227,8 +6228,6 @@ LSP_FEATURES="${LSP_FEATURES} :bsd"
;;
openbsd*)
thehost='openbsd'
THREAD_CFLAGS=''
THREAD_LIBS=''
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH="-Wl,--rpath,~A"
@ -6265,7 +6264,7 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
thehost='cygwin'
#enable_threads='no'
shared='yes'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -6290,7 +6289,7 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
clibs=''
shared='yes'
enable_threads='yes'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_GC_FLAGS='--enable-threads=win32'
SHARED_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
BUNDLE_LDFLAGS="-Wl,--stack,${ECL_DEFAULT_C_STACK_SIZE}"
@ -6432,7 +6431,7 @@ fi
SHARED_LDFLAGS="-dynamiclib ${LDFLAGS}"
BUNDLE_LDFLAGS="-bundle ${LDFLAGS}"
ECL_LDRPATH='-Wl,-rpath,~A'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
# The GMP library has not yet been ported to Intel or Arm-OSX
case "`uname -m`" in
@ -6476,7 +6475,7 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
thehost='nonstop'
shared='yes'
PICFLAG='-call_shared'
THREAD_CFLAGS='-spthread'
THREAD_CFLAGS="-spthread ${THREAD_CFLAGS}"
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH='-Wld=\"-rld_l ~A\"'
@ -6484,7 +6483,6 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
;;
haiku*)
thehost='haiku'
THREAD_LIBS=''
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH="-Wl,--rpath,~A"
@ -6517,7 +6515,7 @@ esac
case "${host}" in
*-nacl)
thehost='linux'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
@ -6531,7 +6529,7 @@ LSP_FEATURES="${LSP_FEATURES} :nacl"
;;
*-pnacl)
thehost='linux'
THREAD_CFLAGS='-D_THREAD_SAFE'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
THREAD_LIBS='-lpthread'
CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 ${CFLAGS}"
@ -7216,7 +7214,7 @@ if test "${enable_threads}" = "yes" ; then
as_fn_error $? "Threads aren't supported on this system." "$LINENO" 5
else
LIBS="${THREAD_LIBS} ${LIBS}"
CFLAGS="${CFLAGS} ${THREAD_CFLAGS}"
CFLAGS="${CFLAGS} ${THREAD_CFLAGS} -DGC_NO_THREAD_REDIRECTS"
ac_fn_c_check_func "$LINENO" "pthread_rwlock_init" "ac_cv_func_pthread_rwlock_init"
if test "x$ac_cv_func_pthread_rwlock_init" = xyes

View file

@ -63,9 +63,6 @@
# endif
# ifdef ECL_THREADS
# undef ERROR
# ifdef GBC_BOEHM
# define CreateThread GC_CreateThread
# endif
# else
# error "The Windows ports cannot be built without threads."
# endif /* ECL_THREADS */