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" 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 ##################

View File

@ -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 ##################

View File

@ -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);
} }
} }