X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fsave.c;h=ec630d58bc0d283c3a7ba3b559863094aa7b79bc;hb=0b96758f3645dff3e681d82cc97ddab1faae27ac;hp=da7334949a7179b748c650b58e9e653fd5ca0278;hpb=cd2c70c8b5d4dcc62b968f5a9bedd3c9c8698e82;p=sbcl.git diff --git a/src/runtime/save.c b/src/runtime/save.c index da73349..ec630d5 100644 --- a/src/runtime/save.c +++ b/src/runtime/save.c @@ -11,12 +11,13 @@ #include #include +#include #include #include +#include "sbcl.h" #include "runtime.h" #include "os.h" -#include "sbcl.h" #include "core.h" #include "globals.h" #include "save.h" @@ -24,6 +25,10 @@ #include "lispregs.h" #include "validate.h" #include "gc-internal.h" +#include "thread.h" + +#include "genesis/static-symbols.h" +#include "genesis/symbol.h" static long write_bytes(FILE *file, char *addr, long bytes) @@ -80,6 +85,7 @@ boolean save(char *filename, lispobj init_function) { FILE *file; + struct thread *th; /* Open the output file. We don't actually need the file yet, but * the fopen() might fail for some reason, and we want to detect @@ -96,9 +102,11 @@ save(char *filename, lispobj init_function) * being SAVE-LISP-AND-DIE instead of SAVE-LISP-AND-GO-ON). */ printf("[undoing binding stack and other enclosing state... "); fflush(stdout); - unbind_to_here((lispobj *)BINDING_STACK_START); - SetSymbolValue(CURRENT_CATCH_BLOCK, 0); - SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0); + for_each_thread(th) { /* XXX really? */ + unbind_to_here((lispobj *)th->binding_stack_start,th); + SetSymbolValue(CURRENT_CATCH_BLOCK, 0,th); + SetSymbolValue(CURRENT_UNWIND_PROTECT_BLOCK, 0,th); + } printf("done]\n"); fflush(stdout); @@ -132,11 +140,11 @@ save(char *filename, lispobj init_function) output_space(file, READ_ONLY_CORE_SPACE_ID, (lispobj *)READ_ONLY_SPACE_START, - (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER)); + (lispobj *)SymbolValue(READ_ONLY_SPACE_FREE_POINTER,0)); output_space(file, STATIC_CORE_SPACE_ID, (lispobj *)STATIC_SPACE_START, - (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER)); + (lispobj *)SymbolValue(STATIC_SPACE_FREE_POINTER,0)); #ifdef reg_ALLOC output_space(file, DYNAMIC_CORE_SPACE_ID, @@ -144,23 +152,14 @@ save(char *filename, lispobj init_function) dynamic_space_free_pointer); #else #ifdef LISP_FEATURE_GENCGC - /* I don't know too much about the circumstances in which we could - * end up here. It may be that current_region_free_pointer is - * guaranteed to be relevant and we could skip these slightly - * paranoid checks. TRT would be to rid the code of - * current_region_foo completely - dan 2002.09.17 */ - if((boxed_region.free_pointer < current_region_free_pointer) && - (boxed_region.end_addr == current_region_end_addr)) - boxed_region.free_pointer = current_region_free_pointer; /* Flush the current_region, updating the tables. */ - gc_alloc_update_page_tables(0,&boxed_region); - gc_alloc_update_page_tables(1,&unboxed_region); + gc_alloc_update_all_page_tables(); update_x86_dynamic_space_free_pointer(); #endif output_space(file, DYNAMIC_CORE_SPACE_ID, (lispobj *)DYNAMIC_SPACE_START, - (lispobj *)SymbolValue(ALLOCATION_POINTER)); + (lispobj *)SymbolValue(ALLOCATION_POINTER,0)); #endif putw(INITIAL_FUN_CORE_ENTRY_TYPE_CODE, file);