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