First work on threaded version.
[idzebra-moved-to-github.git] / bfile / mfile.c
index 9722fe5..684d6b0 100644 (file)
@@ -4,7 +4,13 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: mfile.c,v $
- * Revision 1.35  1999-10-14 14:33:50  adam
+ * Revision 1.37  2000-03-15 15:00:30  adam
+ * First work on threaded version.
+ *
+ * Revision 1.36  1999/12/08 15:03:11  adam
+ * Implemented bf_reset.
+ *
+ * Revision 1.35  1999/10/14 14:33:50  adam
  * Added truncation 5=106.
  *
  * Revision 1.34  1999/05/26 07:49:12  adam
 #include <assert.h>
 #include <errno.h>
 
+#include <zebra-lock.h>
 #include <zebrautl.h>
 #include <mfile.h>
 
@@ -150,7 +157,8 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad)
     for (;;)
     {
         const char *ad0 = ad;
-        int i = 0, fact = 1, multi, size = 0;
+        int i = 0, fact = 1, multi;
+       off_t size = 0;
 
         while (*ad == ' ' || *ad == '\t')
             ad++;
@@ -195,9 +203,10 @@ static int scan_areadef(MFile_area ma, const char *name, const char *ad)
             size = size*10 + (*ad++ - '0');
         switch (*ad)
        {
-           case 'B': case 'b': multi = 1; break;
-           case 'K': case 'k': multi = 1024; break;
-           case 'M': case 'm': multi = 1048576; break;
+       case 'B': case 'b': multi = 1; break;
+       case 'K': case 'k': multi = 1024; break;
+       case 'M': case 'm': multi = 1048576; break;
+       case 'G': case 'g': multi = 1073741824; break;
             case '\0':
                logf (LOG_FATAL, "Missing unit: %s", ad0);
                return -1;
@@ -378,12 +387,37 @@ void mf_destroy(MFile_area ma)
        {
            xfree (m->files[i].path);
        }
+       zebra_mutex_destroy (&meta_f->mutex);
        meta_f = meta_f->next;
        xfree (m);
     }
     xfree (ma);
 }
 
+void mf_reset(MFile_area ma)
+{
+    meta_file *meta_f;
+
+    if (!ma)
+       return;
+    meta_f = ma->mfiles;
+    while (meta_f)
+    {
+       int i;
+       meta_file *m = meta_f;
+
+       assert (!m->open);
+       for (i = 0; i<m->no_files; i++)
+       {
+           unlink (m->files[i].path);
+           xfree (m->files[i].path);
+       }
+       meta_f = meta_f->next;
+       xfree (m);
+    }
+    ma->mfiles = 0;
+}
+
 /*
  * Open a metafile.
  * If !ma, Use MF_DEFAULT_AREA.
@@ -411,8 +445,10 @@ MFile mf_open(MFile_area ma, const char *name, int block_size, int wflag)
        mnew = (meta_file *) xmalloc(sizeof(*mnew));
        strcpy(mnew->name, name);
        /* allocate one, empty file */
+       zebra_mutex_init (&mnew->mutex);
        mnew->no_files = 1;
-       mnew->files[0].bytes = mnew->files[0].blocks = 0;
+       mnew->files[0].bytes = 0;
+       mnew->files[0].blocks = 0;
        mnew->files[0].top = -1;
        mnew->files[0].number = 0;
        mnew->files[0].fd = -1;
@@ -487,6 +523,7 @@ int mf_read(MFile mf, int no, int offset, int nbytes, void *buf)
 {
     int rd, toread;
 
+    zebra_mutex_lock (&mf->mutex);
     if ((rd = file_position(mf, no, offset)) < 0)
     {
         if (rd == -2)
@@ -501,7 +538,8 @@ int mf_read(MFile mf, int no, int offset, int nbytes, void *buf)
               mf->files[mf->cur_file].path);
        exit(1);
     }
-    else if (rd < toread)
+    zebra_mutex_unlock (&mf->mutex);
+    if (rd < toread)
        return 0;
     else
        return 1;
@@ -517,6 +555,7 @@ int mf_write(MFile mf, int no, int offset, int nbytes, const void *buf)
     char tmp[FILENAME_MAX+1];
     unsigned char dummych = '\xff';
 
+    zebra_mutex_lock (&mf->mutex);
     if ((ps = file_position(mf, no, offset)) < 0)
        exit(1);
     /* file needs to grow */
@@ -593,6 +632,7 @@ int mf_write(MFile mf, int no, int offset, int nbytes, const void *buf)
                mf->name, mf->cur_file);
        exit(1);
     }
+    zebra_mutex_unlock (&mf->mutex);
     return 0;
 }