merge Kevin's work so far on places

svn: r11226
This commit is contained in:
Matthew Flatt 2008-08-13 23:08:34 +00:00
parent edbbca1fa2
commit 04d7712988
34 changed files with 1415 additions and 814 deletions

25
src/configure vendored
View File

@ -704,6 +704,7 @@ FRAMEWORK_REL_INSTALL
FRAMEWORK_PREFIX FRAMEWORK_PREFIX
INSTALL_ORIG_TREE INSTALL_ORIG_TREE
EXE_SUFFIX EXE_SUFFIX
PLACE_CGC_FLAGS
MREDLINKER MREDLINKER
LIBSFX LIBSFX
WXLIBS WXLIBS
@ -1342,6 +1343,7 @@ Optional Features:
--enable-lt=<prog> use <prog> instead of bundled libtool --enable-lt=<prog> use <prog> instead of bundled libtool
--enable-origtree install with original directory structure --enable-origtree install with original directory structure
--enable-foreign compile foreign support (enabled by default) --enable-foreign compile foreign support (enabled by default)
--enable-places compile places support
--enable-cgcdefault use CGC (Boehm or Senora) as default build --enable-cgcdefault use CGC (Boehm or Senora) as default build
--enable-sgc use Senora GC instead of the Boehm GC --enable-sgc use Senora GC instead of the Boehm GC
--enable-sgcdebug use Senora GC for debugging --enable-sgcdebug use Senora GC for debugging
@ -1881,6 +1883,12 @@ else
fi fi
# Check whether --enable-foreign was given.
if test "${enable_foreign+set}" = set; then
enableval=$enable_foreign;
fi
# Check whether --enable-cgcdefault was given. # Check whether --enable-cgcdefault was given.
if test "${enable_cgcdefault+set}" = set; then if test "${enable_cgcdefault+set}" = set; then
enableval=$enable_cgcdefault; enableval=$enable_cgcdefault;
@ -2259,6 +2267,7 @@ ZLIB_INC='$(ZLIB_INC)'
PNG_A='$(PNG_A)' PNG_A='$(PNG_A)'
PREFLAGS="$CPPFLAGS" PREFLAGS="$CPPFLAGS"
PLACE_CGC_FLAGS=""
ar_libtool_no_undefined="" ar_libtool_no_undefined=""
LIBMZSCHEME_DEP="" LIBMZSCHEME_DEP=""
@ -5790,6 +5799,7 @@ case $OS in
Linux) Linux)
LIBS="$LIBS -rdynamic" LIBS="$LIBS -rdynamic"
DYN_CFLAGS="-fPIC" DYN_CFLAGS="-fPIC"
GC_THREADS_FLAG="-DGC_LINUX_THREADS"
# PPC: X11 librares are not found # PPC: X11 librares are not found
case `$UNAME -m` in case `$UNAME -m` in
ppc) ppc)
@ -5859,6 +5869,8 @@ case $OS in
ZLIB_A="" ZLIB_A=""
ZLIB_INC="" ZLIB_INC=""
GC_THREADS_FLAG="-DGC_DARWIN_THREADS"
gcc_vers_three=`${CC} -v 2>&1 | grep "version [3-9][.]"` gcc_vers_three=`${CC} -v 2>&1 | grep "version [3-9][.]"`
if test "$gcc_vers_three" = "" ; then if test "$gcc_vers_three" = "" ; then
# gcc 2.95.2 # gcc 2.95.2
@ -10470,6 +10482,13 @@ if test "${enable_pthread}" = "yes" ; then
GC2OPTIONS="$GC2OPTIONS -DNO_GC_SIGNALS" GC2OPTIONS="$GC2OPTIONS -DNO_GC_SIGNALS"
fi fi
############### places ###################
if test "${enable_places}" = "yes" ; then
PREFLAGS="$PREFLAGS -DMZ_USE_PLACES"
PLACE_CGC_FLAGS="$GC_THREADS_FLAG -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC"
LDFLAGS="$LDFLAGS -pthread"
fi
################ Xrender ################## ################ Xrender ##################
@ -11783,6 +11802,7 @@ LIBS="$LIBS $EXTRALIBS"
mk_needed_dir() mk_needed_dir()
@ -12659,13 +12679,13 @@ FRAMEWORK_REL_INSTALL!$FRAMEWORK_REL_INSTALL$ac_delim
FRAMEWORK_PREFIX!$FRAMEWORK_PREFIX$ac_delim FRAMEWORK_PREFIX!$FRAMEWORK_PREFIX$ac_delim
INSTALL_ORIG_TREE!$INSTALL_ORIG_TREE$ac_delim INSTALL_ORIG_TREE!$INSTALL_ORIG_TREE$ac_delim
EXE_SUFFIX!$EXE_SUFFIX$ac_delim EXE_SUFFIX!$EXE_SUFFIX$ac_delim
PLACE_CGC_FLAGS!$PLACE_CGC_FLAGS$ac_delim
MREDLINKER!$MREDLINKER$ac_delim MREDLINKER!$MREDLINKER$ac_delim
LIBSFX!$LIBSFX$ac_delim LIBSFX!$LIBSFX$ac_delim
WXLIBS!$WXLIBS$ac_delim WXLIBS!$WXLIBS$ac_delim
WXVARIANT!$WXVARIANT$ac_delim WXVARIANT!$WXVARIANT$ac_delim
ICP!$ICP$ac_delim ICP!$ICP$ac_delim
MRLIBINSTALL!$MRLIBINSTALL$ac_delim MRLIBINSTALL!$MRLIBINSTALL$ac_delim
LIBFINISH!$LIBFINISH$ac_delim
_ACEOF _ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 97; then
@ -12707,6 +12727,7 @@ _ACEOF
ac_delim='%!_!# ' ac_delim='%!_!# '
for ac_last_try in false false false false false :; do for ac_last_try in false false false false false :; do
cat >conf$$subs.sed <<_ACEOF cat >conf$$subs.sed <<_ACEOF
LIBFINISH!$LIBFINISH$ac_delim
MAKE_MRED!$MAKE_MRED$ac_delim MAKE_MRED!$MAKE_MRED$ac_delim
MAKE_WBUILD!$MAKE_WBUILD$ac_delim MAKE_WBUILD!$MAKE_WBUILD$ac_delim
MAKE_COPYTREE!$MAKE_COPYTREE$ac_delim MAKE_COPYTREE!$MAKE_COPYTREE$ac_delim
@ -12746,7 +12767,7 @@ LIBOBJS!$LIBOBJS$ac_delim
LTLIBOBJS!$LTLIBOBJS$ac_delim LTLIBOBJS!$LTLIBOBJS$ac_delim
_ACEOF _ACEOF
if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 37; then if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 38; then
break break
elif $ac_last_try; then elif $ac_last_try; then
{ { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5

View File

@ -41,6 +41,8 @@ AC_ARG_ENABLE(origtree,[ --enable-origtree install with original director
AC_ARG_ENABLE(foreign, [ --enable-foreign compile foreign support (enabled by default)], , enable_foreign=yes) AC_ARG_ENABLE(foreign, [ --enable-foreign compile foreign support (enabled by default)], , enable_foreign=yes)
AC_ARG_ENABLE(foreign, [ --enable-places compile places support])
AC_ARG_ENABLE(cgcdefault, [ --enable-cgcdefault use CGC (Boehm or Senora) as default build]) AC_ARG_ENABLE(cgcdefault, [ --enable-cgcdefault use CGC (Boehm or Senora) as default build])
AC_ARG_ENABLE(sgc, [ --enable-sgc use Senora GC instead of the Boehm GC]) AC_ARG_ENABLE(sgc, [ --enable-sgc use Senora GC instead of the Boehm GC])
AC_ARG_ENABLE(sgcdebug,[ --enable-sgcdebug use Senora GC for debugging]) AC_ARG_ENABLE(sgcdebug,[ --enable-sgcdebug use Senora GC for debugging])
@ -329,6 +331,7 @@ ZLIB_INC='$(ZLIB_INC)'
PNG_A='$(PNG_A)' PNG_A='$(PNG_A)'
PREFLAGS="$CPPFLAGS" PREFLAGS="$CPPFLAGS"
PLACE_CGC_FLAGS=""
ar_libtool_no_undefined="" ar_libtool_no_undefined=""
LIBMZSCHEME_DEP="" LIBMZSCHEME_DEP=""
@ -532,6 +535,7 @@ case $OS in
Linux) Linux)
LIBS="$LIBS -rdynamic" LIBS="$LIBS -rdynamic"
DYN_CFLAGS="-fPIC" DYN_CFLAGS="-fPIC"
GC_THREADS_FLAG="-DGC_LINUX_THREADS"
# PPC: X11 librares are not found # PPC: X11 librares are not found
case `$UNAME -m` in case `$UNAME -m` in
ppc) ppc)
@ -601,6 +605,8 @@ case $OS in
ZLIB_A="" ZLIB_A=""
ZLIB_INC="" ZLIB_INC=""
GC_THREADS_FLAG="-DGC_DARWIN_THREADS"
[ gcc_vers_three=`${CC} -v 2>&1 | grep "version [3-9][.]"` ] [ gcc_vers_three=`${CC} -v 2>&1 | grep "version [3-9][.]"` ]
if test "$gcc_vers_three" = "" ; then if test "$gcc_vers_three" = "" ; then
# gcc 2.95.2 # gcc 2.95.2
@ -1023,6 +1029,13 @@ if test "${enable_pthread}" = "yes" ; then
GC2OPTIONS="$GC2OPTIONS -DNO_GC_SIGNALS" GC2OPTIONS="$GC2OPTIONS -DNO_GC_SIGNALS"
fi fi
############### places ###################
if test "${enable_places}" = "yes" ; then
PREFLAGS="$PREFLAGS -DMZ_USE_PLACES"
PLACE_CGC_FLAGS="$GC_THREADS_FLAG -DPARALLEL_MARK -DTHREAD_LOCAL_ALLOC"
LDFLAGS="$LDFLAGS -pthread"
fi
################ Xrender ################## ################ Xrender ##################
@ -1300,6 +1313,7 @@ AC_SUBST(FRAMEWORK_REL_INSTALL)
AC_SUBST(FRAMEWORK_PREFIX) AC_SUBST(FRAMEWORK_PREFIX)
AC_SUBST(INSTALL_ORIG_TREE) AC_SUBST(INSTALL_ORIG_TREE)
AC_SUBST(EXE_SUFFIX) AC_SUBST(EXE_SUFFIX)
AC_SUBST(PLACE_CGC_FLAGS)
AC_SUBST(MREDLINKER) AC_SUBST(MREDLINKER)
AC_SUBST(LIBSFX) AC_SUBST(LIBSFX)

View File

@ -31,7 +31,7 @@ mainsrcdir = @srcdir@/../..
# compiler options; mainly used to allow importing options # compiler options; mainly used to allow importing options
OPTIONS=@OPTIONS@ @CGCOPTIONS@ OPTIONS=@OPTIONS@ @CGCOPTIONS@
BASEFLAGS= -I$(srcdir)/include -DNO_SIGNALS @CFLAGS@ @COMPFLAGS@ @PREFLAGS@ BASEFLAGS= -I$(srcdir)/include -DNO_SIGNALS @CFLAGS@ @COMPFLAGS@ @PREFLAGS@ @PLACE_CGC_FLAGS@
CFLAGS= $(BASEFLAGS) @PROFFLAGS@ $(OPTIONS) -DNO_EXECUTE_PERMISSION -DSILENT -DNO_GETENV -DLARGE_CONFIG -DATOMIC_UNCOLLECTABLE -DINITIAL_MARK_STACK_SIZE=8192 CFLAGS= $(BASEFLAGS) @PROFFLAGS@ $(OPTIONS) -DNO_EXECUTE_PERMISSION -DSILENT -DNO_GETENV -DLARGE_CONFIG -DATOMIC_UNCOLLECTABLE -DINITIAL_MARK_STACK_SIZE=8192
# To build the parallel collector on Linux, add to the above: # To build the parallel collector on Linux, add to the above:

View File

@ -102,15 +102,15 @@ void GC_push_all_stacks() {
if(r != KERN_SUCCESS) ABORT("thread_get_state failed"); if(r != KERN_SUCCESS) ABORT("thread_get_state failed");
#if defined(I386) #if defined(I386)
lo = state.esp; lo = state.__esp;
GC_push_one(state.eax); GC_push_one(state.__eax);
GC_push_one(state.ebx); GC_push_one(state.__ebx);
GC_push_one(state.ecx); GC_push_one(state.__ecx);
GC_push_one(state.edx); GC_push_one(state.__edx);
GC_push_one(state.edi); GC_push_one(state.__edi);
GC_push_one(state.esi); GC_push_one(state.__esi);
GC_push_one(state.ebp); GC_push_one(state.__ebp);
#elif defined(POWERPC) #elif defined(POWERPC)
lo = (void*)(state.r1 - PPC_RED_ZONE_SIZE); lo = (void*)(state.r1 - PPC_RED_ZONE_SIZE);

View File

@ -21,7 +21,7 @@ RANLIB = @RANLIB@
CPPFLAGS = @PREFLAGS@ @OPTIONS@ @GC2OPTIONS@ @MZOPTIONS@ -I$(builddir)/.. -I$(srcdir)/../include CPPFLAGS = @PREFLAGS@ @OPTIONS@ @GC2OPTIONS@ @MZOPTIONS@ -I$(builddir)/.. -I$(srcdir)/../include
CFLAGS = @CFLAGS@ $(CPPFLAGS) @COMPFLAGS@ @PROFFLAGS@ CFLAGS = @CFLAGS@ $(CPPFLAGS) @COMPFLAGS@ @PROFFLAGS@
LIBS = @LIBS@ LIBS = @LIBS@ -lpthread
DEF_COLLECTS_DIR = +D INITIAL_COLLECTS_DIRECTORY='"'"`cd $(srcdir)/../../../collects; pwd`"'"' DEF_COLLECTS_DIR = +D INITIAL_COLLECTS_DIRECTORY='"'"`cd $(srcdir)/../../../collects; pwd`"'"'
@ -50,11 +50,13 @@ OBJS = salloc.@LTO@ \
jit.@LTO@ \ jit.@LTO@ \
list.@LTO@ \ list.@LTO@ \
module.@LTO@ \ module.@LTO@ \
mzrt.@LTO@ \
network.@LTO@ \ network.@LTO@ \
numarith.@LTO@ \ numarith.@LTO@ \
number.@LTO@ \ number.@LTO@ \
numcomp.@LTO@ \ numcomp.@LTO@ \
numstr.@LTO@ \ numstr.@LTO@ \
places.@LTO@ \
port.@LTO@ \ port.@LTO@ \
portfun.@LTO@ \ portfun.@LTO@ \
print.@LTO@ \ print.@LTO@ \
@ -98,6 +100,7 @@ XSRCS = $(XSRCDIR)/salloc.c \
$(XSRCDIR)/numcomp.c \ $(XSRCDIR)/numcomp.c \
$(XSRCDIR)/number.c \ $(XSRCDIR)/number.c \
$(XSRCDIR)/numstr.c \ $(XSRCDIR)/numstr.c \
$(XSRCDIR)/places.c \
$(XSRCDIR)/port.c \ $(XSRCDIR)/port.c \
$(XSRCDIR)/portfun.c \ $(XSRCDIR)/portfun.c \
$(XSRCDIR)/print.c \ $(XSRCDIR)/print.c \
@ -178,6 +181,8 @@ $(XSRCDIR)/numcomp.c: ../src/numcomp.@LTO@ $(XFORMDEP)
$(XFORM) $(XSRCDIR)/numcomp.c $(SRCDIR)/numcomp.c $(XFORM) $(XSRCDIR)/numcomp.c $(SRCDIR)/numcomp.c
$(XSRCDIR)/numstr.c: ../src/numstr.@LTO@ $(XFORMDEP) $(XSRCDIR)/numstr.c: ../src/numstr.@LTO@ $(XFORMDEP)
$(XFORM) $(XSRCDIR)/numstr.c $(SRCDIR)/numstr.c $(XFORM) $(XSRCDIR)/numstr.c $(SRCDIR)/numstr.c
$(XSRCDIR)/places.c: ../src/places.@LTO@ $(XFORMDEP)
$(XFORM) $(XSRCDIR)/places.c $(SRCDIR)/places.c
$(XSRCDIR)/port.c: ../src/port.@LTO@ $(XFORMDEP) $(XSRCDIR)/port.c: ../src/port.@LTO@ $(XFORMDEP)
$(XFORM) $(XSRCDIR)/port.c $(SRCDIR)/port.c $(XFORM) $(XSRCDIR)/port.c $(SRCDIR)/port.c
$(XSRCDIR)/portfun.c: ../src/portfun.@LTO@ $(XFORMDEP) $(XSRCDIR)/portfun.c: ../src/portfun.@LTO@ $(XFORMDEP)
@ -248,6 +253,8 @@ list.@LTO@: $(XSRCDIR)/list.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/list.c -o list.@LTO@ $(CC) $(CFLAGS) -c $(XSRCDIR)/list.c -o list.@LTO@
module.@LTO@: $(XSRCDIR)/module.c module.@LTO@: $(XSRCDIR)/module.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/module.c -o module.@LTO@ $(CC) $(CFLAGS) -c $(XSRCDIR)/module.c -o module.@LTO@
mzrt.@LTO@: $(SRCDIR)/mzrt.c
$(CC) $(CFLAGS) -c $(SRCDIR)/mzrt.c -o mzrt.@LTO@
network.@LTO@: $(XSRCDIR)/network.c network.@LTO@: $(XSRCDIR)/network.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/network.c -o network.@LTO@ $(CC) $(CFLAGS) -c $(XSRCDIR)/network.c -o network.@LTO@
numarith.@LTO@: $(XSRCDIR)/numarith.c numarith.@LTO@: $(XSRCDIR)/numarith.c
@ -258,6 +265,8 @@ numcomp.@LTO@: $(XSRCDIR)/numcomp.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/numcomp.c -o numcomp.@LTO@ $(CC) $(CFLAGS) -c $(XSRCDIR)/numcomp.c -o numcomp.@LTO@
numstr.@LTO@: $(XSRCDIR)/numstr.c numstr.@LTO@: $(XSRCDIR)/numstr.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/numstr.c -o numstr.@LTO@ $(CC) $(CFLAGS) -c $(XSRCDIR)/numstr.c -o numstr.@LTO@
places.@LTO@: $(XSRCDIR)/places.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/places.c -o places.@LTO@
port.@LTO@: $(XSRCDIR)/port.c port.@LTO@: $(XSRCDIR)/port.c
$(CC) $(CFLAGS) -c $(XSRCDIR)/port.c -o port.@LTO@ $(CC) $(CFLAGS) -c $(XSRCDIR)/port.c -o port.@LTO@
portfun.@LTO@: $(XSRCDIR)/portfun.c portfun.@LTO@: $(XSRCDIR)/portfun.c

View File

@ -15,7 +15,7 @@ scheme_set_thread_param
scheme_get_env scheme_get_env
scheme_inherit_cells scheme_inherit_cells
scheme_current_break_cell scheme_current_break_cell
scheme_current_thread Scheme_Thread
scheme_fuel_counter scheme_fuel_counter
scheme_get_current_thread scheme_get_current_thread
scheme_start_atomic scheme_start_atomic

View File

@ -15,7 +15,7 @@ scheme_set_thread_param
scheme_get_env scheme_get_env
scheme_inherit_cells scheme_inherit_cells
scheme_current_break_cell scheme_current_break_cell
scheme_current_thread Scheme_Thread
scheme_fuel_counter scheme_fuel_counter
scheme_get_current_thread scheme_get_current_thread
scheme_start_atomic scheme_start_atomic

View File

@ -17,7 +17,6 @@ EXPORTS
scheme_get_env scheme_get_env
scheme_inherit_cells scheme_inherit_cells
scheme_current_break_cell scheme_current_break_cell
scheme_current_thread DATA
scheme_fuel_counter DATA scheme_fuel_counter DATA
scheme_get_current_thread scheme_get_current_thread
scheme_start_atomic scheme_start_atomic

View File

@ -17,7 +17,6 @@ EXPORTS
scheme_get_env scheme_get_env
scheme_inherit_cells scheme_inherit_cells
scheme_current_break_cell scheme_current_break_cell
scheme_current_thread DATA
scheme_fuel_counter DATA scheme_fuel_counter DATA
scheme_get_current_thread scheme_get_current_thread
scheme_start_atomic scheme_start_atomic

View File

@ -166,6 +166,16 @@ typedef struct FSSpec mzFSSpec;
#define MZ_EXTERN extern MZ_DLLSPEC #define MZ_EXTERN extern MZ_DLLSPEC
#ifdef MZ_USE_PLACES
# if _MSC_VER
# define THREAD_LOCAL __declspec(thread)
# else
# define THREAD_LOCAL __thread
# endif
#else
# define THREAD_LOCAL /* empty */
#endif
#if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_I386) || defined(MZ_USE_JIT_X86_64) #if defined(MZ_USE_JIT_PPC) || defined(MZ_USE_JIT_I386) || defined(MZ_USE_JIT_X86_64)
# define MZ_USE_JIT # define MZ_USE_JIT
#endif #endif
@ -1384,7 +1394,6 @@ typedef void (*Scheme_Invoke_Proc)(Scheme_Env *env, long phase_shift,
#define scheme_tail_rator (scheme_current_thread->ku.apply.tail_rator) #define scheme_tail_rator (scheme_current_thread->ku.apply.tail_rator)
#define scheme_tail_num_rands (scheme_current_thread->ku.apply.tail_num_rands) #define scheme_tail_num_rands (scheme_current_thread->ku.apply.tail_num_rands)
#define scheme_tail_rands (scheme_current_thread->ku.apply.tail_rands) #define scheme_tail_rands (scheme_current_thread->ku.apply.tail_rands)
#define scheme_overflow_k (scheme_current_thread->overflow_k)
#define scheme_overflow_reply (scheme_current_thread->overflow_reply) #define scheme_overflow_reply (scheme_current_thread->overflow_reply)
#define scheme_error_buf *(scheme_current_thread->error_buf) #define scheme_error_buf *(scheme_current_thread->error_buf)
@ -1648,9 +1657,10 @@ MZ_EXTERN void scheme_set_logging(int syslog_level, int stderr_level);
MZ_EXTERN int scheme_get_allow_set_undefined(); MZ_EXTERN int scheme_get_allow_set_undefined();
#ifndef MZ_USE_PLACES
MZ_EXTERN Scheme_Thread *scheme_current_thread; MZ_EXTERN THREAD_LOCAL Scheme_Thread *scheme_current_thread;
MZ_EXTERN Scheme_Thread *scheme_first_thread; MZ_EXTERN THREAD_LOCAL Scheme_Thread *scheme_first_thread;
#endif
/* Set these global hooks (optionally): */ /* Set these global hooks (optionally): */
typedef void (*Scheme_Exit_Proc)(int v); typedef void (*Scheme_Exit_Proc)(int v);
@ -1704,8 +1714,8 @@ MZ_EXTERN void scheme_wake_up(void);
MZ_EXTERN int scheme_get_external_event_fd(void); MZ_EXTERN int scheme_get_external_event_fd(void);
/* GC registration: */ /* GC registration: */
MZ_EXTERN void scheme_set_stack_base(void *base, int no_auto_statics); MZ_EXTERN void scheme_set_primordial_stack_base(void *base, int no_auto_statics);
MZ_EXTERN void scheme_set_stack_bounds(void *base, void *deepest, int no_auto_statics); MZ_EXTERN void scheme_set_primordial_stack_bounds(void *base, void *deepest, int no_auto_statics);
/* Stack-preparation start-up: */ /* Stack-preparation start-up: */
typedef int (*Scheme_Nested_Main)(void *data); typedef int (*Scheme_Nested_Main)(void *data);

View File

@ -29,11 +29,13 @@ OBJS = salloc.@LTO@ \
jit.@LTO@ \ jit.@LTO@ \
list.@LTO@ \ list.@LTO@ \
module.@LTO@ \ module.@LTO@ \
mzrt.@LTO@ \
network.@LTO@ \ network.@LTO@ \
numarith.@LTO@ \ numarith.@LTO@ \
number.@LTO@ \ number.@LTO@ \
numcomp.@LTO@ \ numcomp.@LTO@ \
numstr.@LTO@ \ numstr.@LTO@ \
places.@LTO@ \
port.@LTO@ \ port.@LTO@ \
portfun.@LTO@ \ portfun.@LTO@ \
print.@LTO@ \ print.@LTO@ \
@ -68,11 +70,13 @@ SRCS = $(srcdir)/salloc.c \
$(srcdir)/jit.c \ $(srcdir)/jit.c \
$(srcdir)/list.c \ $(srcdir)/list.c \
$(srcdir)/module.c \ $(srcdir)/module.c \
$(srcdir)/mzrt.c \
$(srcdir)/network.c \ $(srcdir)/network.c \
$(srcdir)/numarith.c \ $(srcdir)/numarith.c \
$(srcdir)/number.c \ $(srcdir)/number.c \
$(srcdir)/numcomp.c \ $(srcdir)/numcomp.c \
$(srcdir)/numstr.c \ $(srcdir)/numstr.c \
$(srcdir)/places.c \
$(srcdir)/port.c \ $(srcdir)/port.c \
$(srcdir)/portfun.c \ $(srcdir)/portfun.c \
$(srcdir)/print.c \ $(srcdir)/print.c \
@ -174,6 +178,8 @@ list.@LTO@: $(srcdir)/list.c
$(CC) $(CFLAGS) -c $(srcdir)/list.c -o list.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/list.c -o list.@LTO@
module.@LTO@: $(srcdir)/module.c module.@LTO@: $(srcdir)/module.c
$(CC) $(CFLAGS) -c $(srcdir)/module.c -o module.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/module.c -o module.@LTO@
mzrt.@LTO@: $(srcdir)/mzrt.c
$(CC) $(CFLAGS) -c $(srcdir)/mzrt.c -o mzrt.@LTO@
network.@LTO@: $(srcdir)/network.c network.@LTO@: $(srcdir)/network.c
$(CC) $(CFLAGS) -c $(srcdir)/network.c -o network.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/network.c -o network.@LTO@
numarith.@LTO@: $(srcdir)/numarith.c numarith.@LTO@: $(srcdir)/numarith.c
@ -184,6 +190,8 @@ numcomp.@LTO@: $(srcdir)/numcomp.c
$(CC) $(CFLAGS) -c $(srcdir)/numcomp.c -o numcomp.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/numcomp.c -o numcomp.@LTO@
numstr.@LTO@: $(srcdir)/numstr.c numstr.@LTO@: $(srcdir)/numstr.c
$(CC) $(CFLAGS) -c $(srcdir)/numstr.c -o numstr.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/numstr.c -o numstr.@LTO@
places.@LTO@: $(srcdir)/places.c
$(CC) $(CFLAGS) -c $(srcdir)/places.c -o places.@LTO@
port.@LTO@: $(srcdir)/port.c port.@LTO@: $(srcdir)/port.c
$(CC) $(CFLAGS) -c $(srcdir)/port.c -o port.@LTO@ $(CC) $(CFLAGS) -c $(srcdir)/port.c -o port.@LTO@
portfun.@LTO@: $(srcdir)/portfun.c portfun.@LTO@: $(srcdir)/portfun.c
@ -272,6 +280,8 @@ numcomp.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../in
$(srcdir)/../src/stypes.h $(srcdir)/nummacs.h $(srcdir)/../src/stypes.h $(srcdir)/nummacs.h
numstr.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \ numstr.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \
$(srcdir)/../src/stypes.h $(srcdir)/random.inc $(srcdir)/newrandom.inc $(srcdir)/../src/stypes.h $(srcdir)/random.inc $(srcdir)/newrandom.inc
places.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \
$(srcdir)/../src/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark.c
port.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \ port.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \
$(srcdir)/../src/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark.c $(srcdir)/../src/stypes.h $(srcdir)/schfd.h $(srcdir)/mzmark.c
portfun.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \ portfun.@LTO@: $(srcdir)/schpriv.h $(srcdir)/schexn.h $(SCONFIG) $(srcdir)/../include/scheme.h \

View File

@ -272,7 +272,7 @@ static int union_check(Scheme_Object *obj1, Scheme_Object *obj2, Equal_Info *eql
} }
} }
static Scheme_Object *equal_k() static Scheme_Object *equal_k(void)
{ {
Scheme_Thread *p = scheme_current_thread; Scheme_Thread *p = scheme_current_thread;
Scheme_Object *v1 = (Scheme_Object *)p->ku.k.p1; Scheme_Object *v1 = (Scheme_Object *)p->ku.k.p1;

View File

@ -1,5 +1,5 @@
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,48,46,50,46,54,50,0,0,0,1,0,0,6,0,9,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,48,46,49,50,0,0,0,1,0,0,6,0,9,0,
14,0,18,0,23,0,28,0,32,0,39,0,42,0,55,0,62,0,69,0,78, 14,0,18,0,23,0,28,0,32,0,39,0,42,0,55,0,62,0,69,0,78,
0,84,0,98,0,112,0,115,0,119,0,121,0,132,0,134,0,148,0,155,0, 0,84,0,98,0,112,0,115,0,119,0,121,0,132,0,134,0,148,0,155,0,
177,0,179,0,193,0,253,0,23,1,32,1,41,1,51,1,68,1,107,1,146, 177,0,179,0,193,0,253,0,23,1,32,1,41,1,51,1,68,1,107,1,146,
@ -14,11 +14,11 @@
115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109, 115,61,120,73,108,101,116,114,101,99,45,118,97,108,117,101,115,66,108,97,109,
98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110, 98,100,97,1,20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,
45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,98, 45,107,101,121,61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,98,
10,35,11,8,163,218,94,159,2,16,35,35,159,2,15,35,35,16,20,2,9, 10,35,11,8,180,219,94,159,2,16,35,35,159,2,15,35,35,16,20,2,9,
2,2,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2, 2,2,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,
2,2,8,2,2,2,10,2,2,2,11,2,2,2,12,2,2,97,36,11,8, 2,2,8,2,2,2,10,2,2,2,11,2,2,2,12,2,2,97,36,11,8,
163,218,93,159,2,15,35,36,16,2,2,13,161,2,2,36,2,13,2,2,2, 180,219,93,159,2,15,35,36,16,2,2,13,161,2,2,36,2,13,2,2,2,
13,97,10,11,11,8,163,218,16,0,97,10,37,11,8,163,218,16,0,13,16, 13,97,10,11,11,8,180,219,16,0,97,10,37,11,8,180,219,16,0,13,16,
4,35,29,11,11,2,2,11,18,98,64,104,101,114,101,8,31,8,30,8,29, 4,35,29,11,11,2,2,11,18,98,64,104,101,114,101,8,31,8,30,8,29,
8,28,8,27,27,248,22,190,3,23,196,1,249,22,183,3,80,158,38,35,251, 8,28,8,27,27,248,22,190,3,23,196,1,249,22,183,3,80,158,38,35,251,
22,73,2,17,248,22,88,23,200,2,12,249,22,63,2,1,248,22,90,23,202, 22,73,2,17,248,22,88,23,200,2,12,249,22,63,2,1,248,22,90,23,202,
@ -28,14 +28,14 @@
36,28,248,22,71,248,22,65,23,195,2,248,22,64,193,249,22,183,3,80,158, 36,28,248,22,71,248,22,65,23,195,2,248,22,64,193,249,22,183,3,80,158,
38,35,251,22,73,2,17,248,22,64,23,200,2,249,22,63,2,7,248,22,65, 38,35,251,22,73,2,17,248,22,64,23,200,2,249,22,63,2,7,248,22,65,
23,202,1,11,18,100,10,8,31,8,30,8,29,8,28,8,27,16,4,11,11, 23,202,1,11,18,100,10,8,31,8,30,8,29,8,28,8,27,16,4,11,11,
2,18,3,1,7,101,110,118,56,48,56,49,16,4,11,11,2,19,3,1,7, 2,18,3,1,7,101,110,118,56,49,54,51,16,4,11,11,2,19,3,1,7,
101,110,118,56,48,56,50,27,248,22,65,248,22,190,3,23,197,1,28,248,22, 101,110,118,56,49,54,52,27,248,22,65,248,22,190,3,23,197,1,28,248,22,
71,23,194,2,20,15,159,36,35,36,28,248,22,71,248,22,65,23,195,2,248, 71,23,194,2,20,15,159,36,35,36,28,248,22,71,248,22,65,23,195,2,248,
22,64,193,249,22,183,3,80,158,38,35,250,22,73,2,20,248,22,73,249,22, 22,64,193,249,22,183,3,80,158,38,35,250,22,73,2,20,248,22,73,249,22,
73,248,22,73,2,21,248,22,64,23,202,2,251,22,73,2,17,2,21,2,21, 73,248,22,73,2,21,248,22,64,23,202,2,251,22,73,2,17,2,21,2,21,
249,22,63,2,9,248,22,65,23,205,1,18,100,11,8,31,8,30,8,29,8, 249,22,63,2,9,248,22,65,23,205,1,18,100,11,8,31,8,30,8,29,8,
28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,56,48,56,52,16,4, 28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,56,49,54,54,16,4,
11,11,2,19,3,1,7,101,110,118,56,48,56,53,248,22,190,3,193,27,248, 11,11,2,19,3,1,7,101,110,118,56,49,54,55,248,22,190,3,193,27,248,
22,190,3,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22, 22,190,3,194,249,22,63,248,22,73,248,22,64,196,248,22,65,195,27,248,22,
65,248,22,190,3,23,197,1,249,22,183,3,80,158,38,35,28,248,22,51,248, 65,248,22,190,3,23,197,1,249,22,183,3,80,158,38,35,28,248,22,51,248,
22,184,3,248,22,64,23,198,2,27,249,22,2,32,0,89,162,8,44,36,42, 22,184,3,248,22,64,23,198,2,27,249,22,2,32,0,89,162,8,44,36,42,
@ -65,8 +65,8 @@
251,22,73,2,17,28,249,22,151,8,248,22,184,3,248,22,64,23,201,2,64, 251,22,73,2,17,28,249,22,151,8,248,22,184,3,248,22,64,23,201,2,64,
101,108,115,101,10,248,22,64,23,198,2,250,22,74,2,20,9,248,22,65,23, 101,108,115,101,10,248,22,64,23,198,2,250,22,74,2,20,9,248,22,65,23,
201,1,249,22,63,2,6,248,22,65,23,203,1,99,8,31,8,30,8,29,8, 201,1,249,22,63,2,6,248,22,65,23,203,1,99,8,31,8,30,8,29,8,
28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,56,49,48,55,16,4, 28,8,27,16,4,11,11,2,18,3,1,7,101,110,118,56,49,56,57,16,4,
11,11,2,19,3,1,7,101,110,118,56,49,48,56,18,158,94,10,64,118,111, 11,11,2,19,3,1,7,101,110,118,56,49,57,48,18,158,94,10,64,118,111,
105,100,8,47,27,248,22,65,248,22,190,3,196,249,22,183,3,80,158,38,35, 105,100,8,47,27,248,22,65,248,22,190,3,196,249,22,183,3,80,158,38,35,
28,248,22,51,248,22,184,3,248,22,64,197,250,22,73,2,26,248,22,73,248, 28,248,22,51,248,22,184,3,248,22,64,197,250,22,73,2,26,248,22,73,248,
22,64,199,248,22,88,198,27,248,22,184,3,248,22,64,197,250,22,73,2,26, 22,64,199,248,22,88,198,27,248,22,184,3,248,22,64,197,250,22,73,2,26,
@ -99,7 +99,7 @@
EVAL_ONE_SIZED_STR((char *)expr, 2031); EVAL_ONE_SIZED_STR((char *)expr, 2031);
} }
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,48,46,50,46,54,59,0,0,0,1,0,0,3,0,16,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,48,46,49,59,0,0,0,1,0,0,3,0,16,0,
21,0,38,0,53,0,71,0,87,0,97,0,115,0,135,0,151,0,169,0,200, 21,0,38,0,53,0,71,0,87,0,97,0,115,0,135,0,151,0,169,0,200,
0,229,0,251,0,9,1,15,1,29,1,34,1,44,1,52,1,80,1,112,1, 0,229,0,251,0,9,1,15,1,29,1,34,1,44,1,52,1,80,1,112,1,
157,1,202,1,226,1,9,2,11,2,68,2,158,3,199,3,33,5,137,5,241, 157,1,202,1,226,1,9,2,11,2,68,2,158,3,199,3,33,5,137,5,241,
@ -343,12 +343,12 @@
EVAL_ONE_SIZED_STR((char *)expr, 5056); EVAL_ONE_SIZED_STR((char *)expr, 5056);
} }
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,48,46,50,46,54,8,0,0,0,1,0,0,6,0,19,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,48,46,49,8,0,0,0,1,0,0,6,0,19,0,
34,0,48,0,62,0,76,0,111,0,0,0,241,0,0,0,65,113,117,111,116, 34,0,48,0,62,0,76,0,111,0,0,0,241,0,0,0,65,113,117,111,116,
101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35,37, 101,29,94,2,1,67,35,37,117,116,105,108,115,11,29,94,2,1,69,35,37,
110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122, 110,101,116,119,111,114,107,11,29,94,2,1,68,35,37,112,97,114,97,109,122,
11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68,35, 11,29,94,2,1,68,35,37,101,120,112,111,98,115,11,29,94,2,1,68,35,
37,107,101,114,110,101,108,11,98,10,35,11,8,165,220,97,159,2,2,35,35, 37,107,101,114,110,101,108,11,98,10,35,11,8,182,221,97,159,2,2,35,35,
159,2,3,35,35,159,2,4,35,35,159,2,5,35,35,159,2,6,35,35,16, 159,2,3,35,35,159,2,4,35,35,159,2,5,35,35,159,2,6,35,35,16,
0,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83,158,41,20, 0,159,35,20,103,159,35,16,1,65,98,101,103,105,110,16,0,83,158,41,20,
100,137,69,35,37,98,117,105,108,116,105,110,29,11,11,10,10,18,96,11,42, 100,137,69,35,37,98,117,105,108,116,105,110,29,11,11,10,10,18,96,11,42,
@ -360,7 +360,7 @@
EVAL_ONE_SIZED_STR((char *)expr, 278); EVAL_ONE_SIZED_STR((char *)expr, 278);
} }
{ {
static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,48,46,50,46,54,52,0,0,0,1,0,0,3,0,14,0, static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,52,46,49,46,48,46,49,52,0,0,0,1,0,0,3,0,14,0,
41,0,47,0,60,0,74,0,96,0,122,0,134,0,152,0,172,0,184,0,200, 41,0,47,0,60,0,74,0,96,0,122,0,134,0,152,0,172,0,184,0,200,
0,223,0,3,1,8,1,13,1,18,1,23,1,54,1,58,1,66,1,74,1, 0,223,0,3,1,8,1,13,1,18,1,23,1,54,1,58,1,66,1,74,1,
82,1,185,1,230,1,250,1,29,2,64,2,98,2,108,2,155,2,165,2,172, 82,1,185,1,230,1,250,1,29,2,64,2,98,2,108,2,155,2,165,2,172,

View File

@ -27,52 +27,51 @@
envionments, a.k.a. namespaces), and also implements much of the envionments, a.k.a. namespaces), and also implements much of the
initialization sequence (filling the initial namespace). */ initialization sequence (filling the initial namespace). */
#include "mzrt.h"
#include "schpriv.h" #include "schpriv.h"
#include "schminc.h" #include "schminc.h"
#include "schmach.h" #include "schmach.h"
#include "schexpobs.h" #include "schexpobs.h"
#if defined(UNIX_LIMIT_STACK) || defined(UNIX_LIMIT_FDSET_SIZE)
# include <signal.h>
# include <sys/time.h>
# include <sys/resource.h>
#endif
#ifdef MZ_USE_IRIX_SPROCS
# include "../gc/gc.h"
#endif
#define GLOBAL_TABLE_SIZE 500 #define GLOBAL_TABLE_SIZE 500
#define TABLE_CACHE_MAX_SIZE 2048
/* #define TIME_STARTUP_PROCESS */ /* #define TIME_STARTUP_PROCESS */
/* globals */ /* global flags */
int scheme_allow_set_undefined; int scheme_allow_set_undefined;
void scheme_set_allow_set_undefined(int v) { scheme_allow_set_undefined = v; } void scheme_set_allow_set_undefined(int v) { scheme_allow_set_undefined = v; }
int scheme_get_allow_set_undefined() { return scheme_allow_set_undefined; } int scheme_get_allow_set_undefined() { return scheme_allow_set_undefined; }
int scheme_starting_up; int scheme_starting_up;
/* global counters just need to be atomically incremented */
static int intdef_counter = 0;
static int builtin_ref_counter = 0;
static int env_uid_counter = 0;
/* globals READ-ONLY SHARED */
static Scheme_Object *kernel_symbol;
static Scheme_Env *kernel_env;
#define MAX_CONST_LOCAL_POS 64 #define MAX_CONST_LOCAL_POS 64
#define MAX_CONST_LOCAL_TYPES 2 #define MAX_CONST_LOCAL_TYPES 2
#define MAX_CONST_LOCAL_FLAG_VAL 2 #define MAX_CONST_LOCAL_FLAG_VAL 2
#define SCHEME_LOCAL_FLAGS_MASK 0x3 #define SCHEME_LOCAL_FLAGS_MASK 0x3
static Scheme_Object *scheme_local[MAX_CONST_LOCAL_POS][MAX_CONST_LOCAL_TYPES][MAX_CONST_LOCAL_FLAG_VAL + 1]; static Scheme_Object *scheme_local[MAX_CONST_LOCAL_POS][MAX_CONST_LOCAL_TYPES][MAX_CONST_LOCAL_FLAG_VAL + 1];
#define MAX_CONST_TOPLEVEL_DEPTH 16 #define MAX_CONST_TOPLEVEL_DEPTH 16
#define MAX_CONST_TOPLEVEL_POS 16 #define MAX_CONST_TOPLEVEL_POS 16
#define SCHEME_TOPLEVEL_FLAGS_MASK 0x3 #define SCHEME_TOPLEVEL_FLAGS_MASK 0x3
static Scheme_Object *toplevels[MAX_CONST_TOPLEVEL_DEPTH][MAX_CONST_TOPLEVEL_POS][SCHEME_TOPLEVEL_FLAGS_MASK + 1]; static Scheme_Object *toplevels[MAX_CONST_TOPLEVEL_DEPTH][MAX_CONST_TOPLEVEL_POS][SCHEME_TOPLEVEL_FLAGS_MASK + 1];
#define TABLE_CACHE_MAX_SIZE 2048 /* globals THREAD_LOCAL
Scheme_Hash_Table *toplevels_ht; * if locked theses are probably sharable*/
Scheme_Hash_Table *locals_ht[2]; static Scheme_Hash_Table *toplevels_ht;
static Scheme_Hash_Table *locals_ht[2];
Scheme_Env *scheme_initial_env; /* local functions */
static void make_kernel_env(void);
/* locals */ static void init_scheme_local();
static void make_init_env(void); static void init_toplevels();
static Scheme_Env *make_env(Scheme_Env *base, int toplevel_size); static Scheme_Env *make_env(Scheme_Env *base, int toplevel_size);
static Scheme_Env *make_empty_inited_env(int toplevel_size); static Scheme_Env *make_empty_inited_env(int toplevel_size);
@ -126,23 +125,19 @@ static Scheme_Object *write_resolve_prefix(Scheme_Object *obj);
static Scheme_Object *read_resolve_prefix(Scheme_Object *obj); static Scheme_Object *read_resolve_prefix(Scheme_Object *obj);
static void skip_certain_things(Scheme_Object *o, Scheme_Close_Custodian_Client *f, void *data); static void skip_certain_things(Scheme_Object *o, Scheme_Close_Custodian_Client *f, void *data);
int scheme_is_module_begin_env(Scheme_Comp_Env *env); int scheme_is_module_begin_env(Scheme_Comp_Env *env);
Scheme_Env *scheme_engine_instance_init();
Scheme_Env *scheme_place_instance_init();
static void place_instance_init_pre_kernel();
static Scheme_Env *place_instance_init_post_kernel();
#ifdef MZ_PRECISE_GC #ifdef MZ_PRECISE_GC
static void register_traversers(void); static void register_traversers(void);
#endif #endif
typedef Scheme_Object *(*Lazy_Macro_Fun)(Scheme_Object *, int); typedef Scheme_Object *(*Lazy_Macro_Fun)(Scheme_Object *, int);
static Scheme_Object *kernel_symbol;
static int intdef_counter = 0;
static int builtin_ref_counter = 0;
static int env_uid_counter;
#define ARBITRARY_USE 0x1 #define ARBITRARY_USE 0x1
#define CONSTRAINED_USE 0x2 #define CONSTRAINED_USE 0x2
#define WAS_SET_BANGED 0x4 #define WAS_SET_BANGED 0x4
@ -201,11 +196,32 @@ static void boot_module_resolver()
scheme_apply(boot, 0, NULL); scheme_apply(boot, 0, NULL);
} }
Scheme_Env *scheme_basic_env() void os_platform_init() {
{ #ifdef UNIX_LIMIT_STACK
Scheme_Env *env; struct rlimit rl;
getrlimit(RLIMIT_STACK, &rl);
if (rl.rlim_cur > UNIX_LIMIT_STACK) {
rl.rlim_cur = UNIX_LIMIT_STACK;
setrlimit(RLIMIT_STACK, &rl);
}
#endif
#ifdef UNIX_LIMIT_FDSET_SIZE
struct rlimit rl;
getrlimit(RLIMIT_NOFILE, &rl);
if (rl.rlim_cur > FD_SETSIZE) {
rl.rlim_cur = FD_SETSIZE;
setrlimit(RLIMIT_NOFILE, &rl);
}
#endif
}
Scheme_Env *scheme_restart_instance() {
Scheme_Env *env;
void *stack_base;
stack_base = (void *) scheme_get_current_os_thread_stack_base();
if (scheme_main_thread) {
/* Reset everything: */ /* Reset everything: */
scheme_do_close_managed(NULL, skip_certain_things); scheme_do_close_managed(NULL, skip_certain_things);
scheme_main_thread = NULL; scheme_main_thread = NULL;
@ -217,14 +233,13 @@ Scheme_Env *scheme_basic_env()
#endif #endif
scheme_reset_overflow(); scheme_reset_overflow();
scheme_make_thread(); scheme_make_thread(stack_base);
scheme_init_error_escape_proc(NULL); scheme_init_error_escape_proc(NULL);
scheme_init_module_resolver(); scheme_init_module_resolver();
env = scheme_make_empty_env(); env = scheme_make_empty_env();
scheme_install_initial_module_set(env); scheme_install_initial_module_set(env);
scheme_set_param(scheme_current_config(), MZCONFIG_ENV, scheme_set_param(scheme_current_config(), MZCONFIG_ENV, (Scheme_Object *)env);
(Scheme_Object *)env);
scheme_init_port_config(); scheme_init_port_config();
scheme_init_port_fun_config(); scheme_init_port_fun_config();
@ -238,128 +253,21 @@ Scheme_Env *scheme_basic_env()
return env; return env;
} }
#ifdef UNIX_LIMIT_STACK Scheme_Env *scheme_basic_env()
{ {
struct rlimit rl; Scheme_Env *env;
getrlimit(RLIMIT_STACK, &rl); if (scheme_main_thread) {
if (rl.rlim_cur > UNIX_LIMIT_STACK) { return scheme_restart_instance();
rl.rlim_cur = UNIX_LIMIT_STACK;
setrlimit(RLIMIT_STACK, &rl);
} }
env = scheme_engine_instance_init();
return env;
} }
#endif
#ifdef UNIX_LIMIT_FDSET_SIZE static void init_toplevel_local_offsets_hashtable_caches()
{ {
struct rlimit rl;
getrlimit(RLIMIT_NOFILE, &rl);
if (rl.rlim_cur > FD_SETSIZE) {
rl.rlim_cur = FD_SETSIZE;
setrlimit(RLIMIT_NOFILE, &rl);
}
}
#endif
#ifdef MZ_USE_IRIX_SPROCS
GC_INIT();
#endif
scheme_starting_up = 1;
#ifndef MZ_PRECISE_GC
scheme_init_setjumpup();
scheme_init_ephemerons();
#endif
#ifdef TIME_STARTUP_PROCESS
printf("#if 0\nbasic @ %ld\n", scheme_get_process_milliseconds());
#endif
scheme_init_stack_check();
scheme_init_overflow();
scheme_init_portable_case();
{
int i, k, cor;
#ifndef USE_TAGGED_ALLOCATION
GC_CAN_IGNORE Scheme_Local *all;
all = (Scheme_Local *)scheme_malloc_eternal(sizeof(Scheme_Local) * 3 * 2 * MAX_CONST_LOCAL_POS);
# ifdef MEMORY_COUNTING_ON
scheme_misc_count += sizeof(Scheme_Local) * 3 * 2 * MAX_CONST_LOCAL_POS;
# endif
#endif
for (i = 0; i < MAX_CONST_LOCAL_POS; i++) {
for (k = 0; k < 2; k++) {
for (cor = 0; cor < 3; cor++) {
Scheme_Object *v;
#ifndef USE_TAGGED_ALLOCATION
v = (Scheme_Object *)(all++);
#else
v = (Scheme_Object *)scheme_malloc_eternal_tagged(sizeof(Scheme_Local));
#endif
v->type = k + scheme_local_type;
SCHEME_LOCAL_POS(v) = i;
SCHEME_LOCAL_FLAGS(v) = cor;
scheme_local[i][k][cor] = v;
}
}
}
}
{
int i, k, cnst;
#ifndef USE_TAGGED_ALLOCATION
GC_CAN_IGNORE Scheme_Toplevel *all;
all = (Scheme_Toplevel *)scheme_malloc_eternal(sizeof(Scheme_Toplevel)
* MAX_CONST_TOPLEVEL_DEPTH
* MAX_CONST_TOPLEVEL_POS
* (SCHEME_TOPLEVEL_FLAGS_MASK + 1));
# ifdef MEMORY_COUNTING_ON
scheme_misc_count += (sizeof(Scheme_Toplevel)
* MAX_CONST_TOPLEVEL_DEPTH
* MAX_CONST_TOPLEVEL_POS
* (SCHEME_TOPLEVEL_FLAGS_MASK + 1));
# endif
#endif
for (i = 0; i < MAX_CONST_TOPLEVEL_DEPTH; i++) {
for (k = 0; k < MAX_CONST_TOPLEVEL_POS; k++) {
for (cnst = 0; cnst <= SCHEME_TOPLEVEL_FLAGS_MASK; cnst++) {
Scheme_Toplevel *v;
#ifndef USE_TAGGED_ALLOCATION
v = (all++);
#else
v = (Scheme_Toplevel *)scheme_malloc_eternal_tagged(sizeof(Scheme_Toplevel));
#endif
v->iso.so.type = scheme_toplevel_type;
v->depth = i;
v->position = k;
SCHEME_TOPLEVEL_FLAGS(v) = cnst;
toplevels[i][k][cnst] = (Scheme_Object *)v;
}
}
}
}
#ifdef MZ_PRECISE_GC
scheme_register_traversers();
register_traversers();
scheme_init_hash_key_procs();
#endif
scheme_init_true_false();
REGISTER_SO(toplevels_ht); REGISTER_SO(toplevels_ht);
REGISTER_SO(locals_ht[0]); REGISTER_SO(locals_ht[0]);
REGISTER_SO(locals_ht[1]); REGISTER_SO(locals_ht[1]);
@ -372,30 +280,85 @@ Scheme_Env *scheme_basic_env()
ht = scheme_make_hash_table(SCHEME_hash_ptr); ht = scheme_make_hash_table(SCHEME_hash_ptr);
locals_ht[1] = ht; locals_ht[1] = ht;
} }
}
/* READ-ONLY GLOBAL structures ONE-TIME initialization */
Scheme_Env *scheme_engine_instance_init() {
Scheme_Env *env;
void *stack_base;
stack_base = (void *) scheme_get_current_os_thread_stack_base();
os_platform_init();
#ifdef TIME_STARTUP_PROCESS #ifdef TIME_STARTUP_PROCESS
printf("pre-process @ %ld\n", scheme_get_process_milliseconds()); printf("#if 0\nengine_instance_init @ %ld\n", scheme_get_process_milliseconds());
#endif #endif
scheme_starting_up = 1;
scheme_init_portable_case();
init_scheme_local();
init_toplevels();
scheme_init_true_false();
#ifdef MZ_PRECISE_GC
scheme_register_traversers();
register_traversers();
scheme_init_hash_key_procs();
#endif
scheme_init_getenv(); /* checks PLTNOJIT */
#ifdef WINDOWS_PROCESSES #ifdef WINDOWS_PROCESSES
/* Must be called before first scheme_make_thread() */ /* Must be called before first scheme_make_thread() */
scheme_init_thread_memory(); scheme_init_thread_memory();
#endif #endif
scheme_init_getenv(); /* checks PLTNOJIT */
scheme_make_thread(); place_instance_init_pre_kernel(stack_base);
make_kernel_env();
env = place_instance_init_post_kernel();
return env;
}
static void place_instance_init_pre_kernel(void *stack_base) {
#ifdef TIME_STARTUP_PROCESS
printf("place_init @ %ld\n", scheme_get_process_milliseconds());
#endif
scheme_set_current_os_thread_stack_base(stack_base);
#ifndef MZ_PRECISE_GC
scheme_init_setjumpup();
scheme_init_ephemerons();
#endif
scheme_init_stack_check();
scheme_init_overflow();
init_toplevel_local_offsets_hashtable_caches();
#ifdef TIME_STARTUP_PROCESS
printf("pre-process @ %ld\n", scheme_get_process_milliseconds());
#endif
scheme_make_thread(stack_base);
#ifdef TIME_STARTUP_PROCESS #ifdef TIME_STARTUP_PROCESS
printf("process @ %ld\n", scheme_get_process_milliseconds()); printf("process @ %ld\n", scheme_get_process_milliseconds());
#endif #endif
}
make_init_env(); static Scheme_Env *place_instance_init_post_kernel() {
Scheme_Env *env;
env = scheme_make_empty_env(); env = scheme_make_empty_env();
scheme_set_param(scheme_current_config(), MZCONFIG_ENV, scheme_set_param(scheme_current_config(), MZCONFIG_ENV, (Scheme_Object *)env);
(Scheme_Object *)env);
scheme_init_memtrace(env); scheme_init_memtrace(env);
#ifndef NO_TCP_SUPPORT #ifndef NO_TCP_SUPPORT
scheme_init_network(env); scheme_init_network(env);
@ -428,7 +391,12 @@ Scheme_Env *scheme_basic_env()
return env; return env;
} }
static void make_init_env(void) Scheme_Env *scheme_place_instance_init(void *stack_base) {
place_instance_init_pre_kernel(stack_base);
return place_instance_init_post_kernel();
}
static void make_kernel_env(void)
{ {
Scheme_Env *env; Scheme_Env *env;
#ifdef TIME_STARTUP_PROCESS #ifdef TIME_STARTUP_PROCESS
@ -440,8 +408,8 @@ static void make_init_env(void)
scheme_set_param(scheme_current_config(), MZCONFIG_ENV, scheme_set_param(scheme_current_config(), MZCONFIG_ENV,
(Scheme_Object *)env); (Scheme_Object *)env);
REGISTER_SO(scheme_initial_env); REGISTER_SO(kernel_env);
scheme_initial_env = env; kernel_env = env;
scheme_defining_primitives = 1; scheme_defining_primitives = 1;
builtin_ref_counter = 0; builtin_ref_counter = 0;
@ -495,202 +463,52 @@ static void make_init_env(void)
#ifndef NO_REGEXP_UTILS #ifndef NO_REGEXP_UTILS
MZTIMEIT(regexp, scheme_regexp_initialize(env)); MZTIMEIT(regexp, scheme_regexp_initialize(env));
#endif #endif
#ifdef MZ_USE_PLACES
MZTIMEIT(places, scheme_init_place(env));
#endif
MARK_START_TIME(); MARK_START_TIME();
scheme_add_global_constant("namespace-symbol->identifier", GLOBAL_PRIM_W_ARITY("namespace-symbol->identifier", namespace_identifier, 1, 2, env);
scheme_make_prim_w_arity(namespace_identifier, GLOBAL_PRIM_W_ARITY("namespace-module-identifier", namespace_module_identifier, 0, 1, env);
"namespace-symbol->identifier", GLOBAL_PRIM_W_ARITY("namespace-base-phase", namespace_base_phase, 0, 1, env);
1, 2), GLOBAL_PRIM_W_ARITY("namespace-variable-value", namespace_variable_value, 1, 4, env);
env); GLOBAL_PRIM_W_ARITY("namespace-set-variable-value!", namespace_set_variable_value, 2, 4, env);
GLOBAL_PRIM_W_ARITY("namespace-undefine-variable!", namespace_undefine_variable, 1, 2, env);
GLOBAL_PRIM_W_ARITY("namespace-mapped-symbols", namespace_mapped_symbols, 0, 1, env);
GLOBAL_PRIM_W_ARITY("namespace-module-registry", namespace_module_registry, 1, 1, env);
scheme_add_global_constant("namespace-module-identifier", GLOBAL_PRIM_W_ARITY("variable-reference->resolved-module-path", variable_module_path, 1, 1, env);
scheme_make_prim_w_arity(namespace_module_identifier, GLOBAL_PRIM_W_ARITY("variable-reference->empty-namespace", variable_namespace, 1, 1, env);
"namespace-module-identifier", GLOBAL_PRIM_W_ARITY("variable-reference->namespace", variable_top_level_namespace, 1, 1, env);
0, 1), GLOBAL_PRIM_W_ARITY("variable-reference->phase", variable_phase, 1, 1, env);
env);
scheme_add_global_constant("namespace-base-phase",
scheme_make_prim_w_arity(namespace_base_phase,
"namespace-base-phase",
0, 1),
env);
GLOBAL_PRIM_W_ARITY("syntax-transforming?", now_transforming, 0, 0, env);
GLOBAL_PRIM_W_ARITY("syntax-local-value", local_exp_time_value, 1, 3, env);
GLOBAL_PRIM_W_ARITY("syntax-local-name", local_exp_time_name, 0, 0, env);
GLOBAL_PRIM_W_ARITY("syntax-local-context", local_context, 0, 0, env);
GLOBAL_PRIM_W_ARITY("syntax-local-phase-level", local_phase_level, 0, 0, env);
GLOBAL_PRIM_W_ARITY("syntax-local-make-definition-context", local_make_intdef_context, 0, 0, env);
GLOBAL_PRIM_W_ARITY("syntax-local-get-shadower", local_get_shadower, 1, 1, env);
GLOBAL_PRIM_W_ARITY("syntax-local-introduce", local_introduce, 1, 1, env);
GLOBAL_PRIM_W_ARITY("make-syntax-introducer", make_introducer, 0, 1, env);
GLOBAL_PRIM_W_ARITY("syntax-local-certifier", local_certify, 0, 1, env);
GLOBAL_PRIM_W_ARITY("syntax-local-module-exports", local_module_exports, 1, 1, env);
GLOBAL_PRIM_W_ARITY("syntax-local-module-defined-identifiers", local_module_definitions, 0, 0, env);
GLOBAL_PRIM_W_ARITY("syntax-local-module-required-identifiers", local_module_imports, 2, 2, env);
GLOBAL_PRIM_W_ARITY("syntax-local-transforming-module-provides?", local_module_expanding_provides, 0, 0, env);
scheme_add_global_constant("namespace-variable-value", GLOBAL_PRIM_W_ARITY("make-set!-transformer", make_set_transformer, 1, 1, env);
scheme_make_prim_w_arity(namespace_variable_value, GLOBAL_PRIM_W_ARITY("set!-transformer?", set_transformer_p, 1, 1, env);
"namespace-variable-value", GLOBAL_PRIM_W_ARITY("set!-transformer-procedure", set_transformer_proc, 1, 1, env);
1, 4),
env);
scheme_add_global_constant("namespace-set-variable-value!", GLOBAL_PRIM_W_ARITY("make-rename-transformer", make_rename_transformer, 1, 1, env);
scheme_make_prim_w_arity(namespace_set_variable_value, GLOBAL_PRIM_W_ARITY("rename-transformer?", rename_transformer_p, 1, 1, env);
"namespace-set-variable-value!", GLOBAL_PRIM_W_ARITY("rename-transformer-target", rename_transformer_target, 1, 1, env);
2, 4),
env);
scheme_add_global_constant("namespace-undefine-variable!", GLOBAL_PRIM_W_ARITY("syntax-local-lift-expression", local_lift_expr, 1, 1, env);
scheme_make_prim_w_arity(namespace_undefine_variable, GLOBAL_PRIM_W_ARITY("syntax-local-lift-context", local_lift_context, 0, 0, env);
"namespace-undefine-variable!", GLOBAL_PRIM_W_ARITY("syntax-local-lift-module-end-declaration", local_lift_end_statement, 1, 1, env);
1, 2),
env);
scheme_add_global_constant("namespace-mapped-symbols",
scheme_make_prim_w_arity(namespace_mapped_symbols,
"namespace-mapped-symbols",
0, 1),
env);
scheme_add_global_constant("namespace-module-registry",
scheme_make_prim_w_arity(namespace_module_registry,
"namespace-module-registry",
1, 1),
env);
scheme_add_global_constant("variable-reference->resolved-module-path",
scheme_make_prim_w_arity(variable_module_path,
"variable-reference->resolved-module-path",
1, 1),
env);
scheme_add_global_constant("variable-reference->empty-namespace",
scheme_make_prim_w_arity(variable_namespace,
"variable-reference->empty-namespace",
1, 1),
env);
scheme_add_global_constant("variable-reference->namespace",
scheme_make_prim_w_arity(variable_top_level_namespace,
"variable-reference->namespace",
1, 1),
env);
scheme_add_global_constant("variable-reference->phase",
scheme_make_prim_w_arity(variable_phase,
"variable-reference->phase",
1, 1),
env);
scheme_add_global_constant("syntax-transforming?",
scheme_make_prim_w_arity(now_transforming,
"syntax-transforming?",
0, 0),
env);
scheme_add_global_constant("syntax-local-value",
scheme_make_prim_w_arity(local_exp_time_value,
"syntax-local-value",
1, 3),
env);
scheme_add_global_constant("syntax-local-name",
scheme_make_prim_w_arity(local_exp_time_name,
"syntax-local-name",
0, 0),
env);
scheme_add_global_constant("syntax-local-context",
scheme_make_prim_w_arity(local_context,
"syntax-local-context",
0, 0),
env);
scheme_add_global_constant("syntax-local-phase-level",
scheme_make_prim_w_arity(local_phase_level,
"syntax-local-phase-level",
0, 0),
env);
scheme_add_global_constant("syntax-local-make-definition-context",
scheme_make_prim_w_arity(local_make_intdef_context,
"syntax-local-make-definition-context",
0, 0),
env);
scheme_add_global_constant("syntax-local-get-shadower",
scheme_make_prim_w_arity(local_get_shadower,
"syntax-local-get-shadower",
1, 1),
env);
scheme_add_global_constant("syntax-local-introduce",
scheme_make_prim_w_arity(local_introduce,
"syntax-local-introduce",
1, 1),
env);
scheme_add_global_constant("make-syntax-introducer",
scheme_make_prim_w_arity(make_introducer,
"make-syntax-introducer",
0, 1),
env);
scheme_add_global_constant("syntax-local-certifier",
scheme_make_prim_w_arity(local_certify,
"syntax-local-certifier",
0, 1),
env);
scheme_add_global_constant("syntax-local-module-exports",
scheme_make_prim_w_arity(local_module_exports,
"syntax-local-module-exports",
1, 1),
env);
scheme_add_global_constant("syntax-local-module-defined-identifiers",
scheme_make_prim_w_arity(local_module_definitions,
"syntax-local-module-defined-identifiers",
0, 0),
env);
scheme_add_global_constant("syntax-local-module-required-identifiers",
scheme_make_prim_w_arity(local_module_imports,
"syntax-local-module-required-identifiers",
2, 2),
env);
scheme_add_global_constant("syntax-local-transforming-module-provides?",
scheme_make_prim_w_arity(local_module_expanding_provides,
"syntax-local-transforming-module-provides?",
0, 0),
env);
scheme_add_global_constant("make-set!-transformer",
scheme_make_prim_w_arity(make_set_transformer,
"make-set!-transformer",
1, 1),
env);
scheme_add_global_constant("set!-transformer?",
scheme_make_prim_w_arity(set_transformer_p,
"set!-transformer?",
1, 1),
env);
scheme_add_global_constant("set!-transformer-procedure",
scheme_make_prim_w_arity(set_transformer_proc,
"set!-transformer-procedure",
1, 1),
env);
scheme_add_global_constant("make-rename-transformer",
scheme_make_prim_w_arity(make_rename_transformer,
"make-rename-transformer",
1, 1),
env);
scheme_add_global_constant("rename-transformer?",
scheme_make_prim_w_arity(rename_transformer_p,
"rename-transformer?",
1, 1),
env);
scheme_add_global_constant("rename-transformer-target",
scheme_make_prim_w_arity(rename_transformer_target,
"rename-transformer-target",
1, 1),
env);
scheme_add_global_constant("syntax-local-lift-expression",
scheme_make_prim_w_arity(local_lift_expr,
"syntax-local-lift-expression",
1, 1),
env);
scheme_add_global_constant("syntax-local-lift-context",
scheme_make_prim_w_arity(local_lift_context,
"syntax-local-lift-context",
0, 0),
env);
scheme_add_global_constant("syntax-local-lift-module-end-declaration",
scheme_make_prim_w_arity(local_lift_end_statement,
"syntax-local-lift-module-end-declaration",
1, 1),
env);
{ {
Scheme_Object *sym; Scheme_Object *sym;
@ -732,6 +550,88 @@ static void make_init_env(void)
scheme_defining_primitives = 0; scheme_defining_primitives = 0;
} }
int scheme_is_kernel_env(Scheme_Env *env) {
return (env == kernel_env);
}
Scheme_Env *scheme_get_kernel_env() {
return kernel_env;
}
static void init_scheme_local()
{
int i, k, cor;
#ifndef USE_TAGGED_ALLOCATION
GC_CAN_IGNORE Scheme_Local *all;
all = (Scheme_Local *)scheme_malloc_eternal(sizeof(Scheme_Local) * 3 * 2 * MAX_CONST_LOCAL_POS);
# ifdef MEMORY_COUNTING_ON
scheme_misc_count += sizeof(Scheme_Local) * 3 * 2 * MAX_CONST_LOCAL_POS;
# endif
#endif
for (i = 0; i < MAX_CONST_LOCAL_POS; i++) {
for (k = 0; k < 2; k++) {
for (cor = 0; cor < 3; cor++) {
Scheme_Object *v;
#ifndef USE_TAGGED_ALLOCATION
v = (Scheme_Object *)(all++);
#else
v = (Scheme_Object *)scheme_malloc_eternal_tagged(sizeof(Scheme_Local));
#endif
v->type = k + scheme_local_type;
SCHEME_LOCAL_POS(v) = i;
SCHEME_LOCAL_FLAGS(v) = cor;
scheme_local[i][k][cor] = v;
}
}
}
}
static void init_toplevels()
{
int i, k, cnst;
#ifndef USE_TAGGED_ALLOCATION
GC_CAN_IGNORE Scheme_Toplevel *all;
all = (Scheme_Toplevel *)scheme_malloc_eternal(sizeof(Scheme_Toplevel)
* MAX_CONST_TOPLEVEL_DEPTH
* MAX_CONST_TOPLEVEL_POS
* (SCHEME_TOPLEVEL_FLAGS_MASK + 1));
# ifdef MEMORY_COUNTING_ON
scheme_misc_count += (sizeof(Scheme_Toplevel)
* MAX_CONST_TOPLEVEL_DEPTH
* MAX_CONST_TOPLEVEL_POS
* (SCHEME_TOPLEVEL_FLAGS_MASK + 1));
# endif
#endif
for (i = 0; i < MAX_CONST_TOPLEVEL_DEPTH; i++) {
for (k = 0; k < MAX_CONST_TOPLEVEL_POS; k++) {
for (cnst = 0; cnst <= SCHEME_TOPLEVEL_FLAGS_MASK; cnst++) {
Scheme_Toplevel *v;
#ifndef USE_TAGGED_ALLOCATION
v = (all++);
#else
v = (Scheme_Toplevel *)scheme_malloc_eternal_tagged(sizeof(Scheme_Toplevel));
#endif
v->iso.so.type = scheme_toplevel_type;
v->depth = i;
v->position = k;
SCHEME_TOPLEVEL_FLAGS(v) = cnst;
toplevels[i][k][cnst] = (Scheme_Object *)v;
}
}
}
}
/* Shutdown procedure for resetting a namespace: */ /* Shutdown procedure for resetting a namespace: */
static void skip_certain_things(Scheme_Object *o, Scheme_Close_Custodian_Client *f, void *data) static void skip_certain_things(Scheme_Object *o, Scheme_Close_Custodian_Client *f, void *data)
{ {
@ -1238,6 +1138,7 @@ Scheme_Object **scheme_make_builtin_references_table(void)
Scheme_Bucket_Table *ht; Scheme_Bucket_Table *ht;
Scheme_Object **t; Scheme_Object **t;
Scheme_Bucket **bs; Scheme_Bucket **bs;
Scheme_Env *kenv;
long i; long i;
t = MALLOC_N(Scheme_Object *, (builtin_ref_counter + 1)); t = MALLOC_N(Scheme_Object *, (builtin_ref_counter + 1));
@ -1245,7 +1146,9 @@ Scheme_Object **scheme_make_builtin_references_table(void)
scheme_misc_count += sizeof(Scheme_Object *) * (builtin_ref_counter + 1); scheme_misc_count += sizeof(Scheme_Object *) * (builtin_ref_counter + 1);
#endif #endif
ht = scheme_initial_env->toplevel; kenv = scheme_get_kernel_env();
ht = kenv->toplevel;
bs = ht->buckets; bs = ht->buckets;
@ -1263,9 +1166,12 @@ Scheme_Hash_Table *scheme_map_constants_to_globals(void)
Scheme_Bucket_Table *ht; Scheme_Bucket_Table *ht;
Scheme_Hash_Table*result; Scheme_Hash_Table*result;
Scheme_Bucket **bs; Scheme_Bucket **bs;
Scheme_Env *kenv;
long i; long i;
ht = scheme_initial_env->toplevel; kenv = scheme_get_kernel_env();
ht = kenv->toplevel;
bs = ht->buckets; bs = ht->buckets;
result = scheme_make_hash_table(SCHEME_hash_ptr); result = scheme_make_hash_table(SCHEME_hash_ptr);
@ -4808,7 +4714,7 @@ static Scheme_Object *read_variable(Scheme_Object *obj)
varname = SCHEME_CDR(obj); varname = SCHEME_CDR(obj);
if (SAME_OBJ(modname, kernel_symbol) && !mod_phase) { if (SAME_OBJ(modname, kernel_symbol) && !mod_phase) {
return (Scheme_Object *)scheme_global_bucket(varname, scheme_initial_env); return (Scheme_Object *)scheme_global_bucket(varname, scheme_get_kernel_env());
} else { } else {
Module_Variable *mv; Module_Variable *mv;
Scheme_Object *insp; Scheme_Object *insp;

View File

@ -247,8 +247,8 @@ static Scheme_Object *_eval_compiled_multi_with_prompt(Scheme_Object *obj, Schem
typedef void (*DW_PrePost_Proc)(void *); typedef void (*DW_PrePost_Proc)(void *);
#ifdef USE_STACK_BOUNDARY_VAR #ifdef USE_STACK_BOUNDARY_VAR
unsigned long scheme_stack_boundary; THREAD_LOCAL unsigned long scheme_stack_boundary;
unsigned long volatile scheme_jit_stack_boundary; THREAD_LOCAL unsigned long volatile scheme_jit_stack_boundary;
#endif #endif
#ifdef MZ_PRECISE_GC #ifdef MZ_PRECISE_GC
@ -532,17 +532,19 @@ scheme_handle_stack_overflow(Scheme_Object *(*k)(void))
scheme_about_to_move_C_stack(); scheme_about_to_move_C_stack();
scheme_overflow_k = k; p->overflow_k = k;
scheme_overflow_count++; scheme_overflow_count++;
overflow = MALLOC_ONE_RT(Scheme_Overflow); overflow = MALLOC_ONE_RT(Scheme_Overflow);
#ifdef MZTAG_REQUIRED #ifdef MZTAG_REQUIRED
overflow->type = scheme_rt_overflow; overflow->type = scheme_rt_overflow;
#endif #endif
/* push old overflow */
overflow->prev = scheme_current_thread->overflow; overflow->prev = scheme_current_thread->overflow;
overflow->stack_start = p->stack_start;
p->overflow = overflow; p->overflow = overflow;
overflow->stack_start = p->stack_start;
jmp = MALLOC_ONE_RT(Scheme_Overflow_Jmp); jmp = MALLOC_ONE_RT(Scheme_Overflow_Jmp);
#ifdef MZTAG_REQUIRED #ifdef MZTAG_REQUIRED
jmp->type = scheme_rt_overflow_jmp; jmp->type = scheme_rt_overflow_jmp;
@ -551,6 +553,7 @@ scheme_handle_stack_overflow(Scheme_Object *(*k)(void))
scheme_init_jmpup_buf(&overflow->jmp->cont); scheme_init_jmpup_buf(&overflow->jmp->cont);
scheme_zero_unneeded_rands(scheme_current_thread); /* for GC */ scheme_zero_unneeded_rands(scheme_current_thread); /* for GC */
if (scheme_setjmpup(&overflow->jmp->cont, overflow->jmp, p->stack_start)) { if (scheme_setjmpup(&overflow->jmp->cont, overflow->jmp, p->stack_start)) {
p = scheme_current_thread; p = scheme_current_thread;
overflow = p->overflow; overflow = p->overflow;
@ -620,7 +623,7 @@ void scheme_init_stack_check()
#ifdef USE_STACK_BOUNDARY_VAR #ifdef USE_STACK_BOUNDARY_VAR
if (!scheme_stack_boundary) { if (!scheme_stack_boundary) {
# ifdef ASSUME_FIXED_STACK_SIZE # ifdef ASSUME_FIXED_STACK_SIZE
scheme_stack_boundary = scheme_get_stack_base(); scheme_stack_boundary = scheme_get_current_os_thread_stack_base();
if (stack_grows_up) if (stack_grows_up)
scheme_stack_boundary += (FIXED_STACK_SIZE - STACK_SAFETY_MARGIN); scheme_stack_boundary += (FIXED_STACK_SIZE - STACK_SAFETY_MARGIN);
else else
@ -628,7 +631,7 @@ void scheme_init_stack_check()
# endif # endif
# ifdef WINDOWS_FIND_STACK_BOUNDS # ifdef WINDOWS_FIND_STACK_BOUNDS
scheme_stack_boundary = scheme_get_stack_base(); scheme_stack_boundary = scheme_get_current_os_thread_stack_base();
scheme_stack_boundary += (STACK_SAFETY_MARGIN - 0x100000); scheme_stack_boundary += (STACK_SAFETY_MARGIN - 0x100000);
# endif # endif
@ -661,7 +664,7 @@ void scheme_init_stack_check()
{ {
unsigned long bnd, lim; unsigned long bnd, lim;
bnd = (unsigned long)scheme_get_stack_base(); bnd = (unsigned long)scheme_get_current_os_thread_stack_base();
lim = (unsigned long)rl.rlim_cur; lim = (unsigned long)rl.rlim_cur;
# ifdef UNIX_STACK_MAXIMUM # ifdef UNIX_STACK_MAXIMUM

View File

@ -1809,8 +1809,8 @@ static void initialize_prompt(Scheme_Thread *p, Scheme_Prompt *prompt, void *sta
typedef Scheme_Object *(*Overflow_K_Proc)(void); typedef Scheme_Object *(*Overflow_K_Proc)(void);
Scheme_Overflow_Jmp *scheme_overflow_jmp; THREAD_LOCAL Scheme_Overflow_Jmp *scheme_overflow_jmp;
void *scheme_overflow_stack_start; THREAD_LOCAL void *scheme_overflow_stack_start;
/* private, but declared public to avoid inlining: */ /* private, but declared public to avoid inlining: */
void scheme_really_create_overflow(void *stack_base) void scheme_really_create_overflow(void *stack_base)
@ -1830,7 +1830,7 @@ void scheme_really_create_overflow(void *stack_base)
scheme_init_jmpup_buf(&jmp->cont); scheme_init_jmpup_buf(&jmp->cont);
if (scheme_setjmpup(&jmp->cont, jmp, stack_base)) { if (scheme_setjmpup(&jmp->cont, jmp, stack_base)) {
/* A jump into here is a request to handle overflow. /* A jump into here is a request to handle overflow.
The way to continue is in scheme_overflow_k. The way to continue is in p->overflow_k.
When we get back, put the result into When we get back, put the result into
scheme_overflow_reply. The route to return is scheme_overflow_reply. The route to return is
in the thread's `overflow' field. */ in the thread's `overflow' field. */
@ -1850,7 +1850,7 @@ void scheme_really_create_overflow(void *stack_base)
} else { } else {
void *p1, *p2, *p3, *p4, *p5; void *p1, *p2, *p3, *p4, *p5;
long i1, i2, i3, i4; long i1, i2, i3, i4;
Overflow_K_Proc f = scheme_overflow_k; Overflow_K_Proc f = p->overflow_k;
Scheme_Object *reply; Scheme_Object *reply;
p1 = p->ku.k.p1; p1 = p->ku.k.p1;

View File

@ -321,136 +321,31 @@ void scheme_init_module(Scheme_Env *env)
scheme_init_module_resolver(); scheme_init_module_resolver();
scheme_add_global_constant("current-module-name-resolver", GLOBAL_PARAMETER("current-module-name-resolver", current_module_name_resolver, MZCONFIG_CURRENT_MODULE_RESOLVER, env);
scheme_register_parameter(current_module_name_resolver, GLOBAL_PARAMETER("current-module-declare-name", current_module_name_prefix, MZCONFIG_CURRENT_MODULE_NAME, env);
"current-module-name-resolver",
MZCONFIG_CURRENT_MODULE_RESOLVER),
env);
scheme_add_global_constant("current-module-declare-name",
scheme_register_parameter(current_module_name_prefix,
"current-module-declare-name",
MZCONFIG_CURRENT_MODULE_NAME),
env);
scheme_add_global_constant("dynamic-require", GLOBAL_PRIM_W_ARITY("dynamic-require", scheme_dynamic_require, 2, 2, env);
scheme_make_prim_w_arity(scheme_dynamic_require, GLOBAL_PRIM_W_ARITY("dynamic-require-for-syntax", dynamic_require_for_syntax, 2, 2, env);
"dynamic-require", GLOBAL_PRIM_W_ARITY("namespace-require", namespace_require, 1, 1, env);
2, 2), GLOBAL_PRIM_W_ARITY("namespace-attach-module", namespace_attach_module, 2, 3, env);
env); GLOBAL_PRIM_W_ARITY("namespace-unprotect-module", namespace_unprotect_module, 2, 3, env);
scheme_add_global_constant("dynamic-require-for-syntax", GLOBAL_PRIM_W_ARITY("namespace-require/copy", namespace_require_copy, 1, 1, env);
scheme_make_prim_w_arity(dynamic_require_for_syntax, GLOBAL_PRIM_W_ARITY("namespace-require/constant", namespace_require_constant, 1, 1, env);
"dynamic-require-for-syntax", GLOBAL_PRIM_W_ARITY("namespace-require/expansion-time", namespace_require_etonly, 1, 1, env);
2, 2), GLOBAL_PRIM_W_ARITY("compiled-module-expression?", module_compiled_p, 1, 1, env);
env); GLOBAL_PRIM_W_ARITY("module-compiled-name", module_compiled_name, 1, 1, env);
scheme_add_global_constant("namespace-require", GLOBAL_PRIM_W_ARITY("module-compiled-imports", module_compiled_imports, 1, 1, env);
scheme_make_prim_w_arity(namespace_require, GLOBAL_PRIM_W_ARITY2("module-compiled-exports", module_compiled_exports, 1, 1, 2, 2, env);
"namespace-require", GLOBAL_FOLDING_PRIM("module-path-index?", module_path_index_p, 1, 1, 1, env);
1, 1), GLOBAL_PRIM_W_ARITY("module-path-index-resolve", module_path_index_resolve, 1, 1, env);
env); GLOBAL_PRIM_W_ARITY2("module-path-index-split", module_path_index_split, 1, 1, 2, 2, env);
scheme_add_global_constant("namespace-attach-module", GLOBAL_PRIM_W_ARITY("module-path-index-join", module_path_index_join, 2, 2, env);
scheme_make_prim_w_arity(namespace_attach_module, GLOBAL_FOLDING_PRIM("resolved-module-path?", resolved_module_path_p, 1, 1, 1, env);
"namespace-attach-module", GLOBAL_PRIM_W_ARITY("make-resolved-module-path", make_resolved_module_path, 1, 1, env);
2, 3), GLOBAL_PRIM_W_ARITY("resolved-module-path-name", resolved_module_path_name, 1, 1, env);
env); GLOBAL_PRIM_W_ARITY("module-provide-protected?", module_export_protected_p, 2, 2, env);
scheme_add_global_constant("namespace-unprotect-module", GLOBAL_PRIM_W_ARITY("module->namespace", module_to_namespace, 1, 1, env);
scheme_make_prim_w_arity(namespace_unprotect_module, GLOBAL_PRIM_W_ARITY("module-path?", is_module_path, 1, 1, env);
"namespace-unprotect-module",
2, 3),
env);
scheme_add_global_constant("namespace-require/copy",
scheme_make_prim_w_arity(namespace_require_copy,
"namespace-require/copy",
1, 1),
env);
scheme_add_global_constant("namespace-require/constant",
scheme_make_prim_w_arity(namespace_require_constant,
"namespace-require/constant",
1, 1),
env);
scheme_add_global_constant("namespace-require/expansion-time",
scheme_make_prim_w_arity(namespace_require_etonly,
"namespace-require/expansion-time",
1, 1),
env);
scheme_add_global_constant("compiled-module-expression?",
scheme_make_prim_w_arity(module_compiled_p,
"compiled-module-expression?",
1, 1),
env);
scheme_add_global_constant("module-compiled-name",
scheme_make_prim_w_arity(module_compiled_name,
"module-compiled-name",
1, 1),
env);
scheme_add_global_constant("module-compiled-imports",
scheme_make_prim_w_arity(module_compiled_imports,
"module-compiled-imports",
1, 1),
env);
scheme_add_global_constant("module-compiled-exports",
scheme_make_prim_w_arity2(module_compiled_exports,
"module-compiled-exports",
1, 1,
2, 2),
env);
scheme_add_global_constant("module-path-index?",
scheme_make_folding_prim(module_path_index_p,
"module-path-index?",
1, 1, 1),
env);
scheme_add_global_constant("module-path-index-resolve",
scheme_make_prim_w_arity(module_path_index_resolve,
"module-path-index-resolve",
1, 1),
env);
scheme_add_global_constant("module-path-index-split",
scheme_make_prim_w_arity2(module_path_index_split,
"module-path-index-split",
1, 1,
2, 2),
env);
scheme_add_global_constant("module-path-index-join",
scheme_make_prim_w_arity(module_path_index_join,
"module-path-index-join",
2, 2),
env);
scheme_add_global_constant("resolved-module-path?",
scheme_make_folding_prim(resolved_module_path_p,
"resolved-module-path?",
1, 1, 1),
env);
scheme_add_global_constant("make-resolved-module-path",
scheme_make_prim_w_arity(make_resolved_module_path,
"make-resolved-module-path",
1, 1),
env);
scheme_add_global_constant("resolved-module-path-name",
scheme_make_prim_w_arity(resolved_module_path_name,
"resolved-module-path-name",
1, 1),
env);
scheme_add_global_constant("module-provide-protected?",
scheme_make_prim_w_arity(module_export_protected_p,
"module-provide-protected?",
2, 2),
env);
scheme_add_global_constant("module->namespace",
scheme_make_prim_w_arity(module_to_namespace,
"module->namespace",
1, 1),
env);
scheme_add_global_constant("module-path?",
scheme_make_prim_w_arity(is_module_path,
"module-path?",
1, 1),
env);
} }
void scheme_init_module_resolver(void) void scheme_init_module_resolver(void)
@ -487,8 +382,8 @@ void scheme_finish_kernel(Scheme_Env *env)
insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR); insp = scheme_get_param(scheme_current_config(), MZCONFIG_CODE_INSPECTOR);
scheme_initial_env->module = kernel; env->module = kernel;
scheme_initial_env->insp = insp; env->insp = insp;
kernel->modname = kernel_modname; kernel->modname = kernel_modname;
kernel->requires = scheme_null; kernel->requires = scheme_null;
@ -503,9 +398,9 @@ void scheme_finish_kernel(Scheme_Env *env)
count = 0; count = 0;
for (j = 0; j < 2; j++) { for (j = 0; j < 2; j++) {
if (!j) if (!j)
ht = scheme_initial_env->toplevel; ht = env->toplevel;
else { else {
ht = scheme_initial_env->syntax; ht = env->syntax;
syntax_start = count; syntax_start = count;
} }
@ -521,9 +416,9 @@ void scheme_finish_kernel(Scheme_Env *env)
count = 0; count = 0;
for (j = 0; j < 2; j++) { for (j = 0; j < 2; j++) {
if (!j) if (!j)
ht = scheme_initial_env->toplevel; ht = env->toplevel;
else else
ht = scheme_initial_env->syntax; ht = env->syntax;
bs = ht->buckets; bs = ht->buckets;
for (i = ht->size; i--; ) { for (i = ht->size; i--; ) {
@ -550,9 +445,9 @@ void scheme_finish_kernel(Scheme_Env *env)
kernel->me->rt->num_provides = count; kernel->me->rt->num_provides = count;
kernel->me->rt->num_var_provides = syntax_start; kernel->me->rt->num_var_provides = syntax_start;
scheme_initial_env->running = 1; env->running = 1;
scheme_initial_env->et_running = 1; env->et_running = 1;
scheme_initial_env->attached = 1; env->attached = 1;
/* Since this is the first module rename, it's registered as /* Since this is the first module rename, it's registered as
the kernel module rename: */ the kernel module rename: */
@ -3160,7 +3055,7 @@ static void setup_accessible_table(Scheme_Module *m)
Scheme_Env *scheme_module_access(Scheme_Object *name, Scheme_Env *env, int rev_mod_phase) Scheme_Env *scheme_module_access(Scheme_Object *name, Scheme_Env *env, int rev_mod_phase)
{ {
if ((name == kernel_modname) && !rev_mod_phase) if ((name == kernel_modname) && !rev_mod_phase)
return scheme_initial_env; return scheme_get_kernel_env();
else { else {
Scheme_Object *chain; Scheme_Object *chain;
Scheme_Env *menv; Scheme_Env *menv;
@ -3244,9 +3139,8 @@ Scheme_Object *scheme_check_accessible_in_module(Scheme_Env *env, Scheme_Object
{ {
symbol = scheme_tl_id_sym(env, symbol, NULL, 0, NULL); symbol = scheme_tl_id_sym(env, symbol, NULL, 0, NULL);
if ((env == scheme_initial_env) if (scheme_is_kernel_env(env)
|| ((env->module->primitive || ((env->module->primitive && !env->module->provide_protects))
&& !env->module->provide_protects))
/* For now[?], we're pretending that all definitions exists for /* For now[?], we're pretending that all definitions exists for
non-0 local phase. */ non-0 local phase. */
|| env->mod_phase) { || env->mod_phase) {
@ -3404,8 +3298,10 @@ int scheme_module_export_position(Scheme_Object *modname, Scheme_Env *env, Schem
Scheme_Object *scheme_module_syntax(Scheme_Object *modname, Scheme_Env *env, Scheme_Object *name) Scheme_Object *scheme_module_syntax(Scheme_Object *modname, Scheme_Env *env, Scheme_Object *name)
{ {
if (modname == kernel_modname) { if (modname == kernel_modname) {
Scheme_Env *kenv;
kenv = scheme_get_kernel_env();
name = SCHEME_STX_SYM(name); name = SCHEME_STX_SYM(name);
return scheme_lookup_in_table(scheme_initial_env->syntax, (char *)name); return scheme_lookup_in_table(kenv->syntax, (char *)name);
} else { } else {
Scheme_Env *menv; Scheme_Env *menv;
Scheme_Object *val; Scheme_Object *val;
@ -4491,7 +4387,7 @@ module_execute(Scheme_Object *data)
env = scheme_environment_from_dummy(m->dummy); env = scheme_environment_from_dummy(m->dummy);
if (SAME_OBJ(m->modname, kernel_modname)) if (SAME_OBJ(m->modname, kernel_modname))
old_menv = scheme_initial_env; old_menv = scheme_get_kernel_env();
else else
old_menv = (Scheme_Env *)scheme_hash_get(MODCHAIN_TABLE(env->modchain), m->modname); old_menv = (Scheme_Env *)scheme_hash_get(MODCHAIN_TABLE(env->modchain), m->modname);

View File

@ -2701,6 +2701,31 @@ static int mark_log_reader_FIXUP(void *p) {
/**********************************************************************/ /**********************************************************************/
#ifdef MARKS_FOR_ENGINE_C
static int engine_val_SIZE(void *p) {
return
gcBYTES_TO_WORDS(sizeof(Scheme_Engine));
}
static int engine_val_MARK(void *p) {
Scheme_Engine *en = (Scheme_Engine *)p;
return
gcBYTES_TO_WORDS(sizeof(Scheme_Engine));
}
static int engine_val_FIXUP(void *p) {
Scheme_Engine *en = (Scheme_Engine *)p;
return
gcBYTES_TO_WORDS(sizeof(Scheme_Engine));
}
#define engine_val_IS_ATOMIC 0
#define engine_val_IS_CONST_SIZE 1
#endif /* ENGINE */
#ifdef MARKS_FOR_ENV_C #ifdef MARKS_FOR_ENV_C
static int mark_comp_env_SIZE(void *p) { static int mark_comp_env_SIZE(void *p) {
@ -3219,6 +3244,33 @@ static int mark_rb_node_FIXUP(void *p) {
/**********************************************************************/ /**********************************************************************/
#ifdef MARKS_FOR_PLACES_C
static int place_val_SIZE(void *p) {
return
gcBYTES_TO_WORDS(sizeof(Scheme_Place));
}
static int place_val_MARK(void *p) {
Scheme_Place *pr = (Scheme_Place *)p;
return
gcBYTES_TO_WORDS(sizeof(Scheme_Place));
}
static int place_val_FIXUP(void *p) {
Scheme_Place *pr = (Scheme_Place *)p;
return
gcBYTES_TO_WORDS(sizeof(Scheme_Place));
}
#define place_val_IS_ATOMIC 0
#define place_val_IS_CONST_SIZE 1
#endif /* PLACES */
/**********************************************************************/
#ifdef MARKS_FOR_PORTFUN_C #ifdef MARKS_FOR_PORTFUN_C
static int mark_load_handler_data_SIZE(void *p) { static int mark_load_handler_data_SIZE(void *p) {

View File

@ -1074,6 +1074,17 @@ END type;
/**********************************************************************/ /**********************************************************************/
START engine;
engine_val {
mark:
Scheme_Engine *en = (Scheme_Engine *)p;
size:
gcBYTES_TO_WORDS(sizeof(Scheme_Engine));
}
END engine;
START env; START env;
mark_comp_env { mark_comp_env {
@ -1299,6 +1310,19 @@ END hash;
/**********************************************************************/ /**********************************************************************/
START places;
place_val {
mark:
Scheme_Place *pr = (Scheme_Place *)p;
size:
gcBYTES_TO_WORDS(sizeof(Scheme_Place));
}
END places;
/**********************************************************************/
START portfun; START portfun;
mark_load_handler_data { mark_load_handler_data {

358
src/mzscheme/src/mzrt.c Normal file
View File

@ -0,0 +1,358 @@
#include "schpriv.h"
#ifdef MZ_USE_PLACES
/************************************************************************/
/************************************************************************/
/************************************************************************/
#include "mzrt.h"
#include "schgc.h"
#ifdef MZ_XFORM
START_XFORM_SUSPEND;
#endif
/* std C headers */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <../sconfig.h>
/* platform headers */
#ifdef WIN32
# include <windows.h>
#else
# include <pthread.h>
# include <signal.h>
# include <unistd.h>
# include <time.h>
# if defined(UNIX_LIMIT_STACK) || defined(UNIX_LIMIT_FDSET_SIZE)
# include <signal.h>
# include <sys/time.h>
# include <sys/resource.h>
# endif
#endif
void mzrt_set_user_break_handler(void (*user_break_handler)(int))
{
#ifdef WIN32
#else
signal(SIGINT, user_break_handler);
#endif
}
static void segfault_handler(int signal_num) {
#ifdef WIN32
#else
pid_t pid = getpid();
char buffer[500];
char buf[500];
signal(SIGSEGV, segfault_handler);
fprintf(stderr, "%i %i resume(r)/gdb(d)/exit(e)?\n", signal_num, pid);
fflush(stderr);
while(read(fileno(stdin), buf, 100) <= 0){
if(errno != EINTR){
fprintf(stderr, "\nCould not read response, sleeping for 20 seconds.\n");
}
switch(buf[0]) {
case 'r':
return;
break;
case 'd':
snprintf(buffer, 500, "xterm -e gdb ./mzschemecgc %d &", pid);
fprintf(stderr, "%i %i Launching GDB", signal_num, pid);
system(buffer);
break;
case 'e':
default:
exit(1);
break;
}
}
#endif
}
void mzrt_set_segfault_debug_handler()
{
#ifdef WIN32
#else
signal(SIGSEGV, segfault_handler);
#endif
}
void mzrt_sleep(int seconds)
{
#ifdef WIN32
#else
struct timespec set;
struct timespec rem;
set.tv_sec = seconds;
set.tv_nsec = 0;
rem.tv_sec = 0;
rem.tv_nsec = 0;
while ((-1 == nanosleep(&set, &rem))) {
//fprintf(stderr, "%i %i INITIAL\n", set.tv_sec, set.tv_nsec);
//fprintf(stderr, "%i %i LEFT\n", rem.tv_sec, rem.tv_nsec);
set = rem;
//fprintf(stderr, "%i %i NOW\n", set.tv_sec, set.tv_nsec);
}
#endif
}
#ifdef MZ_XFORM
END_XFORM_SUSPEND;
#endif
/***********************************************************************/
/* Atomic Ops */
/***********************************************************************/
MZ_INLINE2 uint32_t mzrt_atomic_add_32(volatile unsigned int *counter, unsigned int value) {
#ifdef WIN32
# if defined(__MINGW32__)
return InterlockedExchangeAdd((long *)counter, value);
# else
return InterlockedExchangeAdd(counter, value);
# endif
#elif defined (__GNUC__) && (__i386__)
asm volatile ("lock; xaddl %0,%1"
: "=r" (value), "=m" (*counter)
: "0" (value), "m" (*counter)
: "memory", "cc");
return value;
#else
#error !!!Atomic ops not provided!!!
#endif
}
/* returns the pre-incremented value */
MZ_INLINE2 uint32_t mzrt_atomic_incr_32(volatile unsigned int *counter) {
return mzrt_atomic_add_32(counter, 1);
}
/***********************************************************************/
/* Threads */
/***********************************************************************/
typedef struct {
#ifdef WIN32
HANDLE threadid;
#else
pthread_t threadid;
#endif
} mz_proc_thread;
#ifdef WIN32
typedef DWORD (WINAPI *mz_proc_thread_start)(void*);
#else
typedef void *(mz_proc_thread_start)(void*);
#endif
mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start start_proc, void* data) {
mz_proc_thread *thread = (mz_proc_thread*)malloc(sizeof(mz_proc_thread));
#ifdef WIN32
# ifndef MZ_PRECISE_GC
thread->threadid = CreateThread(NULL, 0, start_proc, data, 0, NULL);
# else
thread->threadid = CreateThread(NULL, 0, start_proc, data, 0, NULL);
# endif
#else
# ifndef MZ_PRECISE_GC
GC_pthread_create(&thread->threadid, NULL, start_proc, data);
# else
pthread_create(&thread->threadid, NULL, start_proc, data);
# endif
#endif
return thread;
}
void * mz_proc_thread_wait(mz_proc_thread *thread) {
#ifdef WIN32
DWORD rc;
WaitForSingleObject(thread->threadid,INFINITE);
GetExitCodeThread(thread->threadid, &rc);
return (void *) rc;
#else
void *rc;
# ifndef MZ_PRECISE_GC
GC_pthread_join(thread->threadid, &rc);
# else
pthread_join(thread->threadid, &rc);
# endif
return rc;
#endif
}
/***********************************************************************/
/* RW Lock */
/***********************************************************************/
/* Unix **************************************************************/
#ifndef WIN32
#ifdef MZ_XFORM
START_XFORM_SUSPEND;
#endif
typedef struct mzrt_rwlock {
pthread_rwlock_t lock;
} mzrt_rwlock;
int mzrt_rwlock_create(mzrt_rwlock **lock) {
*lock = malloc(sizeof(mzrt_rwlock));
return pthread_rwlock_init(&(*lock)->lock, NULL);
}
int mzrt_rwlock_rdlock(mzrt_rwlock *lock) {
return pthread_rwlock_rdlock(&lock->lock);
}
int mzrt_rwlock_wrlock(mzrt_rwlock *lock) {
return pthread_rwlock_rdlock(&lock->lock);
}
int mzrt_rwlock_tryrdlock(mzrt_rwlock *lock) {
return pthread_rwlock_tryrdlock(&lock->lock);
}
int mzrt_rwlock_trywrlock(mzrt_rwlock *lock) {
return pthread_rwlock_trywrlock(&lock->lock);
}
int mzrt_rwlock_unlock(mzrt_rwlock *lock) {
return pthread_rwlock_unlock(&lock->lock);
}
int mzrt_rwlock_destroy(mzrt_rwlock *lock) {
return pthread_rwlock_destroy(&lock->lock);
}
#ifdef MZ_XFORM
END_XFORM_SUSPEND;
#endif
#endif
/* Windows **************************************************************/
#ifdef WIN32
#ifdef MZ_XFORM
START_XFORM_SUSPEND;
#endif
typedef struct mzrt_rwlock {
HANDLE readEvent;
HANDLE writeMutex;
unsigned long readers;
} mzrt_rwlock;
int mzrt_rwlock_create(mzrt_rwlock **lock) {
*lock = malloc(sizeof(mzrt_rwlock));
(*lock)->readers = 0;
/* CreateEvent(LPSECURITY_ATTRIBUTES, manualReset, initiallySignaled, LPCSTR name) */
if (! ((*lock)->readEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
return 0;
if (! ((*lock)->writeMutex = CreateMutex(NULL, FALSE, NULL)))
return 0;
return 1;
}
static int get_win32_os_error() {
return 0;
}
static int mzrt_rwlock_rdlock_worker(mzrt_rwlock *lock, DWORD millis) {
DWORD rc = WaitForSingleObject(lock->writeMutex, millis);
if (rc == WAIT_FAILED || rc == WAIT_TIMEOUT );
return 0;
InterlockedIncrement(&lock->readers);
if (! ResetEvent(lock->readEvent))
return 0;
if (!ReleaseMutex(lock->writeMutex))
return 0;
return 1;
}
static int mzrt_rwlock_wrlock_worker(mzrt_rwlock *lock, DWORD millis) {
DWORD rc = WaitForSingleObject(lock->writeMutex, millis);
if (rc == WAIT_FAILED || rc == WAIT_TIMEOUT );
return 0;
if (lock->readers) {
if (millis) {
rc = WaitForSingleObject(lock->readEvent, millis);
}
else {
rc = WAIT_TIMEOUT;
}
if (rc == WAIT_FAILED || rc == WAIT_TIMEOUT );
return 0;
}
return 1;
}
int mzrt_rwlock_rdlock(mzrt_rwlock *lock) {
return mzrt_rwlock_rdlock_worker(lock, INFINITE);
}
int mzrt_rwlock_wrlock(mzrt_rwlock *lock) {
return mzrt_rwlock_wrlock_worker(lock, INFINITE);
}
int mzrt_rwlock_tryrdlock(mzrt_rwlock *lock) {
return mzrt_rwlock_rdlock_worker(lock, 0);
}
int mzrt_rwlock_trywrlock(mzrt_rwlock *lock) {
return mzrt_rwlock_wrlock_worker(lock, 0);
}
int mzrt_rwlock_unlock(mzrt_rwlock *lock) {
DWORD rc = 0;
if (!ReleaseMutex(lock->writeMutex)) {
rc = get_win32_os_error();
}
if (rc == ERROR_NOT_OWNER) {
if (lock->readers && !InterlockedDecrement(&lock->readers) && !SetEvent(lock->readEvent)) {
rc = get_win32_os_error();
}
else {
rc = 0;
}
}
return !rc;
}
int mzrt_rwlock_destroy(mzrt_rwlock *lock) {
int rc = 1;
rc &= CloseHandle(lock->readEvent);
rc &= CloseHandle(lock->writeMutex);
return rc;
}
#ifdef MZ_XFORM
END_XFORM_SUSPEND;
#endif
#endif
/************************************************************************/
/************************************************************************/
/************************************************************************/
#endif

48
src/mzscheme/src/mzrt.h Normal file
View File

@ -0,0 +1,48 @@
#ifndef MZRT_H
#define MZRT_H
#ifdef MZ_USE_PLACES
/****************** ATOMIC OPERATIONS ************************************/
/* mzrt_atomic_ops.c */
#ifdef _MSC_VER
typedef unsigned int uint32_t;
#else
# include <stdint.h>
#endif
MZ_INLINE2 uint32_t mzrt_atomic_add_32(volatile unsigned int *counter, unsigned int value);
MZ_INLINE2 uint32_t mzrt_atomic_incr_32(volatile unsigned int *counter);
/****************** SIGNAL HANDLING ***************************************/
/* mzrt.c */
void mzrt_set_segfault_debug_handler();
void mzrt_set_user_break_handler(void (*user_break_handler)(int));
/****************** PROCESS WEIGHT THREADS ********************************/
/* mzrt_threads.c */
typedef struct mz_proc_thread mz_proc_thread; /* OPAQUE DEFINITION */
typedef void *(mz_proc_thread_start)(void*);
mz_proc_thread* mz_proc_thread_create(mz_proc_thread_start*, void* data);
void *mz_proc_thread_wait(mz_proc_thread *thread);
void mzrt_sleep(int seconds);
/****************** THREAD RWLOCK ******************************************/
/* mzrt_rwlock_*.c */
typedef struct mzrt_rwlock mzrt_rwlock; /* OPAQUE DEFINITION */
int mzrt_rwlock_create(mzrt_rwlock **lock);
int mzrt_rwlock_rdlock(mzrt_rwlock *lock);
int mzrt_rwlock_wrlock(mzrt_rwlock *lock);
int mzrt_rwlock_tryrdlock(mzrt_rwlock *lock);
int mzrt_rwlock_trywrlock(mzrt_rwlock *lock);
int mzrt_rwlock_unlock(mzrt_rwlock *lock);
int mzrt_rwlock_destroy(mzrt_rwlock *lock);
#endif
#endif

View File

@ -2059,7 +2059,7 @@ static Scheme_Object *real_to_bytes (int argc, Scheme_Object *argv[])
d = scheme_get_val_as_double(n); d = scheme_get_val_as_double(n);
if (size == 4) { if (size == 4) {
float f = d; float f = (float) d;
memcpy(SCHEME_BYTE_STR_VAL(s) + offset, &f, sizeof(float)); memcpy(SCHEME_BYTE_STR_VAL(s) + offset, &f, sizeof(float));
} else { } else {
memcpy(SCHEME_BYTE_STR_VAL(s) + offset, &d, sizeof(double)); memcpy(SCHEME_BYTE_STR_VAL(s) + offset, &d, sizeof(double));

191
src/mzscheme/src/places.c Normal file
View File

@ -0,0 +1,191 @@
#include "schpriv.h"
#ifdef MZ_USE_PLACES
/************************************************************************/
/************************************************************************/
/************************************************************************/
#include "mzrt.h"
Scheme_Object *scheme_place(int argc, Scheme_Object *args[]);
static Scheme_Object *scheme_place_wait(int argc, Scheme_Object *args[]);
static Scheme_Object *scheme_place_sleep(int argc, Scheme_Object *args[]);
static Scheme_Object *scheme_place_p(int argc, Scheme_Object *args[]);
static void load_namespace(char *namespace_name);
static void load_namespace_utf8(Scheme_Object *namespace_name);
#ifdef MZ_PRECISE_GC
static void register_traversers(void);
#endif
static void *place_start_proc(void *arg);
/*========================================================================*/
/* initialization */
/*========================================================================*/
void scheme_init_place(Scheme_Env *env)
{
Scheme_Env *plenv;
#ifdef MZ_PRECISE_GC
register_traversers();
#endif
plenv = scheme_primitive_module(scheme_intern_symbol("#%place"), env);
scheme_add_global_constant("place", scheme_make_prim_w_arity(scheme_place, "place", 1, 1), plenv);
scheme_add_global_constant("place_sleep", scheme_make_prim_w_arity(scheme_place_sleep, "place_sleep", 1, 1), plenv);
scheme_add_global_constant("place_wait", scheme_make_prim_w_arity(scheme_place_wait, "place_wait", 1, 1), plenv);
scheme_add_global_constant("place?", scheme_make_prim_w_arity(scheme_place_p, "place?", 1, 1), plenv);
scheme_add_global_constant("place6", scheme_make_prim_w_arity(scheme_place, "place6", 1, 1), plenv);
scheme_add_global_constant("place5", scheme_make_prim_w_arity(scheme_place, "place5", 1, 1), plenv);
scheme_add_global_constant("place4", scheme_make_prim_w_arity(scheme_place, "place4", 1, 1), plenv);
scheme_add_global_constant("place3", scheme_make_prim_w_arity(scheme_place, "place3", 1, 1), plenv);
scheme_add_global_constant("place2", scheme_make_prim_w_arity(scheme_place, "place2", 1, 1), plenv);
scheme_add_global_constant("place1", scheme_make_prim_w_arity(scheme_place, "place1", 1, 1), plenv);
scheme_finish_primitive_module(plenv);
}
typedef struct Place_Start_Data {
Scheme_Object *thunk;
} Place_Start_Data;
static void null_out_runtime_globals() {
scheme_current_thread = NULL;
scheme_first_thread = NULL;
scheme_main_thread = NULL;
scheme_current_runstack_start = NULL;
scheme_current_runstack = NULL;
scheme_current_cont_mark_stack = 0;
scheme_current_cont_mark_pos = 0;
}
Scheme_Object *scheme_place_sleep(int argc, Scheme_Object *args[]) {
mzrt_sleep(SCHEME_INT_VAL(args[0]));
return scheme_void;
}
Scheme_Object *scheme_place(int argc, Scheme_Object *args[]) {
Scheme_Place *place;
Place_Start_Data *place_data;
mz_proc_thread *proc_thread;
/* create place object */
place = MALLOC_ONE_TAGGED(Scheme_Place);
place->so.type = scheme_place_type;
scheme_console_printf("Hello creating new place %p\n", place);
/* pass critical info to new place */
place_data = (Place_Start_Data*)malloc(sizeof(Place_Start_Data));
place_data->thunk = args[0];
/* create new place */
proc_thread = mz_proc_thread_create(place_start_proc, place_data);
place->proc_thread = proc_thread;
return (Scheme_Object*) place;
}
static Scheme_Object *scheme_place_wait(int argc, Scheme_Object *args[]) {
void *rc;
Scheme_Place *place;
place = (Scheme_Place *) args[0];
rc = mz_proc_thread_wait((mz_proc_thread *)place->proc_thread);
return args[0];
}
static Scheme_Object *scheme_place_p(int argc, Scheme_Object *args[])
{
return SAME_TYPE(SCHEME_TYPE(args[0]), scheme_place_type) ? scheme_true : scheme_false;
}
static void load_namespace(char *namespace_name) {
load_namespace_utf8( scheme_make_utf8_string(namespace_name));
}
static void load_namespace_utf8(Scheme_Object *namespace_name) {
Scheme_Object *nsreq;
Scheme_Object *a[1];
Scheme_Thread * volatile p;
mz_jmp_buf * volatile saved_error_buf;
mz_jmp_buf volatile new_error_buf;
nsreq = scheme_builtin_value("namespace-require");
a[0] = scheme_make_pair(scheme_intern_symbol("lib"),
scheme_make_pair(namespace_name, scheme_make_null()));
p = scheme_get_current_thread();
saved_error_buf = p->error_buf;
p->error_buf = &new_error_buf;
if (!scheme_setjmp(new_error_buf))
scheme_apply(nsreq, 1, a);
p->error_buf = saved_error_buf;
}
static void *place_start_proc(void *data_arg) {
void *stack_base;
Scheme_Object *thunk;
Place_Start_Data *place_data;
stack_base = PROMPT_STACK(stack_base);
place_data = (Place_Start_Data *) data_arg;
/* create a pristine thread */
null_out_runtime_globals();
REGISTER_SO(scheme_current_thread);
REGISTER_SO(scheme_first_thread);
REGISTER_SO(scheme_main_thread);
REGISTER_SO(scheme_thread_set_top);
/* scheme_make_thread behaves differently if the above global vars are not null */
scheme_place_instance_init();
load_namespace("scheme/init");
thunk = place_data->thunk;
scheme_console_printf("Hello in new place %p\n", thunk);
scheme_apply(thunk, 0, NULL);
stack_base = NULL;
return NULL;
}
/*========================================================================*/
/* precise GC traversers */
/*========================================================================*/
#ifdef MZ_PRECISE_GC
START_XFORM_SKIP;
#define MARKS_FOR_PLACES_C
#include "mzmark.c"
static void register_traversers(void)
{
GC_REG_TRAV(scheme_place_type, place_val);
}
END_XFORM_SKIP;
#endif
/************************************************************************/
/************************************************************************/
/************************************************************************/
#endif

View File

@ -44,6 +44,8 @@ static int *dgc_count;
static int dgc_size; static int dgc_size;
extern int scheme_num_copied_stacks; extern int scheme_num_copied_stacks;
static unsigned long scheme_primordial_os_thread_stack_base;
static THREAD_LOCAL unsigned long scheme_os_thread_stack_base;
#if defined(MZ_XFORM) && !defined(MZ_PRECISE_GC) #if defined(MZ_XFORM) && !defined(MZ_PRECISE_GC)
void **GC_variable_stack; void **GC_variable_stack;
@ -60,7 +62,7 @@ extern MZ_DLLIMPORT void GC_init();
extern MZ_DLLIMPORT unsigned long GC_get_stack_base(); extern MZ_DLLIMPORT unsigned long GC_get_stack_base();
#endif #endif
void scheme_set_stack_base(void *base, int no_auto_statics) void scheme_set_primordial_stack_base(void *base, int no_auto_statics)
{ {
#ifdef MZ_PRECISE_GC #ifdef MZ_PRECISE_GC
GC_init_type_tags(_scheme_last_type_, GC_init_type_tags(_scheme_last_type_,
@ -70,6 +72,10 @@ void scheme_set_stack_base(void *base, int no_auto_statics)
/* We want to be able to allocate symbols early. */ /* We want to be able to allocate symbols early. */
scheme_register_traversers(); scheme_register_traversers();
#endif #endif
scheme_primordial_os_thread_stack_base = (unsigned long) base;
scheme_os_thread_stack_base = (unsigned long) base;
#if defined(MZ_PRECISE_GC) || defined(USE_SENORA_GC) #if defined(MZ_PRECISE_GC) || defined(USE_SENORA_GC)
GC_set_stack_base(base); GC_set_stack_base(base);
/* no_auto_statics must always be true! */ /* no_auto_statics must always be true! */
@ -80,7 +86,7 @@ void scheme_set_stack_base(void *base, int no_auto_statics)
GC_init(); GC_init();
GC_clear_roots(); GC_clear_roots();
} else { } else {
# if defined(__APPLE__) && defined(__MACH__) # if (defined(__APPLE__) && defined(__MACH__)) || defined(MZ_USE_IRIX_SPROCS)
GC_init(); /* For Darwin, CGC requires GC_init() always */ GC_init(); /* For Darwin, CGC requires GC_init() always */
# endif # endif
} }
@ -88,6 +94,16 @@ void scheme_set_stack_base(void *base, int no_auto_statics)
use_registered_statics = no_auto_statics; use_registered_statics = no_auto_statics;
} }
void scheme_set_current_os_thread_stack_base(void *base)
{
scheme_os_thread_stack_base = (unsigned long) base;
}
unsigned long scheme_get_current_os_thread_stack_base()
{
return scheme_os_thread_stack_base;
}
typedef struct { typedef struct {
Scheme_Env_Main _main; Scheme_Env_Main _main;
int argc; int argc;
@ -116,7 +132,7 @@ int scheme_main_stack_setup(int no_auto_statics, Scheme_Nested_Main _main, void
void *stack_start; void *stack_start;
int volatile return_code; int volatile return_code;
scheme_set_stack_base(PROMPT_STACK(stack_start), no_auto_statics); scheme_set_primordial_stack_base(PROMPT_STACK(stack_start), no_auto_statics);
return_code = _main(data); return_code = _main(data);
@ -128,9 +144,9 @@ int scheme_main_stack_setup(int no_auto_statics, Scheme_Nested_Main _main, void
return return_code; return return_code;
} }
void scheme_set_stack_bounds(void *base, void *deepest, int no_auto_statics) void scheme_set_primordial_stack_bounds(void *base, void *deepest, int no_auto_statics)
{ {
scheme_set_stack_base(base, no_auto_statics); scheme_set_primordial_stack_base(base, no_auto_statics);
#ifdef USE_STACK_BOUNDARY_VAR #ifdef USE_STACK_BOUNDARY_VAR
if (deepest) { if (deepest) {

View File

@ -68,7 +68,7 @@ MZ_EXTERN Scheme_Object *scheme_current_break_cell();
/*========================================================================*/ /*========================================================================*/
#ifndef LINK_EXTENSIONS_BY_TABLE #ifndef LINK_EXTENSIONS_BY_TABLE
MZ_EXTERN Scheme_Thread *scheme_current_thread; extern THREAD_LOCAL Scheme_Thread *scheme_current_thread;
MZ_EXTERN volatile int scheme_fuel_counter; MZ_EXTERN volatile int scheme_fuel_counter;
#else #else
MZ_EXTERN Scheme_Thread **scheme_current_thread_ptr; MZ_EXTERN Scheme_Thread **scheme_current_thread_ptr;

View File

@ -54,7 +54,7 @@ Scheme_Object *(*scheme_current_break_cell)();
/* threads */ /* threads */
/*========================================================================*/ /*========================================================================*/
#ifndef LINK_EXTENSIONS_BY_TABLE #ifndef LINK_EXTENSIONS_BY_TABLE
Scheme_Thread *scheme_current_thread; THREAD_LOCAL Scheme_Thread;
volatile int scheme_fuel_counter; volatile int scheme_fuel_counter;
#else #else
Scheme_Thread **scheme_current_thread_ptr; Scheme_Thread **scheme_current_thread_ptr;

View File

@ -19,7 +19,7 @@
scheme_extension_table->scheme_inherit_cells = scheme_inherit_cells; scheme_extension_table->scheme_inherit_cells = scheme_inherit_cells;
scheme_extension_table->scheme_current_break_cell = scheme_current_break_cell; scheme_extension_table->scheme_current_break_cell = scheme_current_break_cell;
#ifndef LINK_EXTENSIONS_BY_TABLE #ifndef LINK_EXTENSIONS_BY_TABLE
scheme_extension_table->scheme_current_thread = scheme_current_thread; scheme_extension_table->Scheme_Thread = Scheme_Thread;
scheme_extension_table->scheme_fuel_counter = scheme_fuel_counter; scheme_extension_table->scheme_fuel_counter = scheme_fuel_counter;
#else #else
scheme_extension_table->scheme_current_thread_ptr = scheme_current_thread_ptr; scheme_extension_table->scheme_current_thread_ptr = scheme_current_thread_ptr;

View File

@ -19,7 +19,7 @@
#define scheme_inherit_cells (scheme_extension_table->scheme_inherit_cells) #define scheme_inherit_cells (scheme_extension_table->scheme_inherit_cells)
#define scheme_current_break_cell (scheme_extension_table->scheme_current_break_cell) #define scheme_current_break_cell (scheme_extension_table->scheme_current_break_cell)
#ifndef LINK_EXTENSIONS_BY_TABLE #ifndef LINK_EXTENSIONS_BY_TABLE
#define scheme_current_thread (scheme_extension_table->scheme_current_thread) #define Scheme_Thread (scheme_extension_table->Scheme_Thread)
#define scheme_fuel_counter (scheme_extension_table->scheme_fuel_counter) #define scheme_fuel_counter (scheme_extension_table->scheme_fuel_counter)
#else #else
#define scheme_current_thread_ptr (scheme_extension_table->scheme_current_thread_ptr) #define scheme_current_thread_ptr (scheme_extension_table->scheme_current_thread_ptr)

View File

@ -106,7 +106,8 @@ int scheme_num_types(void);
void scheme_reset_finalizations(void); void scheme_reset_finalizations(void);
extern unsigned long scheme_get_stack_base(void); extern unsigned long scheme_get_current_os_thread_stack_base(void);
void scheme_set_current_os_thread_stack_base(void *base);
int scheme_propagate_ephemeron_marks(void); int scheme_propagate_ephemeron_marks(void);
void scheme_clear_ephemerons(void); void scheme_clear_ephemerons(void);
@ -120,11 +121,19 @@ void scheme_clear_ephemerons(void);
#define BITS_PER_MZSHORT (8 * sizeof(mzshort)) #define BITS_PER_MZSHORT (8 * sizeof(mzshort))
#ifndef NO_INLINE_KEYWORD #ifndef NO_INLINE_KEYWORD
# define MZ_INLINE MSC_IZE(inline) # define MZ_INLINE MSC_IZE(MSC_IZE(inline))
#else #else
# define MZ_INLINE /* empty */ # define MZ_INLINE /* empty */
#endif #endif
#if _MSC_VER
# define MZ_NO_INLINE _declspec(noinline)
#elif defined(__GNUC__)
# define MZ_NO_INLINE __attribute ((__noinline__))
#else
# define MZ_NO_INLINE /* empty */
#endif
#ifdef MZ_PRECISE_GC #ifdef MZ_PRECISE_GC
# define CLEAR_KEY_FIELD(o) ((o)->keyex = 0) # define CLEAR_KEY_FIELD(o) ((o)->keyex = 0)
#else #else
@ -149,7 +158,7 @@ void scheme_init_overflow(void);
void scheme_register_traversers(void); void scheme_register_traversers(void);
void scheme_init_hash_key_procs(void); void scheme_init_hash_key_procs(void);
#endif #endif
Scheme_Thread *scheme_make_thread(void); Scheme_Thread *scheme_make_thread(void*);
void scheme_init_true_false(void); void scheme_init_true_false(void);
void scheme_init_symbol_table(void); void scheme_init_symbol_table(void);
void scheme_init_symbol_type(Scheme_Env *env); void scheme_init_symbol_type(Scheme_Env *env);
@ -198,6 +207,7 @@ void scheme_init_getenv(void);
#ifndef DONT_USE_FOREIGN #ifndef DONT_USE_FOREIGN
void scheme_init_foreign(Scheme_Env *env); void scheme_init_foreign(Scheme_Env *env);
#endif #endif
void scheme_init_place(Scheme_Env *env);
void scheme_free_dynamic_extensions(void); void scheme_free_dynamic_extensions(void);
@ -303,10 +313,10 @@ extern Scheme_Object *scheme_reduced_procedure_struct;
#define RUNSTACK_IS_GLOBAL #define RUNSTACK_IS_GLOBAL
#ifdef RUNSTACK_IS_GLOBAL #ifdef RUNSTACK_IS_GLOBAL
extern Scheme_Object **scheme_current_runstack; extern THREAD_LOCAL Scheme_Object **scheme_current_runstack;
extern Scheme_Object **scheme_current_runstack_start; extern THREAD_LOCAL Scheme_Object **scheme_current_runstack_start;
extern MZ_MARK_STACK_TYPE scheme_current_cont_mark_stack; extern THREAD_LOCAL MZ_MARK_STACK_TYPE scheme_current_cont_mark_stack;
extern MZ_MARK_POS_TYPE scheme_current_cont_mark_pos; extern THREAD_LOCAL MZ_MARK_POS_TYPE scheme_current_cont_mark_pos;
# define MZ_RUNSTACK scheme_current_runstack # define MZ_RUNSTACK scheme_current_runstack
# define MZ_RUNSTACK_START scheme_current_runstack_start # define MZ_RUNSTACK_START scheme_current_runstack_start
# define MZ_CONT_MARK_STACK scheme_current_cont_mark_stack # define MZ_CONT_MARK_STACK scheme_current_cont_mark_stack
@ -320,7 +330,24 @@ extern MZ_MARK_POS_TYPE scheme_current_cont_mark_pos;
extern volatile int scheme_fuel_counter; extern volatile int scheme_fuel_counter;
extern Scheme_Thread *scheme_main_thread; extern THREAD_LOCAL Scheme_Thread *scheme_main_thread;
#ifdef MZ_USE_PLACES
extern THREAD_LOCAL Scheme_Thread *scheme_current_thread;
extern THREAD_LOCAL Scheme_Thread *scheme_first_thread;
#endif
typedef struct Scheme_Thread_Set {
Scheme_Object so;
struct Scheme_Thread_Set *parent;
Scheme_Object *first;
Scheme_Object *next;
Scheme_Object *prev;
Scheme_Object *search_start;
Scheme_Object *current;
} Scheme_Thread_Set;
extern THREAD_LOCAL Scheme_Thread_Set *scheme_thread_set_top;
#define SCHEME_TAIL_COPY_THRESHOLD 5 #define SCHEME_TAIL_COPY_THRESHOLD 5
@ -970,8 +997,8 @@ void scheme_clean_cust_box_list(void);
Scheme_Object *scheme_handle_stack_overflow(Scheme_Object *(*k)(void)); Scheme_Object *scheme_handle_stack_overflow(Scheme_Object *(*k)(void));
extern struct Scheme_Overflow_Jmp *scheme_overflow_jmp; extern THREAD_LOCAL struct Scheme_Overflow_Jmp *scheme_overflow_jmp;
extern void *scheme_overflow_stack_start; extern THREAD_LOCAL void *scheme_overflow_stack_start;
#ifdef MZ_PRECISE_GC #ifdef MZ_PRECISE_GC
# define PROMPT_STACK(id) &__gc_var_stack__ # define PROMPT_STACK(id) &__gc_var_stack__
@ -1171,10 +1198,10 @@ typedef struct Scheme_Overflow {
|| defined(BEOS_FIND_STACK_BOUNDS) || defined(OSKIT_FIXED_STACK_BOUNDS) \ || defined(BEOS_FIND_STACK_BOUNDS) || defined(OSKIT_FIXED_STACK_BOUNDS) \
|| defined(PALM_FIND_STACK_BOUNDS) || defined(PALM_FIND_STACK_BOUNDS)
# define USE_STACK_BOUNDARY_VAR # define USE_STACK_BOUNDARY_VAR
extern unsigned long scheme_stack_boundary; extern THREAD_LOCAL unsigned long scheme_stack_boundary;
/* Same as scheme_stack_boundary, but set to an extreme value when feul auto-expires, /* Same as scheme_stack_boundary, but set to an extreme value when feul auto-expires,
so that JIT-generated code can check just one variable: */ so that JIT-generated code can check just one variable: */
extern unsigned long volatile scheme_jit_stack_boundary; extern THREAD_LOCAL unsigned long volatile scheme_jit_stack_boundary;
#endif #endif
typedef struct Scheme_Meta_Continuation { typedef struct Scheme_Meta_Continuation {
@ -2573,6 +2600,13 @@ void scheme_add_global_keyword_symbol(Scheme_Object *name, Scheme_Object *v, Sch
void scheme_add_global_constant(const char *name, Scheme_Object *v, Scheme_Env *env); void scheme_add_global_constant(const char *name, Scheme_Object *v, Scheme_Env *env);
void scheme_add_global_constant_symbol(Scheme_Object *name, Scheme_Object *v, Scheme_Env *env); void scheme_add_global_constant_symbol(Scheme_Object *name, Scheme_Object *v, Scheme_Env *env);
#define GLOBAL_FOLDING_PRIM(name, func, a1, a2, a3, env) scheme_add_global_constant(name, scheme_make_folding_prim(func, name, a1, a2, a3), env);
#define GLOBAL_IMMED_PRIM(name, func, a1, a2, env) scheme_add_global_constant(name, scheme_make_immed_prim(func, name, a1, a2), env);
#define GLOBAL_PARAMETER(name, func, constant, env) scheme_add_global_constant(name, scheme_register_parameter(func, name, constant), env);
#define GLOBAL_PRIM_W_ARITY(name, func, a1, a2, env) scheme_add_global_constant(name, scheme_make_prim_w_arity(func, name, a1, a2), env);
#define GLOBAL_PRIM_W_ARITY2(name, func, a1, a2, a3, a4, env) scheme_add_global_constant(name, scheme_make_prim_w_arity2(func, name, a1, a2, a3, a4), env);
Scheme_Object *scheme_tl_id_sym(Scheme_Env *env, Scheme_Object *id, Scheme_Object *bdg, int is_def, Scheme_Object *phase); Scheme_Object *scheme_tl_id_sym(Scheme_Env *env, Scheme_Object *id, Scheme_Object *bdg, int is_def, Scheme_Object *phase);
int scheme_tl_id_is_sym_used(Scheme_Hash_Table *marked_names, Scheme_Object *sym); int scheme_tl_id_is_sym_used(Scheme_Hash_Table *marked_names, Scheme_Object *sym);
@ -2605,7 +2639,10 @@ Scheme_Object *scheme_hash_module_variable(Scheme_Env *env, Scheme_Object *modid
Scheme_Object *stxsym, Scheme_Object *insp, Scheme_Object *stxsym, Scheme_Object *insp,
int pos, int mod_phase); int pos, int mod_phase);
extern Scheme_Env *scheme_initial_env;
Scheme_Env *scheme_get_kernel_env();
int scheme_is_kernel_env();
void scheme_install_initial_module_set(Scheme_Env *env); void scheme_install_initial_module_set(Scheme_Env *env);
Scheme_Bucket_Table *scheme_clone_toplevel(Scheme_Bucket_Table *ht, Scheme_Env *home); Scheme_Bucket_Table *scheme_clone_toplevel(Scheme_Bucket_Table *ht, Scheme_Env *home);
@ -3020,4 +3057,27 @@ unsigned short * scheme_ucs4_to_utf16(const mzchar *text, int start, int end,
#define SCHEME_SYM_PARALLELP(o) (MZ_OPT_HASH_KEY(&((Scheme_Symbol *)(o))->iso) & 0x2) #define SCHEME_SYM_PARALLELP(o) (MZ_OPT_HASH_KEY(&((Scheme_Symbol *)(o))->iso) & 0x2)
#define SCHEME_SYM_WEIRDP(o) (MZ_OPT_HASH_KEY(&((Scheme_Symbol *)(o))->iso) & 0x3) #define SCHEME_SYM_WEIRDP(o) (MZ_OPT_HASH_KEY(&((Scheme_Symbol *)(o))->iso) & 0x3)
/*========================================================================*/
/* places */
/*========================================================================*/
typedef struct Scheme_Place {
Scheme_Object so;
void *proc_thread;
} Scheme_Place;
Scheme_Env *scheme_place_instance_init();
/*========================================================================*/
/* engine */
/*========================================================================*/
typedef struct Scheme_Engine {
Scheme_Object so;
} Scheme_Engine;
Scheme_Env *scheme_engine_instance_init();
#endif /* __mzscheme_private__ */ #endif /* __mzscheme_private__ */

View File

@ -185,6 +185,8 @@ static void *make_stack_copy_rec(long size)
lk = MALLOC_LINK(); lk = MALLOC_LINK();
cs->prev = lk; cs->prev = lk;
/* double linked list push */
*cs->next = *first_copied_stack; *cs->next = *first_copied_stack;
if (*first_copied_stack) if (*first_copied_stack)
*(*first_copied_stack)->prev = cs; *(*first_copied_stack)->prev = cs;
@ -246,7 +248,7 @@ END_XFORM_SKIP;
#endif #endif
/* This function must not be inlined! */ /* This function must not be inlined! */
void scheme_copy_stack(Scheme_Jumpup_Buf *b, void *base, void *start GC_VAR_STACK_ARG_DECL) void MZ_NO_INLINE scheme_copy_stack(Scheme_Jumpup_Buf *b, void *base, void *start GC_VAR_STACK_ARG_DECL)
{ {
long size, msize; long size, msize;
void *here; void *here;

View File

@ -243,5 +243,8 @@ enum {
scheme_rt_rb_node, /* 221 */ scheme_rt_rb_node, /* 221 */
#endif #endif
scheme_place_type, /* 222 */
scheme_engine_type, /* 223 */
_scheme_last_type_ _scheme_last_type_
}; };

View File

@ -28,6 +28,7 @@
# define SCHEME_NO_GC_PROTO # define SCHEME_NO_GC_PROTO
#endif #endif
#include "mzrt.h"
#include "schpriv.h" #include "schpriv.h"
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
@ -51,6 +52,13 @@ Scheme_Hash_Table *scheme_symbol_table = NULL;
Scheme_Hash_Table *scheme_keyword_table = NULL; Scheme_Hash_Table *scheme_keyword_table = NULL;
Scheme_Hash_Table *scheme_parallel_symbol_table = NULL; Scheme_Hash_Table *scheme_parallel_symbol_table = NULL;
#ifdef MZ_USE_PLACES
mzrt_rwlock *symbol_table_lock;
#else
# define mzrt_rwlock_rdlock(l) /* empty */
# define mzrt_rwlock_unlock(l) /* empty */
#endif
unsigned long scheme_max_found_symbol_name; unsigned long scheme_max_found_symbol_name;
/* globals */ /* globals */
@ -282,6 +290,10 @@ scheme_init_symbol_table ()
scheme_keyword_table = init_one_symbol_table(); scheme_keyword_table = init_one_symbol_table();
scheme_parallel_symbol_table = init_one_symbol_table(); scheme_parallel_symbol_table = init_one_symbol_table();
#ifdef MZ_USE_PLACES
mzrt_rwlock_create(&symbol_table_lock);
#endif
#ifndef MZ_PRECISE_GC #ifndef MZ_PRECISE_GC
GC_custom_finalize = clean_symbol_table; GC_custom_finalize = clean_symbol_table;
#endif #endif
@ -301,46 +313,14 @@ scheme_init_symbol (Scheme_Env *env)
SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED; SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_UNARY_INLINED;
scheme_add_global_constant("symbol?", p, env); scheme_add_global_constant("symbol?", p, env);
scheme_add_global_constant("string->symbol", GLOBAL_IMMED_PRIM("string->symbol", string_to_symbol_prim, 1, 1, env);
scheme_make_immed_prim(string_to_symbol_prim, GLOBAL_IMMED_PRIM("string->uninterned-symbol", string_to_uninterned_symbol_prim, 1, 1, env);
"string->symbol", GLOBAL_IMMED_PRIM("symbol->string", symbol_to_string_prim, 1, 1, env);
1, 1), env); GLOBAL_FOLDING_PRIM("keyword?", keyword_p_prim, 1, 1, 1, env);
scheme_add_global_constant("string->uninterned-symbol", GLOBAL_FOLDING_PRIM("keyword<?", keyword_lt, 2, -1, 1, env);
scheme_make_immed_prim(string_to_uninterned_symbol_prim, GLOBAL_IMMED_PRIM("string->keyword", string_to_keyword_prim, 1, 1, env);
"string->uninterned-symbol", GLOBAL_IMMED_PRIM("keyword->string", keyword_to_string_prim, 1, 1, env);
1, 1), GLOBAL_IMMED_PRIM("gensym", gensym, 0, 1, env);
env);
scheme_add_global_constant("symbol->string",
scheme_make_immed_prim(symbol_to_string_prim,
"symbol->string",
1, 1),
env);
scheme_add_global_constant("keyword?",
scheme_make_folding_prim(keyword_p_prim,
"keyword?",
1, 1, 1),
env);
scheme_add_global_constant("keyword<?",
scheme_make_folding_prim(keyword_lt,
"keyword<?",
2, -1, 1),
env);
scheme_add_global_constant("string->keyword",
scheme_make_immed_prim(string_to_keyword_prim,
"string->keyword",
1, 1), env);
scheme_add_global_constant("keyword->string",
scheme_make_immed_prim(keyword_to_string_prim,
"keyword->string",
1, 1),
env);
scheme_add_global_constant("gensym",
scheme_make_immed_prim(gensym,
"gensym",
0, 1),
env);
} }
static Scheme_Object * static Scheme_Object *
@ -390,11 +370,16 @@ scheme_intern_exact_symbol_in_table(Scheme_Hash_Table *symbol_table, int kind, c
{ {
Scheme_Object *sym; Scheme_Object *sym;
mzrt_rwlock_rdlock(symbol_table_lock);
sym = symbol_bucket(symbol_table, name, len, NULL); sym = symbol_bucket(symbol_table, name, len, NULL);
mzrt_rwlock_unlock(symbol_table_lock);
if (!sym) { if (!sym) {
sym = make_a_symbol(name, len, kind); sym = make_a_symbol(name, len, kind);
mzrt_rwlock_rdlock(symbol_table_lock);
symbol_bucket(symbol_table, name, len, sym); symbol_bucket(symbol_table, name, len, sym);
mzrt_rwlock_unlock(symbol_table_lock);
} }
return sym; return sym;

View File

@ -142,23 +142,13 @@ extern int scheme_jit_malloced;
static int buffer_init_size = INIT_TB_SIZE; static int buffer_init_size = INIT_TB_SIZE;
Scheme_Thread *scheme_current_thread = NULL; THREAD_LOCAL Scheme_Thread *scheme_current_thread = NULL;
Scheme_Thread *scheme_main_thread = NULL; THREAD_LOCAL Scheme_Thread *scheme_main_thread = NULL;
Scheme_Thread *scheme_first_thread = NULL; THREAD_LOCAL Scheme_Thread *scheme_first_thread = NULL;
Scheme_Thread *scheme_get_current_thread() { return scheme_current_thread; } Scheme_Thread *scheme_get_current_thread() { return scheme_current_thread; }
typedef struct Scheme_Thread_Set { THREAD_LOCAL Scheme_Thread_Set *scheme_thread_set_top;
Scheme_Object so;
struct Scheme_Thread_Set *parent;
Scheme_Object *first;
Scheme_Object *next;
Scheme_Object *prev;
Scheme_Object *search_start;
Scheme_Object *current;
} Scheme_Thread_Set;
Scheme_Thread_Set *thread_set_top;
static int num_running_threads = 1; static int num_running_threads = 1;
@ -174,10 +164,10 @@ static int did_gc_count;
static int init_load_on_demand = 1; static int init_load_on_demand = 1;
#ifdef RUNSTACK_IS_GLOBAL #ifdef RUNSTACK_IS_GLOBAL
Scheme_Object **scheme_current_runstack_start; THREAD_LOCAL Scheme_Object **scheme_current_runstack_start;
Scheme_Object **scheme_current_runstack; THREAD_LOCAL Scheme_Object **scheme_current_runstack;
MZ_MARK_STACK_TYPE scheme_current_cont_mark_stack; THREAD_LOCAL MZ_MARK_STACK_TYPE scheme_current_cont_mark_stack;
MZ_MARK_POS_TYPE scheme_current_cont_mark_pos; THREAD_LOCAL MZ_MARK_POS_TYPE scheme_current_cont_mark_pos;
#endif #endif
static Scheme_Custodian *main_custodian; static Scheme_Custodian *main_custodian;
@ -2076,7 +2066,8 @@ static void unschedule_in_set(Scheme_Object *s, Scheme_Thread_Set *t_set)
static Scheme_Thread *make_thread(Scheme_Config *config, static Scheme_Thread *make_thread(Scheme_Config *config,
Scheme_Thread_Cell_Table *cells, Scheme_Thread_Cell_Table *cells,
Scheme_Object *init_break_cell, Scheme_Object *init_break_cell,
Scheme_Custodian *mgr) Scheme_Custodian *mgr,
void *stack_base)
{ {
Scheme_Thread *process; Scheme_Thread *process;
int prefix = 0; int prefix = 0;
@ -2120,22 +2111,10 @@ static Scheme_Thread *make_thread(Scheme_Config *config,
scheme_fuel_counter_ptr = &scheme_fuel_counter; scheme_fuel_counter_ptr = &scheme_fuel_counter;
#endif #endif
/* Before a thread can be used stack_start must be set
* this code sets stack_start for the main_thread
* which is created with scheme_make_thread.
*
* make_subprocess is the only other caller of make_thread
* and it sets stack_start */
#if defined(MZ_PRECISE_GC) || defined(USE_SENORA_GC) #if defined(MZ_PRECISE_GC) || defined(USE_SENORA_GC)
{
void *ss;
ss = (void *)GC_get_stack_base();
process->stack_start = ss;
}
GC_get_thread_stack_base = get_current_stack_start; GC_get_thread_stack_base = get_current_stack_start;
#else
process->stack_start = GC_stackbottom;
#endif #endif
process->stack_start = stack_base;
} else { } else {
prefix = 1; prefix = 1;
@ -2178,10 +2157,10 @@ static Scheme_Thread *make_thread(Scheme_Config *config,
} }
if (SAME_OBJ(process, scheme_first_thread)) { if (SAME_OBJ(process, scheme_first_thread)) {
REGISTER_SO(thread_set_top); REGISTER_SO(scheme_thread_set_top);
thread_set_top = process->t_set_parent; scheme_thread_set_top = process->t_set_parent;
thread_set_top->first = (Scheme_Object *)process; scheme_thread_set_top->first = (Scheme_Object *)process;
thread_set_top->current = (Scheme_Object *)process; scheme_thread_set_top->current = (Scheme_Object *)process;
} else } else
schedule_in_set((Scheme_Object *)process, process->t_set_parent); schedule_in_set((Scheme_Object *)process, process->t_set_parent);
@ -2314,10 +2293,10 @@ static Scheme_Thread *make_thread(Scheme_Config *config,
return process; return process;
} }
Scheme_Thread *scheme_make_thread() Scheme_Thread *scheme_make_thread(void *stack_base)
{ {
/* Makes the initial process. */ /* Makes the initial process. */
return make_thread(NULL, NULL, NULL, NULL); return make_thread(NULL, NULL, NULL, NULL, stack_base);
} }
static void scheme_check_tail_buffer_size(Scheme_Thread *p) static void scheme_check_tail_buffer_size(Scheme_Thread *p)
@ -2532,7 +2511,7 @@ static void select_thread()
/* Try to pick a next thread to avoid DOS attacks /* Try to pick a next thread to avoid DOS attacks
through whatever kinds of things call select_thread() */ through whatever kinds of things call select_thread() */
o = (Scheme_Object *)thread_set_top; o = (Scheme_Object *)scheme_thread_set_top;
while (!SCHEME_THREADP(o)) { while (!SCHEME_THREADP(o)) {
t_set = (Scheme_Thread_Set *)o; t_set = (Scheme_Thread_Set *)o;
o = get_t_set_next(t_set->current); o = get_t_set_next(t_set->current);
@ -2851,7 +2830,7 @@ static Scheme_Object *make_subprocess(Scheme_Object *child_thunk,
maybe_recycle_cell = NULL; maybe_recycle_cell = NULL;
} }
child = make_thread(config, cells, break_cell, mgr); child = make_thread(config, cells, break_cell, mgr, child_start);
/* Use child_thunk name, if any, for the thread name: */ /* Use child_thunk name, if any, for the thread name: */
{ {
@ -3801,76 +3780,19 @@ void scheme_break_thread(Scheme_Thread *p)
# endif # endif
} }
void scheme_thread_block(float sleep_time) static void find_next_thread(Scheme_Thread **return_arg) {
/* If we're blocked, `sleep_time' is a max sleep time, Scheme_Thread *next;
not a min sleep time. Otherwise, it's a min & max sleep time. Scheme_Thread *p = scheme_current_thread;
This proc auto-resets p's blocking info if an escape occurs. */
{
double sleep_end;
Scheme_Thread *next, *p = scheme_current_thread;
Scheme_Object *next_in_set; Scheme_Object *next_in_set;
Scheme_Thread_Set *t_set; Scheme_Thread_Set *t_set;
if (p->running & MZTHREAD_KILLED) {
/* This thread is dead! Give up now. */
if (!do_atomic)
exit_or_escape(p);
}
if ((p->running & MZTHREAD_USER_SUSPENDED)
&& !(p->running & MZTHREAD_NEED_SUSPEND_CLEANUP)) {
/* This thread was suspended. */
wait_until_suspend_ok();
if (!p->next) {
/* Suspending the main thread... */
select_thread();
} else
scheme_weak_suspend_thread(p);
}
/* Check scheduled_kills early and often. */
check_scheduled_kills();
shrink_cust_box_array();
if (scheme_active_but_sleeping)
scheme_wake_up();
if (sleep_time > 0) {
sleep_end = scheme_get_inexact_milliseconds();
sleep_end += (sleep_time * 1000.0);
} else
sleep_end = 0;
start_sleep_check:
check_ready_break();
if (!p->external_break && !p->next && scheme_check_for_break && scheme_check_for_break())
p->external_break = 1;
if (p->external_break && !p->suspend_break && scheme_can_break(p)) {
raise_break(p);
goto start_sleep_check;
}
swap_or_sleep:
#ifdef USE_OSKIT_CONSOLE
scheme_check_keyboard_input();
#endif
/* Check scheduled_kills early and often. */
check_scheduled_kills();
if (!do_atomic && (sleep_end >= 0.0)) {
double msecs = 0.0; double msecs = 0.0;
/* Find the next process. Skip processes that are definitely /* Find the next process. Skip processes that are definitely
blocked. */ blocked. */
/* Start from the root */ /* Start from the root */
next_in_set = (Scheme_Object *)thread_set_top; next_in_set = (Scheme_Object *)scheme_thread_set_top;
t_set = NULL; /* this will get set at the beginning of the loop */ t_set = NULL; /* this will get set at the beginning of the loop */
/* Each thread may or may not be available. If it's not available, /* Each thread may or may not be available. If it's not available,
@ -3990,16 +3912,89 @@ void scheme_thread_block(float sleep_time)
/* As we go back to the top of the loop, we'll check whether /* As we go back to the top of the loop, we'll check whether
next_in_set is a thread or set, etc. */ next_in_set is a thread or set, etc. */
} }
p = NULL;
next_in_set = NULL;
t_set = NULL;
*return_arg = next;
next = NULL;
}
void scheme_thread_block(float sleep_time)
/* If we're blocked, `sleep_time' is a max sleep time,
not a min sleep time. Otherwise, it's a min & max sleep time.
This proc auto-resets p's blocking info if an escape occurs. */
{
double sleep_end;
Scheme_Thread *next;
Scheme_Thread *p = scheme_current_thread;
if (p->running & MZTHREAD_KILLED) {
/* This thread is dead! Give up now. */
if (!do_atomic)
exit_or_escape(p);
}
if ((p->running & MZTHREAD_USER_SUSPENDED)
&& !(p->running & MZTHREAD_NEED_SUSPEND_CLEANUP)) {
/* This thread was suspended. */
wait_until_suspend_ok();
if (!p->next) {
/* Suspending the main thread... */
select_thread();
} else
scheme_weak_suspend_thread(p);
}
/* Check scheduled_kills early and often. */
check_scheduled_kills();
shrink_cust_box_array();
if (scheme_active_but_sleeping)
scheme_wake_up();
if (sleep_time > 0) {
sleep_end = scheme_get_inexact_milliseconds();
sleep_end += (sleep_time * 1000.0);
} else
sleep_end = 0;
start_sleep_check:
check_ready_break();
if (!p->external_break && !p->next && scheme_check_for_break && scheme_check_for_break())
p->external_break = 1;
if (p->external_break && !p->suspend_break && scheme_can_break(p)) {
raise_break(p);
goto start_sleep_check;
}
swap_or_sleep:
#ifdef USE_OSKIT_CONSOLE
scheme_check_keyboard_input();
#endif
/* Check scheduled_kills early and often. */
check_scheduled_kills();
if (!do_atomic && (sleep_end >= 0.0)) {
find_next_thread(&next);
} else } else
next = NULL; next = NULL;
if (next) { if (next) {
/* Clear out search_start fields */ /* Clear out search_start fields */
Scheme_Thread_Set *t_set;
t_set = next->t_set_parent; t_set = next->t_set_parent;
while (t_set) { while (t_set) {
t_set->search_start = NULL; t_set->search_start = NULL;
t_set = t_set->parent; t_set = t_set->parent;
} }
t_set = NULL;
} }
if ((sleep_end > 0.0) && (p->block_descriptor == NOT_BLOCKED)) { if ((sleep_end > 0.0) && (p->block_descriptor == NOT_BLOCKED)) {
@ -4032,8 +4027,6 @@ void scheme_thread_block(float sleep_time)
if (next) { if (next) {
/* Swap in `next', but first clear references to other threads. */ /* Swap in `next', but first clear references to other threads. */
next_in_set = NULL;
t_set = NULL;
swap_target = next; swap_target = next;
next = NULL; next = NULL;
do_swap_thread(); do_swap_thread();

View File

@ -275,6 +275,8 @@ scheme_init_type (Scheme_Env *env)
#ifdef MZ_GC_BACKTRACE #ifdef MZ_GC_BACKTRACE
set_name(scheme_rt_meta_cont, "<meta-continuation>"); set_name(scheme_rt_meta_cont, "<meta-continuation>");
#endif #endif
set_name(scheme_place_type, "<place>");
set_name(scheme_engine_type, "<engine>");
} }
Scheme_Type scheme_make_type(const char *name) Scheme_Type scheme_make_type(const char *name)