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