Make storage.o state thread-local or single-threaded.
authorMatt Birkholz <puck@birchwood-abbey.net>
Sat, 20 Dec 2014 19:08:15 +0000 (12:08 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Thu, 26 Nov 2015 08:09:46 +0000 (01:09 -0700)
Make the debugging flags and buffers pthread-local.

Serialize use of the MAKE-EPHEMERON primitive with a pthread mutex.

fixed_objects and heap_reserved are modified by primitives that the
runtime system already uses in serial fashion.

src/microcode/extern.h
src/microcode/memmag.c
src/microcode/storage.c

index aeeca86c22522114e99584d74ba41141c13a91c0..15e3c013d8ed71d2c83f971321bd4eb98573d929 100644 (file)
@@ -114,12 +114,12 @@ extern void set_ulong_register (unsigned int, unsigned long);
 
    extern bool verify_heap (void);
    extern void Pop_Return_Break_Point (void);
-   extern unsigned int debug_slotno;
-   extern unsigned int debug_nslots;
-   extern unsigned int local_slotno;
-   extern unsigned int local_nslots;
-   extern unsigned int debug_circle [];
-   extern unsigned int local_circle [];
+   extern __thread unsigned int debug_slotno;
+   extern __thread unsigned int debug_nslots;
+   extern __thread unsigned int local_slotno;
+   extern __thread unsigned int local_nslots;
+   extern __thread unsigned int debug_circle [];
+   extern __thread unsigned int local_circle [];
 #else
 #  define Eval_Debug 0
 #  define Hex_Input_Debug 0
index 963565e2b03b212697abef6c436480f7e1dd8714..e63ed90756b3b149c6c2141484f37a4f383e1b13 100644 (file)
@@ -73,6 +73,10 @@ unsigned long saved_stack_size;
 #ifdef ENABLE_SMP
 int saved_processor_count;
 unsigned long saved_processor_heap_size;
+static pthread_mutex_t mutex = MUTEX_INITIALIZER;
+#  ifdef ENABLE_DEBUGGING_TOOLS
+static bool locked_p = false;
+#  endif
 #endif
 
 static gc_tospace_allocator_t allocate_tospace;
@@ -715,6 +719,7 @@ compute_extra_ephemeron_space (unsigned long n)
 void
 guarantee_extra_ephemeron_space (unsigned long n)
 {
+  LOCK();
   ephemeron_count = n;
   if (!ephemeron_array_big_enough_p (n))
     {
@@ -722,6 +727,7 @@ guarantee_extra_ephemeron_space (unsigned long n)
       assert (SHARED_HEAP_AVAILABLE_P (VECTOR_DATA + length));
       ephemeron_array = make_ephemeron_vector (length);
     }
+  UNLOCK();
 }
 \f
 static void
@@ -741,6 +747,7 @@ gc_if_needed_for_ephemeron (unsigned long table_space)
     {
       n_ephemerons_requested = 1;
       ephemeron_request_hard_p = true;
+      UNLOCK();
       Primitive_GC (EPHEMERON_SIZE);
     }
 #endif
@@ -749,6 +756,7 @@ gc_if_needed_for_ephemeron (unsigned long table_space)
 DEFINE_PRIMITIVE ("MAKE-EPHEMERON", Prim_make_ephemeron, 2, 2, 0)
 {
   PRIMITIVE_HEADER (2);
+  LOCK();
   ephemeron_count += 1;
   if (ephemeron_array_big_enough_p (ephemeron_count))
     gc_if_needed_for_ephemeron (0);
@@ -767,6 +775,7 @@ DEFINE_PRIMITIVE ("MAKE-EPHEMERON", Prim_make_ephemeron, 2, 2, 0)
     (*Free++) = SHARP_F;       /* list */
     (*Free++) = SHARP_F;       /* queue */
     assert ((Free - addr) == EPHEMERON_SIZE);
+    UNLOCK();
     PRIMITIVE_RETURN (MAKE_POINTER_OBJECT (TC_EPHEMERON, addr));
   }
 }
index b15e596d3a0ea3197b745b7dc32fbd2873bcd7df..469995ddd0259d87bc0d7ad5cfd45420f7c20954 100644 (file)
@@ -135,12 +135,12 @@ bool ephemeron_request_hard_p;
    bool Trace_On_Error = false;
    bool Bignum_Debug = false;
    bool Per_File = false;
-   unsigned int debug_slotno = 0;
-   unsigned int debug_nslots = 0;
-   unsigned int local_slotno = 0;
-   unsigned int local_nslots = 0;
-   unsigned int debug_circle [100];
-   unsigned int local_circle [100];
+   __thread unsigned int debug_slotno = 0;
+   __thread unsigned int debug_nslots = 0;
+   __thread unsigned int local_slotno = 0;
+   __thread unsigned int local_nslots = 0;
+   __thread unsigned int debug_circle [100];
+   __thread unsigned int local_circle [100];
 #endif
 
 const char * CONT_PRINT_RETURN_MESSAGE =   "SAVE_CONT, return code";