killing lutexes, adding timeouts
[sbcl.git] / src / runtime / gencgc.c
index 1dbef40..ecced08 100644 (file)
@@ -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
-
-\f
-/*
- * 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 */
-
 \f
 /*
  * weak pointers
@@ -2540,9 +2354,6 @@ looks_like_valid_lisp_pointer_p(lispobj *pointer, lispobj *start_addr)
 #endif
         case SAP_WIDETAG:
         case WEAK_POINTER_WIDETAG:
-#ifdef LUTEX_WIDETAG
-        case LUTEX_WIDETAG:
-#endif
             break;
 
         default:
@@ -3707,9 +3518,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
@@ -3968,10 +3776,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
@@ -4241,11 +4045,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). */
@@ -4533,7 +4332,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)
@@ -4576,12 +4374,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
@@ -4636,7 +4428,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. */
@@ -4685,13 +4476,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);