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 7a7e14d0ef
commit 1f5e752013
5 changed files with 45 additions and 58 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'
@ -288,7 +289,7 @@ case "${host_os}" in
dnl disable floating point exceptions because they
dnl lead to segfaults with the android libc
with_fpe='no'
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'
@ -303,7 +304,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}"
@ -317,7 +318,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}"
@ -330,7 +331,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}"
@ -380,8 +381,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"
@ -412,7 +411,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}"
@ -434,7 +433,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}"
@ -463,7 +462,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
@ -501,7 +500,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\"'
@ -509,7 +508,6 @@ case "${host_os}" in
;;
haiku*)
thehost='haiku'
THREAD_LIBS=''
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH="-Wl,--rpath,~A"
@ -538,7 +536,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}"
@ -550,7 +548,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

30
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,8 +6112,8 @@ SONAME_LDFLAGS=''
case "${host_os}" in
linux-android*)
thehost='ANDROID'
with_fpe='no'
THREAD_CFLAGS='-D_THREAD_SAFE'
with_fpe='no'
THREAD_CFLAGS="-D_THREAD_SAFE ${THREAD_CFLAGS}"
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH='-Wl,--rpath,~A'
@ -6131,7 +6132,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}"
@ -6147,7 +6148,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}"
@ -6162,7 +6163,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}"
@ -6228,8 +6229,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"
@ -6266,7 +6265,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}"
@ -6291,7 +6290,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}"
@ -6433,7 +6432,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
@ -6477,7 +6476,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\"'
@ -6485,7 +6484,6 @@ LSP_FEATURES="${LSP_FEATURES} :unix"
;;
haiku*)
thehost='haiku'
THREAD_LIBS=''
SHARED_LDFLAGS="-shared ${LDFLAGS}"
BUNDLE_LDFLAGS="-shared ${LDFLAGS}"
ECL_LDRPATH="-Wl,--rpath,~A"
@ -6518,7 +6516,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}"
@ -6532,7 +6530,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}"
@ -7217,7 +7215,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 */