From 2b0633268ca419a9fcabe427ec1626443864f5c5 Mon Sep 17 00:00:00 2001 From: dtc <dtc> Date: Wed, 24 Sep 1997 15:48:08 +0000 Subject: [PATCH] Add support for the scavenging of conservative roots in vectors placed in the *control-stacks* vector. --- lisp/cgc.c | 59 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/lisp/cgc.c b/lisp/cgc.c index 06b2d7585..a31df6f60 100644 --- a/lisp/cgc.c +++ b/lisp/cgc.c @@ -1,5 +1,5 @@ /* cgc.c -*- Mode: C; comment-column: 40; -*- - * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/cgc.c,v 1.4 1997/04/13 21:04:51 pw Exp $ + * $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/lisp/cgc.c,v 1.5 1997/09/24 15:48:08 dtc Exp $ * * Conservative Garbage Collector for CMUCL x86. * @@ -1454,23 +1454,57 @@ static void flip_spaces() #define ACROSS_STACK(var) var=(void**)BOS-1; var > (void**)&var; var-- #endif -static void preserve_stack() +void preserve_pointer(void *ptr) { - void **addr; /* auto var is current TOS */ - for (ACROSS_STACK(addr)) + if (ptr > heap_base && ptr < heap_end) { - void *ptr = *addr; - if (ptr > heap_base && ptr < heap_end) + struct region *region = find_region(ptr); + if (region != NULL && region->space == oldspace) { - struct region *region = find_region(ptr); - if (region != NULL && region->space == oldspace) - { - dprintf(0,("move %x\n",ptr)); - move_to_newspace(region); - } + dprintf(0,("move %x\n",ptr)); + move_to_newspace(region); } } } + +static void preserve_stack() +{ + void **addr; /* auto var is current TOS */ + for (ACROSS_STACK(addr)) + preserve_pointer(*addr); +} + +#ifdef CONTROL_STACKS +/* Scavenge the thread stack conservative roots. */ +void scavenge_thread_stacks(void) +{ + lispobj thread_stacks = SymbolValue(CONTROL_STACKS); + int type = TypeOf(thread_stacks); + + if (LowtagOf(thread_stacks)==type_OtherPointer) { + struct vector *vector = (struct vector *) PTR(thread_stacks); + int length, i; + if (TypeOf(vector->header)!=type_SimpleVector) + return; + length = fixnum_value(vector->length); + for (i=0; i<length; i++) { + lispobj stack_obj = vector->data[i]; + if (LowtagOf(stack_obj)==type_OtherPointer) { + struct vector *stack = (struct vector *) PTR(stack_obj); + int length, j; + if (TypeOf(stack->header)!=type_SimpleArrayUnsignedByte32) + return; + length = fixnum_value(stack->length); + /* fprintf(stderr,"Scavenging control stack %d of length %d words\n", + i,length); */ + for (j=0; j<length; j++) + preserve_pointer((void *)stack->data[j]); + } + } + } +} +#endif + static void zero_stack() { /* This is a bit tricky because we don't want to zap any @@ -1785,6 +1819,7 @@ void cgc_collect_garbage() preserve_interrupt_contexts(); dprintf(noise,("[Preserve Stack]\n")); preserve_stack(); + scavenge_thread_stacks(); dprintf(noise,("[Scavenge Roots]\n")); scavenge_roots(); dprintf(noise,("[Scavenge New]\n")); -- GitLab