mirror of
https://gitlab.com/embeddable-common-lisp/ecl.git
synced 2026-03-10 07:00:20 -07:00
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:
parent
e2681805f3
commit
3042e5657d
5 changed files with 44 additions and 57 deletions
26
src/aclocal.m4
vendored
26
src/aclocal.m4
vendored
|
|
@ -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}"
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
28
src/configure
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue