summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/maint/guile.texi16
-rw-r--r--doc/ref/api-scheduling.texi33
-rw-r--r--libguile.h1
-rw-r--r--libguile/Makefile.am4
-rw-r--r--libguile/eval.c42
-rw-r--r--libguile/eval.i.c7
-rw-r--r--libguile/futures.c375
-rw-r--r--libguile/futures.h91
-rw-r--r--libguile/init.c6
-rw-r--r--libguile/tags.h13
10 files changed, 6 insertions, 582 deletions
diff --git a/doc/maint/guile.texi b/doc/maint/guile.texi
index 3b5305e8e..127f0bbc9 100644
--- a/doc/maint/guile.texi
+++ b/doc/maint/guile.texi
@@ -1750,22 +1750,6 @@ current interfaces. If a file cannot be opened with the access
requested, @code{open-file} throws an exception.
@end deffn
- make-future
-@c snarfed from futures.c:89
-@deffn {Scheme Procedure} make-future thunk
-@deffnx {C Function} scm_make_future (thunk)
-Make a future evaluating THUNK.
-@end deffn
-
- future-ref
-@c snarfed from futures.c:221
-@deffn {Scheme Procedure} future-ref future
-@deffnx {C Function} scm_future_ref (future)
-If the future @var{x} has not been computed yet, compute and
-return @var{x}, otherwise just return the previously computed
-value.
-@end deffn
-
gc-live-object-stats
@c snarfed from gc.c:276
@deffn {Scheme Procedure} gc-live-object-stats
diff --git a/doc/ref/api-scheduling.texi b/doc/ref/api-scheduling.texi
index 34697d3cf..8382ba3f1 100644
--- a/doc/ref/api-scheduling.texi
+++ b/doc/ref/api-scheduling.texi
@@ -792,39 +792,6 @@ Like @code{scm_with_dynamic_state}, but call @var{func} with
@var{data}.
@end deftypefn
-@c @node Futures
-@c @subsection Futures
-@c @cindex futures
-
-@c -- Futures are disabled for the time being, see futures.h for an
-@c -- explanation.
-
-@c Futures are a convenient way to run a calculation in a new thread, and
-@c only wait for the result when it's actually needed.
-
-@c Futures are similar to promises (@pxref{Delayed Evaluation}), in that
-@c they allow mainline code to continue immediately. But @code{delay}
-@c doesn't evaluate at all until forced, whereas @code{future} starts
-@c immediately in a new thread.
-
-@c @deffn {syntax} future expr
-@c Begin evaluating @var{expr} in a new thread, and return a ``future''
-@c object representing the calculation.
-@c @end deffn
-
-@c @deffn {Scheme Procedure} make-future thunk
-@c @deffnx {C Function} scm_make_future (thunk)
-@c Begin evaluating the call @code{(@var{thunk})} in a new thread, and
-@c return a ``future'' object representing the calculation.
-@c @end deffn
-
-@c @deffn {Scheme Procedure} future-ref f
-@c @deffnx {C Function} scm_future_ref (f)
-@c Return the value computed by the future @var{f}. If @var{f} has not
-@c yet finished executing then wait for it to do so.
-@c @end deffn
-
-
@node Parallel Forms
@subsection Parallel forms
@cindex parallel forms
diff --git a/libguile.h b/libguile.h
index 7967c2b51..73b3de76b 100644
--- a/libguile.h
+++ b/libguile.h
@@ -51,7 +51,6 @@ extern "C" {
#include "libguile/filesys.h"
#include "libguile/fluids.h"
#include "libguile/fports.h"
-#include "libguile/futures.h"
#include "libguile/gc.h"
#include "libguile/gdbint.h"
#include "libguile/generalized-arrays.h"
diff --git a/libguile/Makefile.am b/libguile/Makefile.am
index 2e8457b2f..96c66a79e 100644
--- a/libguile/Makefile.am
+++ b/libguile/Makefile.am
@@ -131,7 +131,6 @@ libguile_la_SOURCES = \
fluids.c \
fports.c \
frames.c \
- futures.c \
gc-malloc.c \
gc.c \
gdbint.c \
@@ -230,7 +229,6 @@ DOT_X_FILES = \
feature.x \
fluids.x \
fports.x \
- futures.x \
gc-malloc.x \
gc.x \
gettext.x \
@@ -327,7 +325,6 @@ DOT_DOC_FILES = \
feature.doc \
fluids.doc \
fports.doc \
- futures.doc \
gc-malloc.doc \
gc.doc \
gettext.doc \
@@ -483,7 +480,6 @@ modinclude_HEADERS = \
fluids.h \
fports.h \
frames.h \
- futures.h \
gc.h \
gdb_interface.h \
gdbint.h \
diff --git a/libguile/eval.c b/libguile/eval.c
index 59db42976..3c9625117 100644
--- a/libguile/eval.c
+++ b/libguile/eval.c
@@ -41,7 +41,6 @@
#include "libguile/eq.h"
#include "libguile/feature.h"
#include "libguile/fluids.h"
-#include "libguile/futures.h"
#include "libguile/goops.h"
#include "libguile/hash.h"
#include "libguile/hashtab.h"
@@ -409,7 +408,6 @@ static const char *const isymnames[] =
"#@slot-ref",
"#@slot-set!",
"#@delay",
- "#@future",
"#@call-with-values",
"#@else",
"#@arrow",
@@ -784,9 +782,6 @@ static SCM scm_m_do (SCM xorig, SCM env);
static SCM scm_m_quasiquote (SCM xorig, SCM env);
static SCM scm_m_delay (SCM xorig, SCM env);
static SCM scm_m_generalized_set_x (SCM xorig, SCM env);
-#if 0 /* Futures are disabled, see "futures.h". */
-static SCM scm_m_future (SCM xorig, SCM env);
-#endif
static SCM scm_m_define (SCM x, SCM env);
static SCM scm_m_letrec (SCM xorig, SCM env);
static SCM scm_m_let (SCM xorig, SCM env);
@@ -2196,36 +2191,6 @@ scm_m_eval_when (SCM expr, SCM env SCM_UNUSED)
return scm_list_1 (SCM_IM_BEGIN);
}
-#if 0
-
-/* See futures.h for a comment why futures are not enabled.
- */
-
-SCM_SYNTAX (s_future, "future", scm_i_makbimacro, scm_m_future);
-SCM_GLOBAL_SYMBOL (scm_sym_future, s_future);
-
-/* Like promises, futures are implemented as closures with an empty
- * parameter list. Thus, (future <expression>) is transformed into
- * (#@future '() <expression>), where the empty list represents the
- * empty parameter list. This representation allows for easy creation
- * of the closure during evaluation. */
-static SCM
-scm_m_future (SCM expr, SCM env)
-{
- const SCM new_expr = memoize_as_thunk_prototype (expr, env);
- SCM_SETCAR (new_expr, SCM_IM_FUTURE);
- return new_expr;
-}
-
-static SCM
-unmemoize_future (const SCM expr, const SCM env)
-{
- const SCM thunk_expr = SCM_CADDR (expr);
- return scm_list_2 (scm_sym_future, unmemoize_expression (thunk_expr, env));
-}
-
-#endif /* futures disabled. */
-
SCM_SYNTAX (s_gset_x, "set!", scm_i_makbimacro, scm_m_generalized_set_x);
SCM_SYMBOL (scm_sym_setter, "setter");
@@ -2494,13 +2459,6 @@ unmemoize_builtin_macro (const SCM expr, const SCM env)
case (ISYMNUM (SCM_IM_CALL_WITH_VALUES)):
return unmemoize_at_call_with_values (expr, env);
-#if 0
- /* See futures.h for a comment why futures are not enabled.
- */
- case (ISYMNUM (SCM_IM_FUTURE)):
- return unmemoize_future (expr, env);
-#endif
-
case (ISYMNUM (SCM_IM_SLOT_REF)):
return unmemoize_atslot_ref (expr, env);
diff --git a/libguile/eval.i.c b/libguile/eval.i.c
index d9ec6cd5a..5b4604a7a 100644
--- a/libguile/eval.i.c
+++ b/libguile/eval.i.c
@@ -734,13 +734,6 @@ dispatch:
case (ISYMNUM (SCM_IM_DELAY)):
RETURN (scm_make_promise (scm_closure (SCM_CDR (x), env)));
-#if 0
- /* See futures.h for a comment why futures are not enabled.
- */
- case (ISYMNUM (SCM_IM_FUTURE)):
- RETURN (scm_i_make_future (scm_closure (SCM_CDR (x), env)));
-#endif
-
/* PLACEHOLDER for case (ISYMNUM (SCM_IM_DISPATCH)): The following
code (type_dispatch) is intended to be the tail of the case
clause for the internal macro SCM_IM_DISPATCH. Please don't
diff --git a/libguile/futures.c b/libguile/futures.c
deleted file mode 100644
index b330f4ded..000000000
--- a/libguile/futures.c
+++ /dev/null
@@ -1,375 +0,0 @@
-/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2003, 2006, 2008 Free Software Foundation, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 3 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-
-
-
-#if 0
-
-/* This whole file is not being compiled. See futures.h for the
- reason.
-*/
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include "libguile/_scm.h"
-#include "libguile/eval.h"
-#include "libguile/ports.h"
-#include "libguile/validate.h"
-#include "libguile/stime.h"
-#include "libguile/threads.h"
-
-#include "libguile/futures.h"
-
-#define LINK(list, obj) \
-do { \
- SCM_SET_FUTURE_NEXT (obj, list); \
- list = obj; \
-} while (0)
-
-#define UNLINK(list, obj) \
-do { \
- obj = list; \
- list = SCM_FUTURE_NEXT (list); \
-} while (0)
-
-scm_i_pthread_mutex_t future_admin_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER;
-
-static SCM futures = SCM_EOL;
-static SCM young = SCM_EOL;
-static SCM old = SCM_EOL;
-static SCM undead = SCM_EOL;
-
-static long last_switch;
-
-#ifdef SCM_FUTURES_DEBUG
-static int n_dead = 0;
-
-static SCM
-count (SCM ls)
-{
- int n = 0;
- while (!scm_is_null (ls))
- {
- ++n;
- ls = SCM_FUTURE_NEXT (ls);
- }
- return scm_from_int (n);
-}
-
-extern SCM scm_future_cache_status (void);
-
-SCM_DEFINE (scm_future_cache_status, "future-cache-status", 0, 0, 0,
- (),
- "Return a list containing number of futures, youngs, olds, undeads and deads.")
-#define FUNC_NAME s_scm_future_cache_status
-{
- int nd = n_dead;
- n_dead = 0;
- return scm_list_5 (count (futures),
- count (young),
- count (old),
- count (undead),
- scm_from_int (nd));
-}
-#undef FUNC_NAME
-
-#endif
-
-SCM *scm_loc_sys_thread_handler;
-
-SCM_DEFINE (scm_make_future, "make-future", 1, 0, 0,
- (SCM thunk),
- "Make a future evaluating THUNK.")
-#define FUNC_NAME s_scm_make_future
-{
- SCM_VALIDATE_THUNK (1, thunk);
- return scm_i_make_future (thunk);
-}
-#undef FUNC_NAME
-
-static char *s_future = "future";
-
-static void
-cleanup (scm_t_future *future)
-{
- scm_i_pthread_mutex_destroy (&future->mutex);
- scm_i_pthread_cond_destroy (&future->cond);
- scm_gc_free (future, sizeof (*future), s_future);
-#ifdef SCM_FUTURES_DEBUG
- ++n_dead;
-#endif
-}
-
-static SCM
-future_loop (scm_t_future *future)
-{
- scm_i_scm_pthread_mutex_lock (&future->mutex);
- do {
- if (future->status == SCM_FUTURE_SIGNAL_ME)
- scm_i_pthread_cond_broadcast (&future->cond);
- future->status = SCM_FUTURE_COMPUTING;
- future->data = (SCM_CLOSUREP (future->data)
- ? scm_i_call_closure_0 (future->data)
- : scm_call_0 (future->data));
- scm_i_scm_pthread_cond_wait (&future->cond, &future->mutex);
- } while (!future->die_p);
- future->status = SCM_FUTURE_DEAD;
- scm_i_pthread_mutex_unlock (&future->mutex);
- return SCM_UNSPECIFIED;
-}
-
-static SCM
-future_handler (scm_t_future *future, SCM key, SCM args)
-{
- future->status = SCM_FUTURE_DEAD;
- scm_i_pthread_mutex_unlock (&future->mutex);
- return scm_apply_1 (*scm_loc_sys_thread_handler, key, args);
-}
-
-static SCM
-alloc_future (SCM thunk)
-{
- scm_t_future *f = scm_gc_malloc (sizeof (*f), s_future);
- SCM future;
- f->data = SCM_BOOL_F;
- scm_i_pthread_mutex_init (&f->mutex, NULL);
- scm_i_pthread_cond_init (&f->cond, NULL);
- f->die_p = 0;
- f->status = SCM_FUTURE_TASK_ASSIGNED;
- scm_i_scm_pthread_mutex_lock (&future_admin_mutex);
- SCM_NEWSMOB2 (future, scm_tc16_future, futures, f);
- SCM_SET_FUTURE_DATA (future, thunk);
- futures = future;
- scm_i_pthread_mutex_unlock (&future_admin_mutex);
- scm_spawn_thread ((scm_t_catch_body) future_loop,
- SCM_FUTURE (future),
- (scm_t_catch_handler) future_handler,
- SCM_FUTURE (future));
- return future;
-}
-
-static void
-kill_future (SCM future)
-{
- SCM_FUTURE (future)->die_p = 1;
- LINK (undead, future);
-}
-
-SCM
-scm_i_make_future (SCM thunk)
-{
- SCM future;
- scm_i_scm_pthread_mutex_lock (&future_admin_mutex);
- while (1)
- {
- if (!scm_is_null (old))
- UNLINK (old, future);
- else if (!scm_is_null (young))
- UNLINK (young, future);
- else
- {
- scm_i_pthread_mutex_unlock (&future_admin_mutex);
- return alloc_future (thunk);
- }
- if (scm_i_pthread_mutex_trylock (SCM_FUTURE_MUTEX (future)))
- kill_future (future);
- else if (!SCM_FUTURE_ALIVE_P (future))
- {
- scm_i_pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
- cleanup (SCM_FUTURE (future));
- }
- else
- break;
- }
- LINK (futures, future);
- scm_i_pthread_mutex_unlock (&future_admin_mutex);
- SCM_SET_FUTURE_DATA (future, thunk);
- SCM_SET_FUTURE_STATUS (future, SCM_FUTURE_TASK_ASSIGNED);
- scm_i_pthread_cond_signal (SCM_FUTURE_COND (future));
- scm_i_pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
- return future;
-}
-
-
-static int
-future_print (SCM exp, SCM port, scm_print_state *pstate)
-{
- int writingp = SCM_WRITINGP (pstate);
- scm_puts ("#<future ", port);
- SCM_SET_WRITINGP (pstate, 1);
- scm_iprin1 (SCM_FUTURE_DATA (exp), port, pstate);
- SCM_SET_WRITINGP (pstate, writingp);
- scm_putc ('>', port);
- return !0;
-}
-
-SCM_DEFINE (scm_future_ref, "future-ref", 1, 0, 0,
- (SCM future),
- "If the future @var{x} has not been computed yet, compute and\n"
- "return @var{x}, otherwise just return the previously computed\n"
- "value.")
-#define FUNC_NAME s_scm_future_ref
-{
- SCM res;
- SCM_VALIDATE_FUTURE (1, future);
- scm_i_scm_pthread_mutex_lock (SCM_FUTURE_MUTEX (future));
- if (SCM_FUTURE_STATUS (future) != SCM_FUTURE_COMPUTING)
- {
- SCM_SET_FUTURE_STATUS (future, SCM_FUTURE_SIGNAL_ME);
- scm_i_scm_pthread_cond_wait (SCM_FUTURE_COND (future),
- SCM_FUTURE_MUTEX (future));
- }
- if (!SCM_FUTURE_ALIVE_P (future))
- {
- scm_i_pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
- SCM_MISC_ERROR ("requesting result from failed future ~A",
- scm_list_1 (future));
- }
- res = SCM_FUTURE_DATA (future);
- scm_i_pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
- return res;
-}
-#undef FUNC_NAME
-
-static void
-kill_futures (SCM victims)
-{
- while (!scm_is_null (victims))
- {
- SCM future;
- UNLINK (victims, future);
- kill_future (future);
- scm_i_pthread_cond_signal (SCM_FUTURE_COND (future));
- }
-}
-
-static void
-cleanup_undead ()
-{
- SCM next = undead, *nextloc = &undead;
- while (!scm_is_null (next))
- {
- if (scm_i_pthread_mutex_trylock (SCM_FUTURE_MUTEX (next)))
- goto next;
- else if (SCM_FUTURE_ALIVE_P (next))
- {
- scm_i_pthread_cond_signal (SCM_FUTURE_COND (next));
- scm_i_pthread_mutex_unlock (SCM_FUTURE_MUTEX (next));
- next:
- SCM_SET_GC_MARK (next);
- nextloc = SCM_FUTURE_NEXTLOC (next);
- next = *nextloc;
- }
- else
- {
- SCM future;
- UNLINK (next, future);
- scm_i_pthread_mutex_unlock (SCM_FUTURE_MUTEX (future));
- cleanup (SCM_FUTURE (future));
- *nextloc = next;
- }
- }
-}
-
-static void
-mark_futures (SCM futures)
-{
- while (!scm_is_null (futures))
- {
- SCM_SET_GC_MARK (futures);
- futures = SCM_FUTURE_NEXT (futures);
- }
-}
-
-static void *
-scan_futures (void *dummy1, void *dummy2, void *dummy3)
-{
- SCM next, *nextloc;
-
- long now = scm_c_get_internal_run_time ();
- if (now - last_switch > SCM_TIME_UNITS_PER_SECOND)
- {
- /* switch out old (> 1 sec), unused futures */
- kill_futures (old);
- old = young;
- young = SCM_EOL;
- last_switch = now;
- }
- else
- mark_futures (young);
-
- next = futures;
- nextloc = &futures;
- while (!scm_is_null (next))
- {
- if (!SCM_GC_MARK_P (next))
- goto free;
- keep:
- nextloc = SCM_FUTURE_NEXTLOC (next);
- next = *nextloc;
- }
- goto exit;
- while (!scm_is_null (next))
- {
- if (SCM_GC_MARK_P (next))
- {
- *nextloc = next;
- goto keep;
- }
- free:
- {
- SCM future;
- UNLINK (next, future);
- SCM_SET_GC_MARK (future);
- LINK (young, future);
- }
- }
- *nextloc = SCM_EOL;
- exit:
- cleanup_undead ();
- mark_futures (old);
- return 0;
-}
-
-scm_t_bits scm_tc16_future;
-
-void
-scm_init_futures ()
-{
- last_switch = scm_c_get_internal_run_time ();
-
- scm_loc_sys_thread_handler
- = SCM_VARIABLE_LOC (scm_c_define ("%thread-handler", SCM_BOOL_F));
-
- scm_tc16_future = scm_make_smob_type ("future", 0);
- scm_set_smob_print (scm_tc16_future, future_print);
-
- scm_c_hook_add (&scm_before_sweep_c_hook, scan_futures, 0, 0);
-#include "libguile/futures.x"
-}
-
-#endif
-
-/*
- Local Variables:
- c-file-style: "gnu"
- End:
-*/
diff --git a/libguile/futures.h b/libguile/futures.h
deleted file mode 100644
index 5d7712e1a..000000000
--- a/libguile/futures.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/* classes: h_files */
-
-#ifndef SCM_FUTURES_H
-#define SCM_FUTURES_H
-
-/* Copyright (C) 2002, 2003, 2006, 2008 Free Software Foundation, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 3 of
- * the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
- * 02110-1301 USA
- */
-
-
-
-#if 0
-
-/* Futures have the following known bugs, which should be fixed before
- including them in Guile:
-
- - The implementation of the thread cache needs to be better so that
- it behaves reasonable under heavy use.
-
- - The dynamic state of a thread needs to be properly initialized
- when it is retrieved from the cache.
-*/
-
-#include "libguile/__scm.h"
-#include "libguile/threads.h"
-
-
-
-typedef struct scm_t_future {
- SCM data;
- scm_i_pthread_mutex_t mutex;
- scm_i_pthread_cond_t cond;
- int status;
- int die_p;
-} scm_t_future;
-
-#define SCM_FUTURE_DEAD 0
-#define SCM_FUTURE_SIGNAL_ME -1
-#define SCM_FUTURE_COMPUTING 1
-#define SCM_FUTURE_TASK_ASSIGNED 2
-
-#define SCM_VALIDATE_FUTURE(pos, obj) \
- SCM_ASSERT_TYPE (SCM_TYP16_PREDICATE (scm_tc16_future, obj), \
- obj, pos, FUNC_NAME, "future");
-#define SCM_FUTURE(future) ((scm_t_future *) SCM_SMOB_DATA_2 (future))
-#define SCM_FUTURE_MUTEX(future) (&SCM_FUTURE (future)->mutex)
-#define SCM_FUTURE_COND(future) (&SCM_FUTURE (future)->cond)
-#define SCM_FUTURE_STATUS(future) (SCM_FUTURE (future)->status)
-#define SCM_SET_FUTURE_STATUS(future, x) \
- do { SCM_FUTURE (future)->status = (x); } while (0)
-#define SCM_FUTURE_ALIVE_P(future) (SCM_FUTURE_STATUS (future))
-#define SCM_FUTURE_DATA(future) (SCM_FUTURE (future)->data)
-#define SCM_SET_FUTURE_DATA(future, x) \
- do { SCM_FUTURE (future)->data = (x); } while (0)
-#define SCM_FUTURE_NEXT SCM_SMOB_OBJECT
-#define SCM_FUTURE_NEXTLOC SCM_SMOB_OBJECT_LOC
-#define SCM_SET_FUTURE_NEXT SCM_SET_SMOB_OBJECT
-
-SCM_API scm_t_bits scm_tc16_future;
-
-extern SCM *scm_loc_sys_thread_handler;
-
-SCM_INTERNAL SCM scm_i_make_future (SCM thunk);
-SCM_API SCM scm_make_future (SCM thunk);
-SCM_API SCM scm_future_ref (SCM future);
-
-void scm_init_futures (void);
-
-#endif /* Futures are disabled for now. */
-
-#endif /* SCM_FUTURES_H */
-
-/*
- Local Variables:
- c-file-style: "gnu"
- End:
-*/
diff --git a/libguile/init.c b/libguile/init.c
index 3fbe3685f..68156ef28 100644
--- a/libguile/init.c
+++ b/libguile/init.c
@@ -60,7 +60,6 @@
#include "libguile/filesys.h"
#include "libguile/fluids.h"
#include "libguile/fports.h"
-#include "libguile/futures.h"
#include "libguile/gc.h"
#include "libguile/gdbint.h"
#include "libguile/generalized-arrays.h"
@@ -479,11 +478,6 @@ scm_i_init_guile (SCM_STACKITEM *base)
scm_init_dynwind ();
scm_init_eq ();
scm_init_error ();
-#if 0
- /* See futures.h for a comment why futures are not enabled.
- */
- scm_init_futures ();
-#endif
scm_init_fluids ();
scm_init_feature (); /* Requires fluids */
scm_init_backtrace (); /* Requires fluids */
diff --git a/libguile/tags.h b/libguile/tags.h
index 2d14ed2fc..f74573244 100644
--- a/libguile/tags.h
+++ b/libguile/tags.h
@@ -613,7 +613,7 @@ enum scm_tc8_tags
/* Evaluator byte codes ('immediate symbols'). These constants are used only
* in eval but their values have to be allocated here. The indices of the
- * SCM_IM_ symbols must agree with the declarations in print.c:
+ * SCM_IM_ symbols must agree with the declarations in eval.c:
* scm_isymnames. */
#define SCM_ISYMP(n) (SCM_ITAG8 (n) == scm_tc8_isym)
@@ -639,12 +639,11 @@ enum scm_tc8_tags
#define SCM_IM_SLOT_REF SCM_MAKISYM (17)
#define SCM_IM_SLOT_SET_X SCM_MAKISYM (18)
#define SCM_IM_DELAY SCM_MAKISYM (19)
-#define SCM_IM_FUTURE SCM_MAKISYM (20)
-#define SCM_IM_CALL_WITH_VALUES SCM_MAKISYM (21)
-#define SCM_IM_ELSE SCM_MAKISYM (22)
-#define SCM_IM_ARROW SCM_MAKISYM (23)
-#define SCM_IM_NIL_COND SCM_MAKISYM (24) /* Multi-language support */
-#define SCM_IM_BIND SCM_MAKISYM (25) /* Multi-language support */
+#define SCM_IM_CALL_WITH_VALUES SCM_MAKISYM (20)
+#define SCM_IM_ELSE SCM_MAKISYM (21)
+#define SCM_IM_ARROW SCM_MAKISYM (22)
+#define SCM_IM_NIL_COND SCM_MAKISYM (23) /* Multi-language support */
+#define SCM_IM_BIND SCM_MAKISYM (24) /* Multi-language support */