merge Kevin's work so far on places
svn: r11226
This commit is contained in:
parent
edbbca1fa2
commit
04d7712988
25
src/configure
vendored
25
src/configure
vendored
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 \
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
358
src/mzscheme/src/mzrt.c
Normal 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
48
src/mzscheme/src/mzrt.h
Normal 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
|
|
@ -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
191
src/mzscheme/src/places.c
Normal 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
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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__ */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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_
|
||||||
};
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user