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

index b6ededa62f9df09202ce0d85cbe0bfbde677eec2..5690b41df0defb6ece8cb3c997c8e63f386d2f1f 100644 (file)
@@ -683,8 +683,12 @@ command line.  The remaining 12 belong to the 7 microcode modules and
   uxfile.o:
 
   uxfs.o:
-  00000000 b directory_pointers
-  00000004 b n_directory_pointers
+  00000000 b directory_pointers                locked
+  00000004 b n_directory_pointers      locked
+
+       OK.  The directory_pointers table is managed much like the
+       channel_table and is locked up in the same way.  (Just the
+       writers are required to serialize.)
 
   uxio.o:
   00000004 C OS_channel_table_size
index 2f03cfd697a2d4d96ff7922d1a5fb288e92a666e..e56a67dc260737d7989ebb2c338d06ecf90a930e 100644 (file)
@@ -24,7 +24,7 @@ USA.
 
 */
 
-#include "scheme.h"
+#include "prims.h"
 #include "ux.h"
 #include "osfs.h"
 #include "osfile.h"
@@ -122,6 +122,13 @@ USA.
 #ifndef FILE_TOUCH_OPEN_TRIES
 #  define FILE_TOUCH_OPEN_TRIES 5
 #endif
+
+#ifdef ENABLE_SMP
+static pthread_mutex_t mutex = MUTEX_INITIALIZER;
+#  ifdef ENABLE_DEBUGGING_TOOLS
+static bool locked_p = false;
+#  endif
+#endif
 \f
 #define STAT_SYSTEM_CALL(name, expression, if_failure) \
   do {                                                 \
@@ -548,6 +555,7 @@ UX_initialize_directory_reader (void)
 static unsigned int
 allocate_directory_pointer (DIR * pointer)
 {
+  LOCK ();
   if (n_directory_pointers == 0)
     {
       DIR ** pointers = ((DIR **) (UX_malloc ((sizeof (DIR *)) * 4)));
@@ -562,6 +570,7 @@ allocate_directory_pointer (DIR * pointer)
        while (scan < end)
          (*scan++) = 0;
       }
+      UNLOCK();
       return (0);
     }
   {
@@ -571,6 +580,7 @@ allocate_directory_pointer (DIR * pointer)
       if ((*scan++) == 0)
        {
          (*--scan) = pointer;
+         UNLOCK();
          return (scan - directory_pointers);
        }
   }
@@ -582,7 +592,10 @@ allocate_directory_pointer (DIR * pointer)
        (UX_realloc (((void *) directory_pointers),
                    ((sizeof (DIR *)) * n_pointers))));
     if (pointers == 0)
-      error_system_call (ENOMEM, syscall_realloc);
+      {
+       UNLOCK();
+       error_system_call (ENOMEM, syscall_realloc);
+      }
     {
       DIR ** scan = (pointers + result);
       DIR ** end = (pointers + n_pointers);
@@ -592,6 +605,7 @@ allocate_directory_pointer (DIR * pointer)
     }
     directory_pointers = pointers;
     n_directory_pointers = n_pointers;
+    UNLOCK();
     return (result);
   }
 }
@@ -643,6 +657,8 @@ OS_directory_read_matching (unsigned int index, const char * prefix)
 void
 OS_directory_close (unsigned int index)
 {
+  LOCK();
   closedir (REFERENCE_DIRECTORY (index));
   DEALLOCATE_DIRECTORY (index);
+  UNLOCK();
 }