Changeset: 5b92117fb9fb for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=5b92117fb9fb Modified Files: gdk/gdk_heap.c gdk/gdk_private.h gdk/gdk_storage.c monetdb5/modules/kernel/bat5.c sql/backends/monet5/sql.mx sql/test/Tests/systemfunctions_nogeom.stable.out Branch: default Log Message:
Merged with Feb2013 branch. diffs (truncated from 634 to 300 lines): diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c --- a/gdk/gdk_heap.c +++ b/gdk/gdk_heap.c @@ -174,43 +174,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; } @@ -418,7 +432,7 @@ DESCload(int i) int ht, tt; IODEBUG { - THRprintf(GDKstdout, "#DESCload %s\n", nme); + THRprintf(GDKstdout, "#DESCload %s\n", nme ? nme : "<noname>"); } bs = BBP_desc(i); diff --git a/monetdb5/modules/kernel/bat5.c b/monetdb5/modules/kernel/bat5.c --- a/monetdb5/modules/kernel/bat5.c +++ b/monetdb5/modules/kernel/bat5.c @@ -97,7 +97,7 @@ local_utoa(size_t i) return buf; } -#define COLLISION 64 +#define COLLISION 64 static void HASHinfo(BAT *bk, BAT *bv, Hash *h, str s) @@ -1702,7 +1702,7 @@ BKCgetStorageSize_str(lng *tot, str batn { int bid = BBPindex(batname); - if (bid == 0) + if (bid == 0) throw(MAL, "bat.getStorageSize", RUNTIME_OBJECT_MISSING); return BKCgetStorageSize(tot, &bid); } @@ -2070,18 +2070,21 @@ BKCgetSequenceBase(oid *r, int *bid) /* * Shrinking a void-headed BAT using a list of oids to ignore. */ -#define shrinkloop(Type) {\ - Type *p = (Type*)Tloc(b, BUNfirst(b));\ - Type *q = (Type*)Tloc(b, BUNlast(b));\ - Type *r = (Type*)Tloc(bn, BUNfirst(bn));\ - cnt=0;\ - for (;p<q; oidx++, p++) {\ - if ( o < ol && *o == oidx ){\ - o++;\ - } else {\ - cnt++;\ - *r++ = *p;\ - } } } +#define shrinkloop(Type) \ + do { \ + Type *p = (Type*)Tloc(b, BUNfirst(b)); \ + Type *q = (Type*)Tloc(b, BUNlast(b)); \ + Type *r = (Type*)Tloc(bn, BUNfirst(bn)); \ + cnt=0; \ + for (;p<q; oidx++, p++) { \ + if ( o < ol && *o == oidx ){ \ + o++; \ + } else { \ + cnt++; \ + *r++ = *p; \ + } \ + } \ + } while (0) str BKCshrinkBAT(int *ret, int *bid, int *did) @@ -2108,24 +2111,24 @@ BKCshrinkBAT(int *ret, int *bid, int *di throw(MAL, "bat.shrink", MAL_MALLOC_FAIL ); } bs = BATmirror(BATsort(BATmirror(d))); + BBPreleaseref(d->batCacheid); if (bs == NULL) { BBPreleaseref(b->batCacheid); - BBPreleaseref(d->batCacheid); BBPreleaseref(bn->batCacheid); throw(MAL, "bat.shrink", MAL_MALLOC_FAIL ); } - o = (oid*)Tloc(bs, BUNfirst(bs)); - ol= (oid*)Tloc(bs, BUNlast(bs)); + o = (oid*)Tloc(bs, BUNfirst(bs)); + ol= (oid*)Tloc(bs, BUNlast(bs)); switch(ATOMstorage(b->ttype) ){ - case TYPE_bte: shrinkloop(bte) break; - case TYPE_sht: shrinkloop(sht) break; - case TYPE_int: shrinkloop(int) break; - case TYPE_lng: shrinkloop(lng) break; - case TYPE_flt: shrinkloop(flt) break; - case TYPE_dbl: shrinkloop(dbl) break; - case TYPE_oid: shrinkloop(oid) break; + case TYPE_bte: shrinkloop(bte); break; + case TYPE_sht: shrinkloop(sht); break; + case TYPE_int: shrinkloop(int); break; + case TYPE_lng: shrinkloop(lng); break; + case TYPE_flt: shrinkloop(flt); break; + case TYPE_dbl: shrinkloop(dbl); break; + case TYPE_oid: shrinkloop(oid); break; default: if (ATOMvarsized(bn->ttype)) { BUN p = BUNfirst(b); @@ -2143,10 +2146,10 @@ BKCshrinkBAT(int *ret, int *bid, int *di } } else { switch( b->T->width){ - case 1:shrinkloop(bte) break; - case 2:shrinkloop(sht) break; - case 4:shrinkloop(int) break; - case 8:shrinkloop(lng) break; + case 1:shrinkloop(bte); break; + case 2:shrinkloop(sht); break; + case 4:shrinkloop(int); break; + case 8:shrinkloop(lng); break; default: throw(MAL, "bat.shrink", "Illegal argument type"); } @@ -2165,7 +2168,7 @@ BKCshrinkBAT(int *ret, int *bid, int *di if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ); BBPreleaseref(b->batCacheid); - BBPreleaseref(d->batCacheid); + BBPreleaseref(bs->batCacheid); BBPkeepref(*ret= bn->batCacheid); return MAL_SUCCEED; } @@ -2200,16 +2203,16 @@ BKCshrinkBATmap(int *ret, int *bid, int throw(MAL, "bat.shrinkMap", MAL_MALLOC_FAIL ); } bs = BATmirror(BATsort(BATmirror(d))); + BBPreleaseref(d->batCacheid); if (bs == NULL) { BBPreleaseref(b->batCacheid); - BBPreleaseref(d->batCacheid); BBPreleaseref(bn->batCacheid); throw(MAL, "bat.shrinkMap", MAL_MALLOC_FAIL ); } - o = (oid*)Tloc(bs, BUNfirst(bs)); - ol= (oid*)Tloc(bs, BUNlast(bs)); - r = (oid*)Tloc(bn, BUNfirst(bn)); + o = (oid*)Tloc(bs, BUNfirst(bs)); + ol= (oid*)Tloc(bs, BUNlast(bs)); + r = (oid*)Tloc(bn, BUNfirst(bn)); _______________________________________________ checkin-list mailing list checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list