X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=bfile%2Fmfile.c;h=684d6b063ef250a050b2af653b3851c4db92ebd0;hb=eb2b742588ce07fb4516bbca22c93b938b13e433;hp=9722fe5ec09dd2bc5aa37077c5e9950bed37c508;hpb=285a986588deacac089734552a7149142f7afc7d;p=idzebra-moved-to-github.git diff --git a/bfile/mfile.c b/bfile/mfile.c index 9722fe5..684d6b0 100644 --- a/bfile/mfile.c +++ b/bfile/mfile.c @@ -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 @@ -134,6 +140,7 @@ #include #include +#include #include #include @@ -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; ino_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; }