Changeset: 05d87b4f6878 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=05d87b4f6878
Modified Files:
        gdk/gdk_col.c
        gdk/gdk_inspect.c
Branch: headless
Log Message:

Dealing with errors and 32-bits
The BUNappend is an example of a design flaw in the GDK.
In the exceptional case that something goes wrong a global GDKerror is left 
behind and a NULL
column descriptor is returned. Effectively the upperlayers have to catch the 
return
or face accessing a descriptor that might have been lost.
A better approach is to leave the column descriptors in a consistent state once 
assigned
and use return values only to trigger exceptions.


diffs (198 lines):

diff --git a/gdk/gdk_col.c b/gdk/gdk_col.c
--- a/gdk/gdk_col.c
+++ b/gdk/gdk_col.c
@@ -912,9 +912,19 @@
 
 /*
  * @+ BUNappend
- * The BUNappend function can be used to add a single value to void and oid
- * headed bats. The new head value will be a unique number, (max(bat)+1).
+ * The BUNappend function can be used to add a single value to a column.
+ * The upper layers should assure that we don't run out of memory space
+ * using the BUNappendCheck.
  */
+int
+BUNappendCheck(COL *b, oid incr){
+       if ( (lng)(COLlast(b)) + incr >= (lng) BUN_MAX || (lng)(b->count) == 
(lng) BUN_MAX ) {
+               GDKerror("BUNappend: column becomes too large for this 
system\n");
+               return -1;
+       }
+       return 0;
+}
+
 COL *
 BUNappend(COL *b, ptr t, bit force)
 {
@@ -930,10 +940,8 @@
        }
 
        p = COLlast(b);         /* insert at end */
-       if (p == BUN_MAX || b->count == BUN_MAX) {
-               GDKerror("BUNappend: bat too large\n");
+       if ( BUNappendCheck(b, 1) )
                return NULL;
-       }
 
        i = p;
        ALIGNapp(b, "BUNappend", force);
@@ -1069,9 +1077,6 @@
                COLsetcount(b, b->count + 1);
        }
 
-       /* first adapt the hashes; then the user-defined accelerators.
-        * REASON: some accelerator updates (qsignature) use the hashes!
-        */
        if (b->hash) {
                HASHins(b, i, t);
 
diff --git a/gdk/gdk_inspect.c b/gdk/gdk_inspect.c
--- a/gdk/gdk_inspect.c
+++ b/gdk/gdk_inspect.c
@@ -127,9 +127,12 @@
        oid k;
        oid cnt[COLLISION + 2];
 
-       BUNappend(bp, pre(s, "type"), FALSE); BUNappend(bv, 
ATOMname(h->type),FALSE);
-       BUNappend(bp, pre(s, "mask"),  FALSE); 
BUNappend(bv,local_utoa(h->mask),FALSE);
-       BUNappend(bp, pre(s, "lim"),  FALSE); 
BUNappend(bv,local_utoa(h->lim),FALSE);
+       bp = BUNappend(bp, pre(s, "type"), FALSE); 
+       bv = BUNappend(bv, ATOMname(h->type),FALSE);
+       bp = BUNappend(bp, pre(s, "mask"),  FALSE); 
+       bv = BUNappend(bv,local_utoa(h->mask),FALSE);
+       bp = BUNappend(bp, pre(s, "lim"),  FALSE);
+       bv = BUNappend(bv,local_utoa(h->lim),FALSE);
 
        for (i = 0; i <= COLLISION + 1; i++) 
                cnt[i] = 0;
@@ -149,7 +152,8 @@
 
        for (i = 0; i <= COLLISION + 1; i++)
                if (cnt[i]) 
-                       BUNappend(bp, pre(s, local_itoa((ssize_t) 
(i?(((ssize_t)1)<<(i-1)):0))), FALSE); BUNappend(bv, local_utoa((size_t) 
cnt[i]), FALSE);
+                       bp = BUNappend(bp, pre(s, local_itoa((ssize_t) 
(i?(((ssize_t)1)<<(i-1)):0))), FALSE); 
+                       bv = BUNappend(bv, local_utoa((size_t) cnt[i]), FALSE);
 }
 
 static void
@@ -162,23 +166,23 @@
        while (*nme)
                *p++ = *nme++;
        strcpy(p, "free");
-       BUNappend(bp, buf, FALSE); 
-       BUNappend(bv, local_utoa(hp->free),FALSE);
+       bp = BUNappend(bp, buf, FALSE); 
+       bv = BUNappend(bv, local_utoa(hp->free),FALSE);
        strcpy(p, "size");
-       BUNappend(bp, buf,  FALSE); 
-       BUNappend(bv,local_utoa(hp->size),FALSE);
+       bp = BUNappend(bp, buf,  FALSE); 
+       bv = BUNappend(bv,local_utoa(hp->size),FALSE);
        strcpy(p, "maxsize");
-       BUNappend(bp, buf,  FALSE); 
-       BUNappend(bv,local_utoa(hp->maxsize),FALSE);
+       bp = BUNappend(bp, buf,  FALSE); 
+       bv = BUNappend(bv,local_utoa(hp->maxsize),FALSE);
        strcpy(p, "storage");
-       BUNappend(bp, buf,  FALSE); 
-       BUNappend(bv,(hp->base == NULL || hp->base == (char*)1) ? "absent" : 
(hp->storage == STORE_MMAP) ? (hp->filename ? "memory mapped" : "anonymous vm") 
: (hp->storage & STORE_PRIV) ? "private map" : "malloced",FALSE);
+       bp = BUNappend(bp, buf,  FALSE); 
+       bv = BUNappend(bv,(hp->base == NULL || hp->base == (char*)1) ? "absent" 
: (hp->storage == STORE_MMAP) ? (hp->filename ? "memory mapped" : "anonymous 
vm") : (hp->storage & STORE_PRIV) ? "private map" : "malloced",FALSE);
        strcpy(p, "newstorage");
-       BUNappend(bp, buf,  FALSE); 
-       BUNappend(bv,(hp->newstorage == STORE_MEM) ? "malloced" : 
(hp->newstorage & STORE_PRIV) ? "private map" : "memory mapped",FALSE);
+       bp = BUNappend(bp, buf,  FALSE); 
+       bv = BUNappend(bv,(hp->newstorage == STORE_MEM) ? "malloced" : 
(hp->newstorage & STORE_PRIV) ? "private map" : "memory mapped",FALSE);
        strcpy(p, "filename");
-       BUNappend(bp, buf,  FALSE); 
-       BUNappend(bv,hp->filename ? hp->filename : "no file",FALSE);
+       (void) BUNappend(bp, buf,  FALSE); 
+       (void) BUNappend(bv,hp->filename ? hp->filename : "no file",FALSE);
 }
 
 int
@@ -224,48 +228,48 @@
                accessmode = "unknown";
        }
 
-       BUNappend(bp,"id", FALSE); BUNappend(bv, COLgetId(b),FALSE);
-       BUNappend(bp,"cacheid", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(b->cacheid)),FALSE);
-       BUNappend(bp,"parentid", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(b->heap.parentid)),FALSE);
-       BUNappend(bp,"sharecnt", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(b->sharecnt)),FALSE);
-       BUNappend(bp,"count", FALSE); BUNappend(bv, 
local_utoa((size_t)b->count),FALSE);
-       BUNappend(bp,"capacity", FALSE); BUNappend(bv, 
local_utoa((size_t)b->capacity),FALSE);
-       BUNappend(bp,"type", FALSE); BUNappend(bv, ATOMname(COLtype(b)),FALSE);
-       BUNappend(bp,"persistence", FALSE); BUNappend(bv, mode,FALSE);
-       BUNappend(bp,"restricted", FALSE); BUNappend(bv, accessmode,FALSE);
-       BUNappend(bp,"refcnt", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(CBP_refs(b->cacheid))),FALSE);
-       BUNappend(bp,"lrefcnt", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(CBP_lrefs(b->cacheid))),FALSE);
-       BUNappend(bp,"dirty", FALSE); BUNappend(bv, COLdirty(b) ? "dirty" : 
"clean",FALSE);
+       bp = BUNappend(bp,"id", FALSE);  bv = BUNappend(bv, COLgetId(b),FALSE);
+       bp = BUNappend(bp,"cacheid", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(b->cacheid)),FALSE);
+       bp = BUNappend(bp,"parentid", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(b->heap.parentid)),FALSE);
+       bp = BUNappend(bp,"sharecnt", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(b->sharecnt)),FALSE);
+       bp = BUNappend(bp,"count", FALSE);  bv = BUNappend(bv, 
local_utoa((size_t)b->count),FALSE);
+       bp = BUNappend(bp,"capacity", FALSE);  bv = BUNappend(bv, 
local_utoa((size_t)b->capacity),FALSE);
+       bp = BUNappend(bp,"type", FALSE);  bv = BUNappend(bv, 
ATOMname(COLtype(b)),FALSE);
+       bp = BUNappend(bp,"persistence", FALSE);  bv = BUNappend(bv, 
mode,FALSE);
+       bp = BUNappend(bp,"restricted", FALSE);  bv = BUNappend(bv, 
accessmode,FALSE);
+       bp = BUNappend(bp,"refcnt", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(CBP_refs(b->cacheid))),FALSE);
+       bp = BUNappend(bp,"lrefcnt", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(CBP_lrefs(b->cacheid))),FALSE);
+       bp = BUNappend(bp,"dirty", FALSE);  bv = BUNappend(bv, COLdirty(b) ? 
"dirty" : "clean",FALSE);
 
-       BUNappend(bp,"sorted", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(COLordered(b))),FALSE);
-       BUNappend(bp,"id", FALSE); BUNappend(bv, b->id,FALSE);
-       BUNappend(bp,"dense", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(COLdense(b))),FALSE);
-       BUNappend(bp,"seqbase", FALSE); BUNappend(bv, 
oidtostr(b->seqbase),FALSE);
-       BUNappend(bp,"key", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(b->key)),FALSE);
-       BUNappend(bp,"varsized", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(b->varsized)),FALSE);
-       BUNappend(bp,"align", FALSE); BUNappend(bv, local_utoa(b->align),FALSE);
-       BUNappend(bp,"nosorted", FALSE); BUNappend(bv, 
local_utoa(b->nosorted),FALSE);
-       BUNappend(bp,"nosorted_rev", FALSE); BUNappend(bv, 
local_utoa(b->nosorted_rev),FALSE);
-       BUNappend(bp,"nodense", FALSE); BUNappend(bv, 
local_utoa(b->nodense),FALSE);
-       BUNappend(bp,"nokey[0]", FALSE); BUNappend(bv, 
local_utoa(b->nokey[0]),FALSE);
-       BUNappend(bp,"nokey[1]", FALSE); BUNappend(bv, 
local_utoa(b->nokey[1]),FALSE);
-       BUNappend(bp,"nonil", FALSE); BUNappend(bv, local_utoa(b->nonil),FALSE);
-       BUNappend(bp,"nil", FALSE); BUNappend(bv, local_utoa(b->nil),FALSE);
+       bp = BUNappend(bp,"sorted", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(COLordered(b))),FALSE);
+       bp = BUNappend(bp,"id", FALSE);  bv = BUNappend(bv, b->id,FALSE);
+       bp = BUNappend(bp,"dense", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(COLdense(b))),FALSE);
+       bp = BUNappend(bp,"seqbase", FALSE);  bv = BUNappend(bv, 
oidtostr(b->seqbase),FALSE);
+       bp = BUNappend(bp,"key", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(b->key)),FALSE);
+       bp = BUNappend(bp,"varsized", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(b->varsized)),FALSE);
+       bp = BUNappend(bp,"align", FALSE);  bv = BUNappend(bv, 
local_utoa(b->align),FALSE);
+       bp = BUNappend(bp,"nosorted", FALSE);  bv = BUNappend(bv, 
local_utoa(b->nosorted),FALSE);
+       bp = BUNappend(bp,"nosorted_rev", FALSE);  bv = BUNappend(bv, 
local_utoa(b->nosorted_rev),FALSE);
+       bp = BUNappend(bp,"nodense", FALSE);  bv = BUNappend(bv, 
local_utoa(b->nodense),FALSE);
+       bp = BUNappend(bp,"nokey[0]", FALSE);  bv = BUNappend(bv, 
local_utoa(b->nokey[0]),FALSE);
+       bp = BUNappend(bp,"nokey[1]", FALSE);  bv = BUNappend(bv, 
local_utoa(b->nokey[1]),FALSE);
+       bp = BUNappend(bp,"nonil", FALSE);  bv = BUNappend(bv, 
local_utoa(b->nonil),FALSE);
+       bp = BUNappend(bp,"nil", FALSE);  bv = BUNappend(bv, 
local_utoa(b->nil),FALSE);
 
-       BUNappend(bp,"inserted", FALSE); BUNappend(bv, 
local_utoa(b->inserted),FALSE);
-       BUNappend(bp,"deleted", FALSE); BUNappend(bv, 
local_utoa(b->deleted),FALSE);
-       BUNappend(bp,"first", FALSE); BUNappend(bv, local_utoa(b->first),FALSE);
-       BUNappend(bp,"top", FALSE); BUNappend(bv, 
local_utoa(b->heap.free),FALSE);
-       BUNappend(bp,"stamp", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(b->stamp)),FALSE);
-       BUNappend(bp,"lastUsed", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(CBP_lastused(b->cacheid))),FALSE);
-       BUNappend(bp,"curStamp", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(CBPcurstamp())),FALSE);
-       BUNappend(bp,"copiedtodisk", FALSE); BUNappend(bv, 
local_itoa((ssize_t)(b->copiedtodisk)),FALSE);
-       BUNappend(bp,"dirtydesc", FALSE); BUNappend(bv, b->dirty ? "dirty" : 
"clean",FALSE);
+       bp = BUNappend(bp,"inserted", FALSE);  bv = BUNappend(bv, 
local_utoa(b->inserted),FALSE);
+       bp = BUNappend(bp,"deleted", FALSE);  bv = BUNappend(bv, 
local_utoa(b->deleted),FALSE);
+       bp = BUNappend(bp,"first", FALSE);  bv = BUNappend(bv, 
local_utoa(b->first),FALSE);
+       bp = BUNappend(bp,"top", FALSE);  bv = BUNappend(bv, 
local_utoa(b->heap.free),FALSE);
+       bp = BUNappend(bp,"stamp", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(b->stamp)),FALSE);
+       bp = BUNappend(bp,"lastUsed", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(CBP_lastused(b->cacheid))),FALSE);
+       bp = BUNappend(bp,"curStamp", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(CBPcurstamp())),FALSE);
+       bp = BUNappend(bp,"copiedtodisk", FALSE);  bv = BUNappend(bv, 
local_itoa((ssize_t)(b->copiedtodisk)),FALSE);
+       bp = BUNappend(bp,"dirtydesc", FALSE);  bv = BUNappend(bv, b->dirty ? 
"dirty" : "clean",FALSE);
 
-       BUNappend(bp, "heap.dirty",  FALSE); BUNappend(bv, b->heap.dirty ? 
"dirty" : "clean",FALSE);
+       bp = BUNappend(bp, "heap.dirty",  FALSE);  bv = BUNappend(bv, 
b->heap.dirty ? "dirty" : "clean",FALSE);
        infoHeap(bp,bv, &b->heap, "head.");
 
-       BUNappend(bp, "vheap->dirty",  FALSE); BUNappend(bv, (b->vheap && 
b->vheap->dirty) ? "dirty" : "clean",FALSE);
+       bp = BUNappend(bp, "vheap->dirty",  FALSE); bv = BUNappend(bv, 
(b->vheap && b->vheap->dirty) ? "dirty" : "clean",FALSE);
        infoHeap(bp,bv, b->vheap, "hheap.");
 
        /* dump index information */
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to