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