Index: runtime.c =================================================================== --- runtime.c +++ runtime.c @@ -441,11 +441,11 @@ pending_finalizer_count, callback_returned_flag; static C_TLS WEAK_TABLE_ENTRY *weak_item_table; static C_TLS C_GC_ROOT *gc_root_list = NULL; static C_TLS FINALIZER_NODE - *finalizer_list, + finalizer_list, *finalizer_free_list, **pending_finalizer_indices; static C_TLS void *current_module_handle; static C_TLS int flonum_print_precision = FLONUM_PRINT_PRECISION; static C_TLS HDUMP_BUCKET **hdump_table; @@ -638,11 +638,11 @@ if((weak_item_table = (WEAK_TABLE_ENTRY *)C_calloc(WEAK_TABLE_SIZE, sizeof(WEAK_TABLE_ENTRY))) == NULL) return 0; } /* Initialize finalizer lists: */ - finalizer_list = NULL; + finalizer_list.next = finalizer_list.previous = &finalizer_list; finalizer_free_list = NULL; pending_finalizer_indices = (FINALIZER_NODE **)C_malloc(C_max_pending_finalizers * sizeof(FINALIZER_NODE *)); if(pending_finalizer_indices == NULL) return 0; @@ -2802,11 +2802,11 @@ if(gc_report_flag) C_dbg(C_text("GC"), C_text("%d finalized item(s) still pending\n"), j); j = fcount = 0; - for(flist = finalizer_list; flist != NULL; flist = flist->next) { + for(flist = finalizer_list.next; flist != &finalizer_list; flist = flist->next) { mark(&flist->item); mark(&flist->finalizer); ++fcount; } @@ -2820,19 +2820,19 @@ } else { j = fcount = 0; /* move into pending */ - for(flist = finalizer_list; flist != NULL; flist = flist->next) { + for(flist = finalizer_list.next; flist != &finalizer_list; flist = flist->next) { if(j < C_max_pending_finalizers) { if(!is_fptr(C_block_header(flist->item))) pending_finalizer_indices[ j++ ] = flist; } } /* mark */ - for(flist = finalizer_list; flist != NULL; flist = flist->next) { + for(flist = finalizer_list.next; flist != &finalizer_list; flist = flist->next) { mark(&flist->item); mark(&flist->finalizer); } /* mark finalizable GC roots: */ @@ -2864,14 +2864,12 @@ for(i = 0; i < pending_finalizer_count; ++i) { flist = pending_finalizer_indices[ i ]; C_set_block_item(last, 1 + i * 2, flist->item); C_set_block_item(last, 2 + i * 2, flist->finalizer); - if(flist->previous != NULL) flist->previous->next = flist->next; - else finalizer_list = flist->next; - - if(flist->next != NULL) flist->next->previous = flist->previous; + flist->previous->next = flist->next; + flist->next->previous = flist->previous; flist->next = finalizer_free_list; flist->previous = NULL; finalizer_free_list = flist; --live_finalizer_count; @@ -3232,11 +3230,11 @@ /* Mark locative table: */ for(i = 0; i < locative_table_count; ++i) remark(&locative_table[ i ]); /* Mark finalizer table: */ - for(flist = finalizer_list; flist != NULL; flist = flist->next) { + for(flist = finalizer_list.next; flist != &finalizer_list; flist = flist->next) { remark(&flist->item); remark(&flist->finalizer); } /* Mark weakly held items: */ @@ -8097,15 +8095,14 @@ else { flist = finalizer_free_list; finalizer_free_list = flist->next; } - if(finalizer_list != NULL) finalizer_list->previous = flist; - - flist->previous = NULL; - flist->next = finalizer_list; - finalizer_list = flist; + flist->next = &finalizer_list; + flist->previous = finalizer_list.previous; + finalizer_list.previous->next = flist; + finalizer_list.previous = flist; if(C_in_stackp(x)) C_mutate(&flist->item, x); else flist->item = x; if(C_in_stackp(proc)) C_mutate(&flist->finalizer, proc); @@ -8118,14 +8115,14 @@ int C_do_unregister_finalizer(C_word x) { int n; FINALIZER_NODE *flist; - for(flist = finalizer_list; flist != NULL; flist = flist->next) { + for(flist = finalizer_list.next; flist != &finalizer_list; flist = flist->next) { if(flist->item == x) { - if(flist->previous == NULL) finalizer_list = flist->next; - else flist->previous->next = flist->next; + flist->previous->next = flist->next; + flist->next->previous = flist->previous; return 1; } }