X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fruntime%2Fgencgc.c;h=27ad418732f8b2abf4e81566e0cd974fcd467662;hb=ab5427d31da2bd95805cccc8e47b8f43d3dd606d;hp=c1fc6c85b92acfacd729273a17418a3dc97e1d60;hpb=0bce9320787ec158000514620f3b7122642861b1;p=sbcl.git diff --git a/src/runtime/gencgc.c b/src/runtime/gencgc.c index c1fc6c8..27ad418 100644 --- a/src/runtime/gencgc.c +++ b/src/runtime/gencgc.c @@ -52,9 +52,6 @@ #include "genesis/instance.h" #include "genesis/layout.h" #include "gencgc.h" -#if defined(LUTEX_WIDETAG) -#include "pthread-lutex.h" -#endif #if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) #include "genesis/cons.h" #endif @@ -314,14 +311,6 @@ struct generation { * prevent a GC when a large number of new live objects have been * added, in which case a GC could be a waste of time */ double minimum_age_before_gc; - - /* A linked list of lutex structures in this generation, used for - * implementing lutex finalization. */ -#ifdef LUTEX_WIDETAG - struct lutex *lutexes; -#else - void *lutexes; -#endif }; /* an array of generation structures. There needs to be one more @@ -2037,181 +2026,6 @@ trans_unboxed_large(lispobj object) return copy_large_unboxed_object(object, length); } #endif - - -/* - * Lutexes. Using the normal finalization machinery for finalizing - * lutexes is tricky, since the finalization depends on working lutexes. - * So we track the lutexes in the GC and finalize them manually. - */ - -#if defined(LUTEX_WIDETAG) - -/* - * Start tracking LUTEX in the GC, by adding it to the linked list of - * lutexes in the nursery generation. The caller is responsible for - * locking, and GCs must be inhibited until the registration is - * complete. - */ -void -gencgc_register_lutex (struct lutex *lutex) { - int index = find_page_index(lutex); - generation_index_t gen; - struct lutex *head; - - /* This lutex is in static space, so we don't need to worry about - * finalizing it. - */ - if (index == -1) - return; - - gen = page_table[index].gen; - - gc_assert(gen >= 0); - gc_assert(gen < NUM_GENERATIONS); - - head = generations[gen].lutexes; - - lutex->gen = gen; - lutex->next = head; - lutex->prev = NULL; - if (head) - head->prev = lutex; - generations[gen].lutexes = lutex; -} - -/* - * Stop tracking LUTEX in the GC by removing it from the appropriate - * linked lists. This will only be called during GC, so no locking is - * needed. - */ -void -gencgc_unregister_lutex (struct lutex *lutex) { - if (lutex->prev) { - lutex->prev->next = lutex->next; - } else { - generations[lutex->gen].lutexes = lutex->next; - } - - if (lutex->next) { - lutex->next->prev = lutex->prev; - } - - lutex->next = NULL; - lutex->prev = NULL; - lutex->gen = -1; -} - -/* - * Mark all lutexes in generation GEN as not live. - */ -static void -unmark_lutexes (generation_index_t gen) { - struct lutex *lutex = generations[gen].lutexes; - - while (lutex) { - lutex->live = 0; - lutex = lutex->next; - } -} - -/* - * Finalize all lutexes in generation GEN that have not been marked live. - */ -static void -reap_lutexes (generation_index_t gen) { - struct lutex *lutex = generations[gen].lutexes; - - while (lutex) { - struct lutex *next = lutex->next; - if (!lutex->live) { - lutex_destroy((tagged_lutex_t) lutex); - gencgc_unregister_lutex(lutex); - } - lutex = next; - } -} - -/* - * Mark LUTEX as live. - */ -static void -mark_lutex (lispobj tagged_lutex) { - struct lutex *lutex = (struct lutex*) native_pointer(tagged_lutex); - - lutex->live = 1; -} - -/* - * Move all lutexes in generation FROM to generation TO. - */ -static void -move_lutexes (generation_index_t from, generation_index_t to) { - struct lutex *tail = generations[from].lutexes; - - /* Nothing to move */ - if (!tail) - return; - - /* Change the generation of the lutexes in FROM. */ - while (tail->next) { - tail->gen = to; - tail = tail->next; - } - tail->gen = to; - - /* Link the last lutex in the FROM list to the start of the TO list */ - tail->next = generations[to].lutexes; - - /* And vice versa */ - if (generations[to].lutexes) { - generations[to].lutexes->prev = tail; - } - - /* And update the generations structures to match this */ - generations[to].lutexes = generations[from].lutexes; - generations[from].lutexes = NULL; -} - -static long -scav_lutex(lispobj *where, lispobj object) -{ - mark_lutex((lispobj) where); - - return CEILING(sizeof(struct lutex)/sizeof(lispobj), 2); -} - -static lispobj -trans_lutex(lispobj object) -{ - struct lutex *lutex = (struct lutex *) native_pointer(object); - lispobj copied; - size_t words = CEILING(sizeof(struct lutex)/sizeof(lispobj), 2); - gc_assert(is_lisp_pointer(object)); - copied = copy_object(object, words); - - /* Update the links, since the lutex moved in memory. */ - if (lutex->next) { - lutex->next->prev = (struct lutex *) native_pointer(copied); - } - - if (lutex->prev) { - lutex->prev->next = (struct lutex *) native_pointer(copied); - } else { - generations[lutex->gen].lutexes = - (struct lutex *) native_pointer(copied); - } - - return copied; -} - -static long -size_lutex(lispobj *where) -{ - return CEILING(sizeof(struct lutex)/sizeof(lispobj), 2); -} -#endif /* LUTEX_WIDETAG */ - /* * weak pointers @@ -2293,310 +2107,6 @@ search_dynamic_space(void *pointer) (lispobj *)pointer)); } -/* Helper for valid_lisp_pointer_p and - * possibly_valid_dynamic_space_pointer. - * - * pointer is the pointer to validate, and start_addr is the address - * of the enclosing object. - */ -static int -looks_like_valid_lisp_pointer_p(lispobj *pointer, lispobj *start_addr) -{ - if (!is_lisp_pointer((lispobj)pointer)) { - return 0; - } - - /* Check that the object pointed to is consistent with the pointer - * low tag. */ - switch (lowtag_of((lispobj)pointer)) { - case FUN_POINTER_LOWTAG: - /* Start_addr should be the enclosing code object, or a closure - * header. */ - switch (widetag_of(*start_addr)) { - case CODE_HEADER_WIDETAG: - /* Make sure we actually point to a function in the code object, - * as opposed to a random point there. */ - if (SIMPLE_FUN_HEADER_WIDETAG==widetag_of(*(pointer-FUN_POINTER_LOWTAG))) - return 1; - else - return 0; - case CLOSURE_HEADER_WIDETAG: - case FUNCALLABLE_INSTANCE_HEADER_WIDETAG: - if ((unsigned long)pointer != - ((unsigned long)start_addr+FUN_POINTER_LOWTAG)) { - if (gencgc_verbose) { - FSHOW((stderr, - "/Wf2: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - break; - default: - if (gencgc_verbose) { - FSHOW((stderr, - "/Wf3: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - break; - case LIST_POINTER_LOWTAG: - if ((unsigned long)pointer != - ((unsigned long)start_addr+LIST_POINTER_LOWTAG)) { - if (gencgc_verbose) { - FSHOW((stderr, - "/Wl1: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - /* Is it plausible cons? */ - if ((is_lisp_pointer(start_addr[0]) || - is_lisp_immediate(start_addr[0])) && - (is_lisp_pointer(start_addr[1]) || - is_lisp_immediate(start_addr[1]))) - break; - else { - if (gencgc_verbose) { - FSHOW((stderr, - "/Wl2: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - case INSTANCE_POINTER_LOWTAG: - if ((unsigned long)pointer != - ((unsigned long)start_addr+INSTANCE_POINTER_LOWTAG)) { - if (gencgc_verbose) { - FSHOW((stderr, - "/Wi1: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - if (widetag_of(start_addr[0]) != INSTANCE_HEADER_WIDETAG) { - if (gencgc_verbose) { - FSHOW((stderr, - "/Wi2: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - break; - case OTHER_POINTER_LOWTAG: - -#if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64) - /* The all-architecture test below is good as far as it goes, - * but an LRA object is similar to a FUN-POINTER: It is - * embedded within a CODE-OBJECT pointed to by start_addr, and - * cannot be found by simply walking the heap, therefore we - * need to check for it. -- AB, 2010-Jun-04 */ - if ((widetag_of(start_addr[0]) == CODE_HEADER_WIDETAG)) { - lispobj *potential_lra = - (lispobj *)(((unsigned long)pointer) - OTHER_POINTER_LOWTAG); - if ((widetag_of(potential_lra[0]) == RETURN_PC_HEADER_WIDETAG) && - ((potential_lra - HeaderValue(potential_lra[0])) == start_addr)) { - return 1; /* It's as good as we can verify. */ - } - } -#endif - - if ((unsigned long)pointer != - ((unsigned long)start_addr+OTHER_POINTER_LOWTAG)) { - if (gencgc_verbose) { - FSHOW((stderr, - "/Wo1: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - /* Is it plausible? Not a cons. XXX should check the headers. */ - if (is_lisp_pointer(start_addr[0]) || ((start_addr[0] & 3) == 0)) { - if (gencgc_verbose) { - FSHOW((stderr, - "/Wo2: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - switch (widetag_of(start_addr[0])) { - case UNBOUND_MARKER_WIDETAG: - case NO_TLS_VALUE_MARKER_WIDETAG: - case CHARACTER_WIDETAG: -#if N_WORD_BITS == 64 - case SINGLE_FLOAT_WIDETAG: -#endif - if (gencgc_verbose) { - FSHOW((stderr, - "*Wo3: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - - /* only pointed to by function pointers? */ - case CLOSURE_HEADER_WIDETAG: - case FUNCALLABLE_INSTANCE_HEADER_WIDETAG: - if (gencgc_verbose) { - FSHOW((stderr, - "*Wo4: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - - case INSTANCE_HEADER_WIDETAG: - if (gencgc_verbose) { - FSHOW((stderr, - "*Wo5: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - - /* the valid other immediate pointer objects */ - case SIMPLE_VECTOR_WIDETAG: - case RATIO_WIDETAG: - case COMPLEX_WIDETAG: -#ifdef COMPLEX_SINGLE_FLOAT_WIDETAG - case COMPLEX_SINGLE_FLOAT_WIDETAG: -#endif -#ifdef COMPLEX_DOUBLE_FLOAT_WIDETAG - case COMPLEX_DOUBLE_FLOAT_WIDETAG: -#endif -#ifdef COMPLEX_LONG_FLOAT_WIDETAG - case COMPLEX_LONG_FLOAT_WIDETAG: -#endif - case SIMPLE_ARRAY_WIDETAG: - case COMPLEX_BASE_STRING_WIDETAG: -#ifdef COMPLEX_CHARACTER_STRING_WIDETAG - case COMPLEX_CHARACTER_STRING_WIDETAG: -#endif - case COMPLEX_VECTOR_NIL_WIDETAG: - case COMPLEX_BIT_VECTOR_WIDETAG: - case COMPLEX_VECTOR_WIDETAG: - case COMPLEX_ARRAY_WIDETAG: - case VALUE_CELL_HEADER_WIDETAG: - case SYMBOL_HEADER_WIDETAG: - case FDEFN_WIDETAG: - case CODE_HEADER_WIDETAG: - case BIGNUM_WIDETAG: -#if N_WORD_BITS != 64 - case SINGLE_FLOAT_WIDETAG: -#endif - case DOUBLE_FLOAT_WIDETAG: -#ifdef LONG_FLOAT_WIDETAG - case LONG_FLOAT_WIDETAG: -#endif - case SIMPLE_BASE_STRING_WIDETAG: -#ifdef SIMPLE_CHARACTER_STRING_WIDETAG - case SIMPLE_CHARACTER_STRING_WIDETAG: -#endif - case SIMPLE_BIT_VECTOR_WIDETAG: - case SIMPLE_ARRAY_NIL_WIDETAG: - case SIMPLE_ARRAY_UNSIGNED_BYTE_2_WIDETAG: - case SIMPLE_ARRAY_UNSIGNED_BYTE_4_WIDETAG: - case SIMPLE_ARRAY_UNSIGNED_BYTE_7_WIDETAG: - case SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG: - case SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG: - case SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG: -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG: -#endif - case SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG: - case SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG: -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_64_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_8_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG: -#endif - case SIMPLE_ARRAY_SINGLE_FLOAT_WIDETAG: - case SIMPLE_ARRAY_DOUBLE_FLOAT_WIDETAG: -#ifdef SIMPLE_ARRAY_LONG_FLOAT_WIDETAG - case SIMPLE_ARRAY_LONG_FLOAT_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG - case SIMPLE_ARRAY_COMPLEX_SINGLE_FLOAT_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG - case SIMPLE_ARRAY_COMPLEX_DOUBLE_FLOAT_WIDETAG: -#endif -#ifdef SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG - case SIMPLE_ARRAY_COMPLEX_LONG_FLOAT_WIDETAG: -#endif - case SAP_WIDETAG: - case WEAK_POINTER_WIDETAG: -#ifdef LUTEX_WIDETAG - case LUTEX_WIDETAG: -#endif - break; - - default: - if (gencgc_verbose) { - FSHOW((stderr, - "/Wo6: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - break; - default: - if (gencgc_verbose) { - FSHOW((stderr, - "*W?: %x %x %x\n", - pointer, start_addr, *start_addr)); - } - return 0; - } - - /* looks good */ - return 1; -} - -/* Used by the debugger to validate possibly bogus pointers before - * calling MAKE-LISP-OBJ on them. - * - * FIXME: We would like to make this perfect, because if the debugger - * constructs a reference to a bugs lisp object, and it ends up in a - * location scavenged by the GC all hell breaks loose. - * - * Whereas possibly_valid_dynamic_space_pointer has to be conservative - * and return true for all valid pointers, this could actually be eager - * and lie about a few pointers without bad results... but that should - * be reflected in the name. - */ -int -valid_lisp_pointer_p(lispobj *pointer) -{ - lispobj *start; - if (((start=search_dynamic_space(pointer))!=NULL) || - ((start=search_static_space(pointer))!=NULL) || - ((start=search_read_only_space(pointer))!=NULL)) - return looks_like_valid_lisp_pointer_p(pointer, start); - else - return 0; -} - #if defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64) /* Is there any possibility that pointer is a valid Lisp object @@ -2656,14 +2166,11 @@ maybe_adjust_large_object(lispobj *where) case SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG: case SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG: case SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG: -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG: -#endif + + case SIMPLE_ARRAY_UNSIGNED_FIXNUM_WIDETAG: + case SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG: case SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG: -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG: -#endif #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG case SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG: #endif @@ -2676,15 +2183,12 @@ maybe_adjust_large_object(lispobj *where) #ifdef SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG case SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG: #endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG: -#endif + + case SIMPLE_ARRAY_FIXNUM_WIDETAG: + #ifdef SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG case SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG: #endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG: -#endif #ifdef SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG case SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG: #endif @@ -3677,14 +3181,11 @@ verify_space(lispobj *start, size_t words) case SIMPLE_ARRAY_UNSIGNED_BYTE_8_WIDETAG: case SIMPLE_ARRAY_UNSIGNED_BYTE_15_WIDETAG: case SIMPLE_ARRAY_UNSIGNED_BYTE_16_WIDETAG: -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_29_WIDETAG: -#endif + + case SIMPLE_ARRAY_UNSIGNED_FIXNUM_WIDETAG: + case SIMPLE_ARRAY_UNSIGNED_BYTE_31_WIDETAG: case SIMPLE_ARRAY_UNSIGNED_BYTE_32_WIDETAG: -#ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG - case SIMPLE_ARRAY_UNSIGNED_BYTE_60_WIDETAG: -#endif #ifdef SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG case SIMPLE_ARRAY_UNSIGNED_BYTE_63_WIDETAG: #endif @@ -3697,15 +3198,12 @@ verify_space(lispobj *start, size_t words) #ifdef SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG case SIMPLE_ARRAY_SIGNED_BYTE_16_WIDETAG: #endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_30_WIDETAG: -#endif + + case SIMPLE_ARRAY_FIXNUM_WIDETAG: + #ifdef SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG case SIMPLE_ARRAY_SIGNED_BYTE_32_WIDETAG: #endif -#ifdef SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG - case SIMPLE_ARRAY_SIGNED_BYTE_61_WIDETAG: -#endif #ifdef SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG case SIMPLE_ARRAY_SIGNED_BYTE_64_WIDETAG: #endif @@ -3725,9 +3223,6 @@ verify_space(lispobj *start, size_t words) #endif case SAP_WIDETAG: case WEAK_POINTER_WIDETAG: -#ifdef LUTEX_WIDETAG - case LUTEX_WIDETAG: -#endif #ifdef NO_TLS_VALUE_MARKER_WIDETAG case NO_TLS_VALUE_MARKER_WIDETAG: #endif @@ -3986,10 +3481,6 @@ garbage_collect_generation(generation_index_t generation, int raise) /* Initialize the weak pointer list. */ weak_pointers = NULL; -#ifdef LUTEX_WIDETAG - unmark_lutexes(generation); -#endif - /* When a generation is not being raised it is transported to a * temporary generation (NUM_GENERATIONS), and lowered when * done. Set up this new generation. There should be no pages @@ -4138,7 +3629,7 @@ garbage_collect_generation(generation_index_t generation, int raise) scavenge((lispobj *) th->binding_stack_start,len); #ifdef LISP_FEATURE_SB_THREAD /* do the tls as well */ - len=fixnum_value(SymbolValue(FREE_TLS_INDEX,0)) - + len=(SymbolValue(FREE_TLS_INDEX,0) >> WORD_SHIFT) - (sizeof (struct thread))/(sizeof (lispobj)); scavenge((lispobj *) (th+1),len); #endif @@ -4259,11 +3750,6 @@ garbage_collect_generation(generation_index_t generation, int raise) else ++generations[generation].num_gc; -#ifdef LUTEX_WIDETAG - reap_lutexes(generation); - if (raise) - move_lutexes(generation, generation+1); -#endif } /* Update last_free_page, then SymbolValue(ALLOCATION_POINTER). */ @@ -4314,8 +3800,7 @@ remap_page_range (page_index_t from, page_index_t to) static void remap_free_pages (page_index_t from, page_index_t to, int forcibly) { - page_index_t first_page, last_page, - first_aligned_page, last_aligned_page; + page_index_t first_page, last_page; if (forcibly) return remap_page_range(from, to); @@ -4552,7 +4037,6 @@ gc_free_heap(void) generations[page].gc_trigger = 2000000; generations[page].num_gc = 0; generations[page].cum_sum_bytes_allocated = 0; - generations[page].lutexes = NULL; } if (gencgc_verbose > 1) @@ -4595,12 +4079,6 @@ gc_init(void) scavtab[WEAK_POINTER_WIDETAG] = scav_weak_pointer; transother[SIMPLE_ARRAY_WIDETAG] = trans_boxed_large; -#ifdef LUTEX_WIDETAG - scavtab[LUTEX_WIDETAG] = scav_lutex; - transother[LUTEX_WIDETAG] = trans_lutex; - sizetab[LUTEX_WIDETAG] = size_lutex; -#endif - heap_base = (void*)DYNAMIC_SPACE_START; /* The page structures are initialized implicitly when page_table @@ -4655,7 +4133,6 @@ gc_init(void) generations[i].bytes_consed_between_gc = 2000000; generations[i].number_of_gcs_before_promotion = 1; generations[i].minimum_age_before_gc = 0.75; - generations[i].lutexes = NULL; } /* Initialize gc_alloc. */ @@ -4704,13 +4181,6 @@ gencgc_pickup_dynamic(void) page++; } while (page_address(page) < alloc_ptr); -#ifdef LUTEX_WIDETAG - /* Lutexes have been registered in generation 0 by coreparse, and - * need to be moved to the right one manually. - */ - move_lutexes(0, PSEUDO_STATIC_GENERATION); -#endif - last_free_page = page; generations[gen].bytes_allocated = npage_bytes(page); @@ -4983,7 +4453,8 @@ prepare_for_final_gc () * SB!VM:RESTART-LISP-FUNCTION */ void gc_and_save(char *filename, boolean prepend_runtime, - boolean save_runtime_options) + boolean save_runtime_options, + boolean compressed, int compression_level) { FILE *file; void *runtime_bytes = NULL; @@ -5018,7 +4489,8 @@ gc_and_save(char *filename, boolean prepend_runtime, /* The dumper doesn't know that pages need to be zeroed before use. */ zero_all_free_pages(); save_to_filehandle(file, filename, SymbolValue(RESTART_LISP_FUNCTION,0), - prepend_runtime, save_runtime_options); + prepend_runtime, save_runtime_options, + compressed ? compression_level : COMPRESSION_LEVEL_NONE); /* Oops. Save still managed to fail. Since we've mangled the stack * beyond hope, there's not much we can do. * (beyond FUNCALLing RESTART_LISP_FUNCTION, but I suspect that's