Changeset: 05f578529b4f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=05f578529b4f
Modified Files:
        gdk/gdk_heap.c
        gdk/gdk_private.h
        gdk/gdk_storage.c
Branch: Feb2013
Log Message:

Deduplication of code (plus the logic is simpler).


diffs (158 lines):

diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -172,43 +172,17 @@ HEAPcacheFind(size_t *maxsz, char *fn, s
                        }
                        if (e != NULL && e->maxsz < *maxsz) {
                                /* resize file ? */
-                               FILE *fp;
                                long_str fn;
 
                                GDKfilepath(fn, HCDIR, e->fn, NULL);
-
-                               if ((fp = fopen(fn, "rb+")) != NULL &&
-#ifdef _WIN64
-                                   _fseeki64(fp, (ssize_t) *maxsz - 1, 
SEEK_SET) >= 0 &&
-#else
-#ifdef HAVE_FSEEKO
-                                   fseeko(fp, (off_t) *maxsz - 1, SEEK_SET) >= 
0 &&
-#else
-                                   fseek(fp, (long) *maxsz - 1, SEEK_SET) >= 0 
&&
-#endif
-#endif
-                                   fputc('\n', fp) >= 0 &&
-                                   fflush(fp) >= 0) {
-                                       if (fclose(fp) >= 0) {
-                                               void *base = GDKload(fn, NULL, 
*maxsz, *maxsz, STORE_MMAP);
-                                               GDKmunmap(e->base, e->maxsz);
-                                               e->base = base;
-                                               e->maxsz = *maxsz;
-                                       } else {
-                                               /* extending may have
-                                                * failed since fclose
-                                                * failed */
-                                               e = NULL;
-                                       }
-                                       /* after fclose, successful or
-                                        * not, we can't call fclose
-                                        * again */
-                                       fp = NULL;
-                               }
-                               if (fp) {
-                                       /* if set, extending the file
+                               if (GDKextend(fn, *maxsz) == 0) {
+                                       void *base = GDKload(fn, NULL, *maxsz, 
*maxsz, STORE_MMAP);
+                                       GDKmunmap(e->base, e->maxsz);
+                                       e->base = base;
+                                       e->maxsz = *maxsz;
+                               } else {
+                                       /* extending may have
                                         * failed */
-                                       fclose(fp);
                                        e = NULL;
                                }
                        }
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -50,6 +50,7 @@ bat BBPinsert(BATstore *bs);
 void BBPtrim(size_t delta);
 void BBPunshare(bat b);
 void GDKclrerr(void);
+int GDKextend(const char *fn, size_t size);
 int GDKfdlocate(const char *nme, const char *mode, const char *ext);
 FILE *GDKfilelocate(const char *nme, const char *mode, const char *ext);
 char *GDKload(const char *nme, const char *ext, size_t size, size_t chunk, 
storage_t mode);
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -231,6 +231,39 @@ GDKmove(const char *dir1, const char *nm
        return ret;
 }
 
+int
+GDKextend(const char *fn, size_t size)
+{
+       FILE *fp;
+       int t0 = 0;
+
+       IODEBUG t0 = GDKms();
+       if ((fp = fopen(fn, "rb+")) == NULL)
+               return -1;
+#if defined(_WIN64)
+       if (_fseeki64(fp, (ssize_t) size - 1, SEEK_SET) < 0)
+               goto bailout;
+#elif defined(HAVE_FSEEKO)
+       if (fseeko(fp, (off_t) size - 1, SEEK_SET) < 0)
+               goto bailout;
+#else
+       if (fseek(fp, size - 1, SEEK_SET) < 0)
+               goto bailout;
+#endif
+       if (fputc('\n', fp) < 0)
+               goto bailout;
+       if (fflush(fp) < 0)
+               goto bailout;
+       if (fclose(fp) < 0)
+               return -1;
+       IODEBUG fprintf(stderr, "#GDKextend %s " SZFMT " %dms\n", fn, size, 
GDKms() - t0);
+       return 0;
+  bailout:
+       fclose(fp);
+       IODEBUG fprintf(stderr, "#GDKextend %s failed " SZFMT " %dms\n", fn, 
size, GDKms() - t0);
+       return -1;
+}
+
 /*
  * @+ Save and load.
  * The BAT is saved on disk in several files. The extension DESC
@@ -354,41 +387,22 @@ GDKload(const char *nme, const char *ext
        } else {
                char path[PATHLENGTH];
                struct stat st;
-               FILE *fp = NULL;
 
                GDKfilepath(path, BATDIR, nme, ext);
                if (stat(path, &st) >= 0 &&
                    (maxsize < (size_t) st.st_size ||
                     /* mmap storage is auto-extended here */
-                    ((fp = fopen(path, "rb+")) != NULL &&
-#ifdef _WIN64
-                     _fseeki64(fp, (ssize_t) maxsize-1, SEEK_SET) >= 0 &&
-#else
-#ifdef HAVE_FSEEKO
-                     fseeko(fp, (off_t) maxsize-1, SEEK_SET) >= 0 &&
-#else
-                     fseek(fp, (long) maxsize-1, SEEK_SET) >= 0 &&
-#endif
-#endif
-                     fputc('\n', fp) >= 0 &&
-                     fflush(fp) >= 0))) {
-                       if (fp == NULL || fclose(fp) >= 0) {
-                               int mod = MMAP_READ | MMAP_WRITE | 
MMAP_SEQUENTIAL | MMAP_SYNC;
+                    GDKextend(path, maxsize) == 0)) {
+                       int mod = MMAP_READ | MMAP_WRITE | MMAP_SEQUENTIAL | 
MMAP_SYNC;
 
-                               if (mode == STORE_PRIV)
-                                       mod |= MMAP_COPY;
-                               ret = (char *) GDKmmap(path, mod, maxsize);
-                               if (ret == (char *) -1L) {
-                                       ret = NULL;
-                               }
-                               IODEBUG THRprintf(GDKstdout, "#mmap(NULL, 0, 
maxsize " SZFMT ", mod %d, path %s, 0) = " PTRFMT "\n", maxsize, mod, path, 
PTRFMTCAST(void *)ret);
+                       if (mode == STORE_PRIV)
+                               mod |= MMAP_COPY;
+                       ret = (char *) GDKmmap(path, mod, maxsize);
+                       if (ret == (char *) -1L) {
+                               ret = NULL;
                        }
-                       /* after fclose, successful or not, the file
-                        * is done with */
-                       fp = NULL;
+                       IODEBUG THRprintf(GDKstdout, "#mmap(NULL, 0, maxsize " 
SZFMT ", mod %d, path %s, 0) = " PTRFMT "\n", maxsize, mod, path, 
PTRFMTCAST(void *)ret);
                }
-               if (fp != NULL)
-                       fclose(fp);
        }
        return ret;
 }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to