X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fcheneygc.c;h=2fe298ce8957fa4a2229c11ee3d1fdcef8790bff;hb=5e92e9ed61903658015c2a75c79a32ad41dbd29d;hp=6679f111fcb866f7faeb833b8d3aebe468901e09;hpb=481348f2f96f364374f669786f9fc61348decabc;p=sbcl.git diff --git a/src/runtime/cheneygc.c b/src/runtime/cheneygc.c index 6679f11..2fe298c 100644 --- a/src/runtime/cheneygc.c +++ b/src/runtime/cheneygc.c @@ -124,8 +124,6 @@ collect_garbage(unsigned ignore) unsigned long control_stack_size, binding_stack_size; sigset_t tmp, old; struct thread *th=arch_os_get_current_thread(); - struct interrupt_data *data=th->interrupt_data; - #ifdef PRINTNOISE printf("[Collecting garbage ... \n"); @@ -177,8 +175,8 @@ collect_garbage(unsigned ignore) printf("Scavenging interrupt handlers (%d bytes) ...\n", (int)sizeof(interrupt_handlers)); #endif - scavenge((lispobj *) data->interrupt_handlers, - sizeof(data->interrupt_handlers) / sizeof(lispobj)); + scavenge((lispobj *) interrupt_handlers, + sizeof(interrupt_handlers) / sizeof(lispobj)); /* _size quantities are in units of sizeof(lispobj) - i.e. 4 */ control_stack_size = @@ -586,34 +584,28 @@ gc_initialize_pointers(void) /* noise to manipulate the gc trigger stuff */ /* Functions that substantially change the dynamic space free pointer - * (collect_garbage, purify) are responsible also for resettting the + * (collect_garbage, purify) are responsible also for resetting the * auto_gc_trigger */ void set_auto_gc_trigger(os_vm_size_t dynamic_usage) { - os_vm_address_t addr=(os_vm_address_t)current_dynamic_space - + dynamic_usage; - long length = DYNAMIC_SPACE_SIZE - dynamic_usage; - - if (addr < (os_vm_address_t)dynamic_space_free_pointer) { - fprintf(stderr, - "set_auto_gc_trigger: tried to set gc trigger too low! (%ld < 0x%08lx)\n", - (unsigned long)dynamic_usage, - (unsigned long)((os_vm_address_t)dynamic_space_free_pointer - - (os_vm_address_t)current_dynamic_space)); - lose("lost"); - } - else if (length < 0) { - fprintf(stderr, - "set_auto_gc_trigger: tried to set gc trigger too high! (0x%08lx)\n", - (unsigned long)dynamic_usage); - lose("lost"); - } - - addr=os_round_up_to_page(addr); - length=os_trunc_size_to_page(length); + os_vm_address_t addr; + os_vm_size_t length; + + addr = os_round_up_to_page((os_vm_address_t)current_dynamic_space + + dynamic_usage); + if (addr < (os_vm_address_t)dynamic_space_free_pointer) + lose("set_auto_gc_trigger: tried to set gc trigger too low! (%ld < 0x%08lx)\n", + (unsigned long)dynamic_usage, + (unsigned long)((os_vm_address_t)dynamic_space_free_pointer + - (os_vm_address_t)current_dynamic_space)); + + length = os_trunc_size_to_page(DYNAMIC_SPACE_SIZE - dynamic_usage); + if (length < 0) + lose("set_auto_gc_trigger: tried to set gc trigger too high! (0x%08lx)\n", + (unsigned long)dynamic_usage); #if defined(SUNOS) || defined(SOLARIS) - os_invalidate(addr,length); + os_invalidate(addr, length); #else os_protect(addr, length, 0); #endif @@ -623,19 +615,21 @@ void set_auto_gc_trigger(os_vm_size_t dynamic_usage) void clear_auto_gc_trigger(void) { - if (current_auto_gc_trigger!=NULL){ -#if defined(SUNOS) || defined(SOLARIS)/* don't want to force whole space into swapping mode... */ - os_vm_address_t addr=(os_vm_address_t)current_auto_gc_trigger; - os_vm_size_t length= - DYNAMIC_SPACE_SIZE + (os_vm_address_t)current_dynamic_space - addr; + os_vm_address_t addr; + os_vm_size_t length; - os_validate(addr,length); + if (current_auto_gc_trigger == NULL) + return; + + addr = (os_vm_address_t)current_auto_gc_trigger; + length = DYNAMIC_SPACE_SIZE + (os_vm_address_t)current_dynamic_space - addr; + +#if defined(SUNOS) || defined(SOLARIS) + /* don't want to force whole space into swapping mode... */ + os_validate(addr, length); #else - os_protect((os_vm_address_t)current_dynamic_space, - DYNAMIC_SPACE_SIZE, - OS_VM_PROT_ALL); + os_protect(addr, length, OS_VM_PROT_ALL); #endif - current_auto_gc_trigger = NULL; - } + current_auto_gc_trigger = NULL; }