per-regstry lock for lazy module instantiation (fixes DrScheme start-up problems); adjust configure for better pthread flags; merge to 4.2.5
svn: r18688
This commit is contained in:
parent
658fc0717d
commit
e7e30384e1
30
src/configure
vendored
30
src/configure
vendored
|
@ -5839,8 +5839,9 @@ case $OS in
|
||||||
EXTRALIBS="-Wl,-brtl,-bE:\$(srcdir)/../mzscheme/include/mzscheme.exp"
|
EXTRALIBS="-Wl,-brtl,-bE:\$(srcdir)/../mzscheme/include/mzscheme.exp"
|
||||||
;;
|
;;
|
||||||
FreeBSD)
|
FreeBSD)
|
||||||
LIBS="$LIBS -rdynamic -pthread"
|
LIBS="$LIBS -rdynamic"
|
||||||
DYN_CFLAGS="-fPIC"
|
DYN_CFLAGS="-fPIC"
|
||||||
|
enable_pthread=yes
|
||||||
;;
|
;;
|
||||||
OpenBSD)
|
OpenBSD)
|
||||||
LIBS="$LIBS -rdynamic -Wl,--export-dynamic"
|
LIBS="$LIBS -rdynamic -Wl,--export-dynamic"
|
||||||
|
@ -10712,18 +10713,6 @@ if test "${enable_gl}" = "yes" ; then
|
||||||
MROPTIONS="$MROPTIONS -DUSE_GL"
|
MROPTIONS="$MROPTIONS -DUSE_GL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
############### pthread ###################
|
|
||||||
|
|
||||||
if test "${enable_pthread}" = "yes" ; then
|
|
||||||
PREFLAGS="$PREFLAGS -D_THREAD_SAFE"
|
|
||||||
X_EXTRA_LIBS="$X_EXTRA_LIBS -pthread"
|
|
||||||
|
|
||||||
cat >>confdefs.h <<\_ACEOF
|
|
||||||
#define USE_PTHREAD_INSTEAD_OF_ITIMER 1
|
|
||||||
_ACEOF
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
############### places ###################
|
############### places ###################
|
||||||
|
|
||||||
if test "${enable_places}" = "yes" ; then
|
if test "${enable_places}" = "yes" ; then
|
||||||
|
@ -10732,7 +10721,6 @@ cat >>confdefs.h <<\_ACEOF
|
||||||
#define MZ_USE_PLACES 1
|
#define MZ_USE_PLACES 1
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
LDFLAGS="$LDFLAGS -pthread"
|
|
||||||
enable_mzrt=yes
|
enable_mzrt=yes
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -10756,14 +10744,22 @@ fi
|
||||||
############### OS threads ###################
|
############### OS threads ###################
|
||||||
|
|
||||||
if test "${enable_mzrt}" = "yes" ; then
|
if test "${enable_mzrt}" = "yes" ; then
|
||||||
|
MZRT_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC"
|
||||||
|
LIBATOM="LIBATOM_USE"
|
||||||
|
enable_pthread=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
############### pthread ###################
|
||||||
|
|
||||||
|
if test "${enable_pthread}" = "yes" ; then
|
||||||
|
# FIXME: the following two flags are GCC-specific:
|
||||||
|
PREFLAGS="$PREFLAGS -pthread"
|
||||||
|
LDFLAGS="$LDFLAGS -pthread"
|
||||||
|
|
||||||
cat >>confdefs.h <<\_ACEOF
|
cat >>confdefs.h <<\_ACEOF
|
||||||
#define USE_PTHREAD_INSTEAD_OF_ITIMER 1
|
#define USE_PTHREAD_INSTEAD_OF_ITIMER 1
|
||||||
_ACEOF
|
_ACEOF
|
||||||
|
|
||||||
LDFLAGS="$LDFLAGS -pthread"
|
|
||||||
MZRT_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC"
|
|
||||||
LIBATOM="LIBATOM_USE"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
################ Xrender ##################
|
################ Xrender ##################
|
||||||
|
|
|
@ -549,8 +549,9 @@ case $OS in
|
||||||
EXTRALIBS="-Wl,-brtl,-bE:\$(srcdir)/../mzscheme/include/mzscheme.exp"
|
EXTRALIBS="-Wl,-brtl,-bE:\$(srcdir)/../mzscheme/include/mzscheme.exp"
|
||||||
;;
|
;;
|
||||||
FreeBSD)
|
FreeBSD)
|
||||||
LIBS="$LIBS -rdynamic -pthread"
|
LIBS="$LIBS -rdynamic"
|
||||||
DYN_CFLAGS="-fPIC"
|
DYN_CFLAGS="-fPIC"
|
||||||
|
enable_pthread=yes
|
||||||
;;
|
;;
|
||||||
OpenBSD)
|
OpenBSD)
|
||||||
LIBS="$LIBS -rdynamic -Wl,--export-dynamic"
|
LIBS="$LIBS -rdynamic -Wl,--export-dynamic"
|
||||||
|
@ -1142,19 +1143,10 @@ if test "${enable_gl}" = "yes" ; then
|
||||||
MROPTIONS="$MROPTIONS -DUSE_GL"
|
MROPTIONS="$MROPTIONS -DUSE_GL"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
############### pthread ###################
|
|
||||||
|
|
||||||
if test "${enable_pthread}" = "yes" ; then
|
|
||||||
PREFLAGS="$PREFLAGS -D_THREAD_SAFE"
|
|
||||||
X_EXTRA_LIBS="$X_EXTRA_LIBS -pthread"
|
|
||||||
AC_DEFINE(USE_PTHREAD_INSTEAD_OF_ITIMER, 1, [Pthread timer enabled])
|
|
||||||
fi
|
|
||||||
|
|
||||||
############### places ###################
|
############### places ###################
|
||||||
|
|
||||||
if test "${enable_places}" = "yes" ; then
|
if test "${enable_places}" = "yes" ; then
|
||||||
AC_DEFINE(MZ_USE_PLACES,1,[Places enabled])
|
AC_DEFINE(MZ_USE_PLACES,1,[Places enabled])
|
||||||
LDFLAGS="$LDFLAGS -pthread"
|
|
||||||
enable_mzrt=yes
|
enable_mzrt=yes
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -1174,10 +1166,18 @@ fi
|
||||||
############### OS threads ###################
|
############### OS threads ###################
|
||||||
|
|
||||||
if test "${enable_mzrt}" = "yes" ; then
|
if test "${enable_mzrt}" = "yes" ; then
|
||||||
AC_DEFINE(USE_PTHREAD_INSTEAD_OF_ITIMER, 1, [Pthread timer enabled])
|
|
||||||
LDFLAGS="$LDFLAGS -pthread"
|
|
||||||
MZRT_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC"
|
MZRT_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC"
|
||||||
LIBATOM="LIBATOM_USE"
|
LIBATOM="LIBATOM_USE"
|
||||||
|
enable_pthread=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
############### pthread ###################
|
||||||
|
|
||||||
|
if test "${enable_pthread}" = "yes" ; then
|
||||||
|
# FIXME: the following two flags are GCC-specific:
|
||||||
|
PREFLAGS="$PREFLAGS -pthread"
|
||||||
|
LDFLAGS="$LDFLAGS -pthread"
|
||||||
|
AC_DEFINE(USE_PTHREAD_INSTEAD_OF_ITIMER, 1, [Pthread timer enabled])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
################ Xrender ##################
|
################ Xrender ##################
|
||||||
|
|
|
@ -3748,6 +3748,37 @@ void scheme_module_force_lazy(Scheme_Env *env, int previous)
|
||||||
/* not anymore */
|
/* not anymore */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void wait_registry(Scheme_Env *env)
|
||||||
|
{
|
||||||
|
Scheme_Object *lock, *a[1];
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
lock = scheme_hash_get(env->module_registry, scheme_false);
|
||||||
|
if (!lock)
|
||||||
|
return;
|
||||||
|
|
||||||
|
a[0] = SCHEME_CAR(lock);
|
||||||
|
a[1] = SCHEME_CDR(lock);
|
||||||
|
(void)scheme_sync(1, a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lock_registry(Scheme_Env *env)
|
||||||
|
{
|
||||||
|
Scheme_Object *lock;
|
||||||
|
lock = scheme_make_pair(scheme_make_sema(0),
|
||||||
|
scheme_current_thread);
|
||||||
|
scheme_hash_set(env->module_registry, scheme_false, lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void unlock_registry(Scheme_Env *env)
|
||||||
|
{
|
||||||
|
Scheme_Object *lock;
|
||||||
|
lock = scheme_hash_get(env->module_registry, scheme_false);
|
||||||
|
scheme_post_sema(SCHEME_CAR(lock));
|
||||||
|
scheme_hash_set(env->module_registry, scheme_false, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
XFORM_NONGCING static long make_key(int base_phase, int eval_exp, int eval_run)
|
XFORM_NONGCING static long make_key(int base_phase, int eval_exp, int eval_run)
|
||||||
{
|
{
|
||||||
return ((base_phase << 3)
|
return ((base_phase << 3)
|
||||||
|
@ -4364,6 +4395,8 @@ static void do_prepare_compile_env(Scheme_Env *env, int base_phase, int pos)
|
||||||
Scheme_Object *v, *prev;
|
Scheme_Object *v, *prev;
|
||||||
Scheme_Env *menv;
|
Scheme_Env *menv;
|
||||||
|
|
||||||
|
wait_registry(env);
|
||||||
|
|
||||||
v = MODCHAIN_AVAIL(env->modchain, pos);
|
v = MODCHAIN_AVAIL(env->modchain, pos);
|
||||||
if (!SCHEME_FALSEP(v)) {
|
if (!SCHEME_FALSEP(v)) {
|
||||||
MODCHAIN_AVAIL(env->modchain, pos) = scheme_false;
|
MODCHAIN_AVAIL(env->modchain, pos) = scheme_false;
|
||||||
|
@ -4380,6 +4413,8 @@ static void do_prepare_compile_env(Scheme_Env *env, int base_phase, int pos)
|
||||||
}
|
}
|
||||||
v = prev;
|
v = prev;
|
||||||
|
|
||||||
|
lock_registry(env);
|
||||||
|
|
||||||
while (SCHEME_NAMESPACEP(v)) {
|
while (SCHEME_NAMESPACEP(v)) {
|
||||||
menv = (Scheme_Env *)v;
|
menv = (Scheme_Env *)v;
|
||||||
v = menv->available_next[pos];
|
v = menv->available_next[pos];
|
||||||
|
@ -4388,6 +4423,8 @@ static void do_prepare_compile_env(Scheme_Env *env, int base_phase, int pos)
|
||||||
NULL, 1, 0, base_phase,
|
NULL, 1, 0, base_phase,
|
||||||
scheme_null);
|
scheme_null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unlock_registry(env);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user