summaryrefslogtreecommitdiff
path: root/libguile/continuations.c
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2008-09-10 22:27:30 +0200
committerLudovic Courtès <ludo@gnu.org>2008-09-10 22:27:30 +0200
commit35a9197ccc91a3663313e1bf7d369101754a1075 (patch)
tree0389f04f4267d26b70c8e8cd54329be28ccf438b /libguile/continuations.c
parente7bca22779c68b800c75fdad8841440dfeb32f8d (diff)
parentf30e1bdf97ae8b2b2918da585f887a4d3a23a347 (diff)
downloadguile-35a9197ccc91a3663313e1bf7d369101754a1075.tar.gz
Merge commit 'f30e1bdf97ae8b2b2918da585f887a4d3a23a347' into boehm-demers-weiser-gc
Conflicts: libguile/Makefile.am libguile/coop-pthreads.c libguile/gc-freelist.c libguile/gc-segment.c libguile/gc.c libguile/private-gc.h test-suite/tests/environments.nottest
Diffstat (limited to 'libguile/continuations.c')
-rw-r--r--libguile/continuations.c36
1 files changed, 10 insertions, 26 deletions
diff --git a/libguile/continuations.c b/libguile/continuations.c
index f9e52df2a..a06ae79ab 100644
--- a/libguile/continuations.c
+++ b/libguile/continuations.c
@@ -57,22 +57,6 @@ continuation_print (SCM obj, SCM port, scm_print_state *state SCM_UNUSED)
return 1;
}
-#ifdef __ia64__
-/* Extern declaration of getcontext()/setcontext() in order to redefine
- getcontext() since on ia64-linux the second return value indicates whether
- it returned from getcontext() itself or by running setcontext(). */
-struct rv
-{
- long retval;
- long first_return;
-};
-
-#ifdef __GNUC__
-__attribute__ ((returns_twice))
-#endif /* __GNUC__ */
-extern struct rv ia64_getcontext (ucontext_t *) __asm__ ("getcontext");
-#endif /* __ia64__ */
-
/* this may return more than once: the first time with the escape
procedure, then subsequently with the value to be passed to the
continuation. */
@@ -85,9 +69,6 @@ scm_make_continuation (int *first)
scm_t_contregs *continuation;
long stack_size;
SCM_STACKITEM * src;
-#ifdef __ia64__
- struct rv rv;
-#endif /* __ia64__ */
SCM_FLUSH_REGISTER_WINDOWS;
stack_size = scm_stack_size (thread->continuation_base);
@@ -109,20 +90,23 @@ scm_make_continuation (int *first)
memcpy (continuation->stack, src, sizeof (SCM_STACKITEM) * stack_size);
#ifdef __ia64__
- rv = ia64_getcontext (&continuation->ctx);
- if (rv.first_return)
+ continuation->fresh = 1;
+ getcontext (&continuation->ctx);
+ if (continuation->fresh)
{
- continuation->backing_store_size =
- continuation->ctx.uc_mcontext.sc_ar_bsp -
- (unsigned long) __libc_ia64_register_backing_store_base;
+ continuation->backing_store_size =
+ (char *) scm_ia64_ar_bsp(&continuation->ctx)
+ -
+ (char *) scm_ia64_register_backing_store_base ();
continuation->backing_store = NULL;
continuation->backing_store =
scm_gc_malloc (continuation->backing_store_size,
"continuation backing store");
memcpy (continuation->backing_store,
- (void *) __libc_ia64_register_backing_store_base,
+ (void *) scm_ia64_register_backing_store_base (),
continuation->backing_store_size);
*first = 1;
+ continuation->fresh = 0;
return cont;
}
else
@@ -217,7 +201,7 @@ copy_stack_and_call (scm_t_contregs *continuation, SCM val,
continuation->throw_value = val;
#ifdef __ia64__
- memcpy ((void *) __libc_ia64_register_backing_store_base,
+ memcpy (scm_ia64_register_backing_store_base (),
continuation->backing_store,
continuation->backing_store_size);
setcontext (&continuation->ctx);