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:
Matthew Flatt 2010-03-31 10:59:49 +00:00
parent 658fc0717d
commit e7e30384e1
3 changed files with 62 additions and 29 deletions

30
src/configure vendored
View File

@ -5839,8 +5839,9 @@ case $OS in
EXTRALIBS="-Wl,-brtl,-bE:\$(srcdir)/../mzscheme/include/mzscheme.exp"
;;
FreeBSD)
LIBS="$LIBS -rdynamic -pthread"
LIBS="$LIBS -rdynamic"
DYN_CFLAGS="-fPIC"
enable_pthread=yes
;;
OpenBSD)
LIBS="$LIBS -rdynamic -Wl,--export-dynamic"
@ -10712,18 +10713,6 @@ if test "${enable_gl}" = "yes" ; then
MROPTIONS="$MROPTIONS -DUSE_GL"
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 ###################
if test "${enable_places}" = "yes" ; then
@ -10732,7 +10721,6 @@ cat >>confdefs.h <<\_ACEOF
#define MZ_USE_PLACES 1
_ACEOF
LDFLAGS="$LDFLAGS -pthread"
enable_mzrt=yes
fi
@ -10756,14 +10744,22 @@ fi
############### OS threads ###################
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
#define USE_PTHREAD_INSTEAD_OF_ITIMER 1
_ACEOF
LDFLAGS="$LDFLAGS -pthread"
MZRT_CGC_FLAGS="$GC_THREADS_FLAG -DTHREAD_LOCAL_ALLOC"
LIBATOM="LIBATOM_USE"
fi
################ Xrender ##################

View File

@ -549,8 +549,9 @@ case $OS in
EXTRALIBS="-Wl,-brtl,-bE:\$(srcdir)/../mzscheme/include/mzscheme.exp"
;;
FreeBSD)
LIBS="$LIBS -rdynamic -pthread"
LIBS="$LIBS -rdynamic"
DYN_CFLAGS="-fPIC"
enable_pthread=yes
;;
OpenBSD)
LIBS="$LIBS -rdynamic -Wl,--export-dynamic"
@ -1142,19 +1143,10 @@ if test "${enable_gl}" = "yes" ; then
MROPTIONS="$MROPTIONS -DUSE_GL"
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 ###################
if test "${enable_places}" = "yes" ; then
AC_DEFINE(MZ_USE_PLACES,1,[Places enabled])
LDFLAGS="$LDFLAGS -pthread"
enable_mzrt=yes
fi
@ -1174,10 +1166,18 @@ fi
############### OS threads ###################
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"
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
################ Xrender ##################

View File

@ -3748,6 +3748,37 @@ void scheme_module_force_lazy(Scheme_Env *env, int previous)
/* 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)
{
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_Env *menv;
wait_registry(env);
v = MODCHAIN_AVAIL(env->modchain, pos);
if (!SCHEME_FALSEP(v)) {
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;
lock_registry(env);
while (SCHEME_NAMESPACEP(v)) {
menv = (Scheme_Env *)v;
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,
scheme_null);
}
unlock_registry(env);
}
}