smp: share: fasload.o
authorMatt Birkholz <puck@birchwood-abbey.net>
Sat, 20 Dec 2014 18:55:34 +0000 (11:55 -0700)
committerMatt Birkholz <puck@birchwood-abbey.net>
Sun, 21 Dec 2014 19:19:10 +0000 (12:19 -0700)
README.txt
src/microcode/fasload.c

index 9078f8f7b43072b5121f3d205b899f6e19240f51..f1f0dbc5ac6ccc7f72080ba6ee389ab67906f622 100644 (file)
@@ -290,6 +290,12 @@ command line.  The remaining 12 belong to the 7 microcode modules and
   000000a0 b table.6366
   000001e0 b table.6400
 
+       OK.  Prim_binary_fasload only hacks the local heap, but it
+       uses gcloop, which uses non-pthread-local state.  Use of this
+       primitive is now locked up.  Prim_band_load uses smp_gc_start
+       to get exclusive access to the heap, gcloop, etc. for the
+       duration of a gc-wait.
+
   fixnum.o:
 
   floenv.o:
index d9ede4e9cd432b0273a77be6d5d92457dee81e95..58aea6cd1492a1e6e4051ab28a1ade96488e4d1b 100644 (file)
@@ -40,6 +40,19 @@ USA.
 #include "option.h"
 #include "fasl.h"
 
+#ifdef ENABLE_SMP
+static pthread_mutex_t mutex = MUTEX_INITIALIZER;
+#  ifdef ENABLE_DEBUGGING_TOOLS
+static bool locked_p = false;
+#  endif
+#endif
+
+static void
+unlock (void *null)
+{
+  UNLOCK();
+}
+
 static fasl_header_t fasl_header;
 static fasl_header_t * fh;
 static SCHEME_OBJECT * new_heap_start;
@@ -108,6 +121,8 @@ that was dumped.")
 
   canonicalize_primitive_context ();
   transaction_begin ();
+  transaction_record_action (tat_always, &unlock, NULL);
+  LOCK();
 
   init_fasl_file ((STRING_ARG (1)), false, (&handle));
   if ((FASLHDR_CONSTANT_SIZE (fh)) > 0)