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

Reply via email to