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
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list