(on my 64-bit Fedora 14 desktop) this checkin seems cause several tests to fail or even crash:
testing status with changeset 42821:3967ec4a8aef: monetdb5: !ERROR: Testing FAILED SIGNIFICANTLY (4 out of 494 tests failed) 1 out of 494 tests ran into timeout 3 out of 494 tests produced SIGNIFICANTLY different output sql: !ERROR: Testing FAILED SIGNIFICANTLY (4 out of 1161 tests failed) 15 out of 1161 tests could not be executed 1 out of 1161 tests produced slightly different output 3 out of 1161 tests produced SIGNIFICANTLY different output geom: !ERROR: Testing FAILED SIGNIFICANTLY (1 out of 16 tests failed) 1 out of 16 tests resulted in a crash testing status with changeset 42825:f15583fdc322 monetdb5: !ERROR: Testing FAILED SIGNIFICANTLY (21 out of 494 tests failed) 1 out of 494 tests ran into timeout 20 out of 494 tests produced SIGNIFICANTLY different output sql: !ERROR: Testing FAILED SIGNIFICANTLY (909 out of 1161 tests failed) 248 out of 1161 tests could not be executed 6 out of 1161 tests ran into timeout 900 out of 1161 tests resulted in a crash 3 out of 1161 tests produced SIGNIFICANTLY different output geom: !ERROR: Testing FAILED SIGNIFICANTLY (16 out of 16 tests failed) 16 out of 16 tests resulted in a crash I have not yet looked into the details. Stefan On Fri, Jan 13, 2012 at 06:08:12PM +0100, Sjoerd Mullender wrote: > Changeset: f15583fdc322 for MonetDB > URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f15583fdc322 > Modified Files: > clients/Tests/exports.stable.out > gdk/gdk.mx > gdk/gdk_atoms.mx > monetdb5/mal/mal_atom.c > monetdb5/mal/mal_interpreter.mx > monetdb5/mal/mal_resolve.mx > monetdb5/modules/atoms/blob.c > monetdb5/modules/atoms/blob.mal > monetdb5/modules/mal/Tests/inspect05.stable.out > Branch: default > Log Message: > > Plug memory leak. > Variables of types other than the standard built-in types could not be > freed since the interpreter didn't know what to do. We now have a > new function pointer in BATatoms that the interpreter can use to > destroy an atom. Typically the function pointer will be NULL, but for > e.g. BLOBs it should be GDKfree. This function pointer can be set > using the new > command destroy() address XXX; > construct in MAL. > > > diffs (278 lines): > > diff --git a/clients/Tests/exports.stable.out > b/clients/Tests/exports.stable.out > --- a/clients/Tests/exports.stable.out > +++ b/clients/Tests/exports.stable.out > @@ -954,6 +954,7 @@ str BLOBblob_blob(blob **d, blob **s); > str BLOBblob_fromstr(blob **b, str *d); > void BLOBconvert(blob *b, int direction); > void BLOBdel(Heap *h, var_t *index); > +void BLOBdestroy(blob *b); > str BLOBeoln(char *src, char *end); > str BLOBfromblob(str *retval, blob **b); > str BLOBfromidx(str *retval, blob **binp, int *index); > diff --git a/gdk/gdk.mx b/gdk/gdk.mx > --- a/gdk/gdk.mx > +++ b/gdk/gdk.mx > @@ -2125,6 +2125,7 @@ typedef struct { > void (*atomConvert) (ptr v, int direction); > int (*atomFix) (ptr atom); > int (*atomUnfix) (ptr atom); > + void (*atomDestroy) (ptr atom); > > /* varsized atom-only ADT functions */ > var_t (*atomPut) (Heap *, var_t *off, ptr src); > diff --git a/gdk/gdk_atoms.mx b/gdk/gdk_atoms.mx > --- a/gdk/gdk_atoms.mx > +++ b/gdk/gdk_atoms.mx > @@ -2350,64 +2350,44 @@ atomDesc BATatoms[MAXATOMS] = { > (int (*)(ptr, ptr)) lngCmp, > (BUN (*)(ptr)) lngHash, 0, > #endif > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"bit", TYPE_chr, 1, sizeof(bit), sizeof(bit), 0, 0, (ptr) &chr_nil, > (int (*)(str, int *, ptr *)) bitFromStr, (int (*)(str *, int *, ptr)) > bitToStr, > (void *(*)(void *, stream *, size_t)) bitRead, (int (*)(void *, stream > *, size_t)) bitWrite, > (int (*)(ptr, ptr)) chrCmp, > (BUN (*)(ptr)) chrHash, 0, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"chr", TYPE_chr, 1, sizeof(chr), sizeof(chr), 0, 0, (ptr) &chr_nil, > (int (*)(str, int *, ptr *)) chrFromStr, (int (*)(str *, int *, ptr)) > chrToStr, > (void *(*)(void *, stream *, size_t)) chrRead, (int (*)(void *, stream > *, size_t)) chrWrite, > (int (*)(ptr, ptr)) chrCmp, > (BUN (*)(ptr)) chrHash, 0, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"bte", TYPE_bte, 1, sizeof(bte), sizeof(bte), 0, 0, (ptr) &bte_nil, > (int (*)(str, int *, ptr *)) bteFromStr, (int (*)(str *, int *, ptr)) > bteToStr, > (void *(*)(void *, stream *, size_t)) bteRead, (int (*)(void *, stream > *, size_t)) bteWrite, > (int (*)(ptr, ptr)) bteCmp, > (BUN (*)(ptr)) bteHash, 0, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"sht", TYPE_sht, 1, sizeof(sht), sizeof(sht), 0, 0, (ptr) &sht_nil, > (int (*)(str, int *, ptr *)) shtFromStr, (int (*)(str *, int *, ptr)) > shtToStr, > (void *(*)(void *, stream *, size_t)) shtRead, (int (*)(void *, stream > *, size_t)) shtWrite, > (int (*)(ptr, ptr)) shtCmp, > (BUN (*)(ptr)) shtHash, (void (*)(ptr, int)) shtConvert, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"BAT", TYPE_int, 1, sizeof(bat), sizeof(bat), 0, 0, (ptr) &int_nil, > (int (*)(str, int *, ptr *)) batFromStr, (int (*)(str *, int *, ptr)) > batToStr, > (void *(*)(void *, stream *, size_t)) batRead, (int (*)(void *, stream > *, size_t)) batWrite, > (int (*)(ptr, ptr)) intCmp, > (BUN (*)(ptr)) intHash, (void (*)(ptr, int)) intConvert, > (int (*)(ptr)) batFix, (int (*)(ptr)) batUnfix, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0}, > {"int", TYPE_int, 1, sizeof(int), sizeof(int), 0, 0, (ptr) &int_nil, > (int (*)(str, int *, ptr *)) intFromStr, (int (*)(str *, int *, ptr)) > intToStr, > (void *(*)(void *, stream *, size_t)) intRead, (int (*)(void *, stream > *, size_t)) intWrite, > (int (*)(ptr, ptr)) intCmp, > (BUN (*)(ptr)) intHash, (void (*)(ptr, int)) intConvert, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"oid", > #if SIZEOF_OID == SIZEOF_INT > TYPE_int, 1, sizeof(oid), sizeof(oid), 0, 0, (ptr) &int_nil, > @@ -2422,10 +2402,7 @@ atomDesc BATatoms[MAXATOMS] = { > (int (*)(ptr, ptr)) lngCmp, > (BUN (*)(ptr)) lngHash, (void (*)(ptr, int)) lngConvert, > #endif > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"wrd", > #if SIZEOF_WRD == SIZEOF_INT > TYPE_int, 1, sizeof(wrd), sizeof(wrd), 0, 0, (ptr) &int_nil, > @@ -2440,10 +2417,7 @@ atomDesc BATatoms[MAXATOMS] = { > (int (*)(ptr, ptr)) lngCmp, > (BUN (*)(ptr)) lngHash, (void (*)(ptr, int)) lngConvert, > #endif > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"ptr", > #if SIZEOF_VOID_P == SIZEOF_INT > TYPE_ptr, 1, sizeof(ptr), sizeof(ptr), 0, 0, (ptr) &ptr_nil, > @@ -2458,43 +2432,31 @@ atomDesc BATatoms[MAXATOMS] = { > (int (*)(ptr, ptr)) lngCmp, > (BUN (*)(ptr)) lngHash, (void (*)(ptr, int)) lngConvert, > #endif > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"flt", TYPE_flt, 1, sizeof(flt), sizeof(flt), 0, 0, (ptr) &flt_nil, > (int (*)(str, int *, ptr *)) fltFromStr, (int (*)(str *, int *, ptr)) > fltToStr, > (void *(*)(void *, stream *, size_t)) fltRead, (int (*)(void *, stream > *, size_t)) fltWrite, > (int (*)(ptr, ptr)) fltCmp, > (BUN (*)(ptr)) intHash, (void (*)(ptr, int)) intConvert, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"dbl", TYPE_dbl, 1, sizeof(dbl), sizeof(dbl), 0, 0, (ptr) &dbl_nil, > (int (*)(str, int *, ptr *)) dblFromStr, (int (*)(str *, int *, ptr)) > dblToStr, > (void *(*)(void *, stream *, size_t)) dblRead, (int (*)(void *, stream > *, size_t)) dblWrite, > (int (*)(ptr, ptr)) dblCmp, > (BUN (*)(ptr)) lngHash, (void (*)(ptr, int)) lngConvert, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"lng", TYPE_lng, 1, sizeof(lng), sizeof(lng), 0, 0, (ptr) &lng_nil, > (int (*)(str, int *, ptr *)) lngFromStr, (int (*)(str *, int *, ptr)) > lngToStr, > (void *(*)(void *, stream *, size_t)) lngRead, (int (*)(void *, stream > *, size_t)) lngWrite, > (int (*)(ptr, ptr)) lngCmp, > (BUN (*)(ptr)) lngHash, (void (*)(ptr, int)) lngConvert, > - 0, 0, > - 0, 0, > - 0, 0, > - 0, 0}, > + 0, 0, 0, 0, 0, 0, 0, 0, 0}, > {"str", TYPE_str, 1, sizeof(var_t), sizeof(var_t), 0, 1, (ptr) str_nil, > (int (*)(str, int *, ptr *)) strFromStr, (int (*)(str *, int *, ptr)) > strToStr, > (void *(*)(void *, stream *, size_t)) strRead, (int (*)(void *, stream > *, size_t)) strWrite, > (int (*)(ptr, ptr)) strCmp, > (BUN (*)(ptr)) strHash, 0, > - 0, 0, > + 0, 0, GDKfree, > (var_t (*)(Heap *, var_t *, ptr)) strPut, 0, > (int (*)(ptr)) strLen, strHeap, > (void (*)(Heap *, int)) 0, 0}, > diff --git a/monetdb5/mal/mal_atom.c b/monetdb5/mal/mal_atom.c > --- a/monetdb5/mal/mal_atom.c > +++ b/monetdb5/mal/mal_atom.c > @@ -118,6 +118,11 @@ int malAtomProperty(MalBlkPtr mb, InstrP > setAtomName(pci); > return 1; > } > + if (idcmp("destroy", name) == 0 && pci->argc == 1) { > + BATatoms[tpe].atomDestroy = (void (*)(void *))pci->fcn; > + setAtomName(pci); > + return 1; > + } > break; > case 'c': > if (idcmp("cmp", name) == 0 && pci->argc == 1) { > diff --git a/monetdb5/mal/mal_interpreter.mx b/monetdb5/mal/mal_interpreter.mx > --- a/monetdb5/mal/mal_interpreter.mx > +++ b/monetdb5/mal/mal_interpreter.mx > @@ -2442,9 +2442,7 @@ void garbageElement(Client cntxt, ValPtr > v->val.sval = NULL; > } > v->len = 0; > - return; > - } > - if (v->vtype == TYPE_bat) { > + } else if (v->vtype == TYPE_bat) { > /* > * @- > * All operations are responsible to properly set the > @@ -2466,6 +2464,8 @@ void garbageElement(Client cntxt, ValPtr > if (cntxt && cntxt->flags & bigfootFlag) > updateBigFoot(cntxt, bid, FALSE); > BBPdecref(bid, TRUE); > + } else if (BATatoms[v->vtype].atomDestroy) { > + (*BATatoms[v->vtype].atomDestroy)(v->val.pval); > } > } > /* > diff --git a/monetdb5/mal/mal_resolve.mx b/monetdb5/mal/mal_resolve.mx > --- a/monetdb5/mal/mal_resolve.mx > +++ b/monetdb5/mal/mal_resolve.mx > @@ -529,7 +529,8 @@ findFunctionType(Module scope, MalBlkPtr > isaBatType(@1) || > findGDKtype(@1) == TYPE_str || > (!isPolyType(@1) && @1 < TYPE_any && > - @1 >= 0 && ATOMstorage(@1) == TYPE_str)) { > + @1 >= 0 && (ATOMstorage(@1) == TYPE_str || > + BATatoms[@1].atomDestroy))) { > getInstrPtr(@3, 0)->gc |= GARBAGECONTROL; > setVarCleanup(mb, getArg(p, @2)); > p->gc |= GARBAGECONTROL; > @@ -783,7 +784,9 @@ void typeChecker(Module scope, MalBlkPtr > int tpe = getArgType(mb,p,k); > if (findGDKtype(tpe) == TYPE_bat || > findGDKtype(tpe) == TYPE_str || > - (!isPolyType(tpe) && tpe< TYPE_any && ATOMstorage(tpe) > == TYPE_str)) > + (!isPolyType(tpe) && tpe< TYPE_any && > + (ATOMstorage(tpe) == TYPE_str || > + BATatoms[tpe].atomDestroy))) > setVarCleanup(mb,getArg(p,k)); > } > } > diff --git a/monetdb5/modules/atoms/blob.c b/monetdb5/modules/atoms/blob.c > --- a/monetdb5/modules/atoms/blob.c > +++ b/monetdb5/modules/atoms/blob.c > @@ -68,6 +68,7 @@ blob_export int BLOBnitems(int *ret, blo > blob_export int BLOBget(Heap *h, int *bun, int *l, blob **val); > blob_export blob * BLOBread(blob *a, stream *s, size_t cnt); > blob_export int BLOBwrite(blob *a, stream *s, size_t cnt); > +blob_export void BLOBdestroy(blob *b); > > blob_export str BLOBblob_blob(blob **d, blob **s); > blob_export str BLOBblob_fromstr(blob **b, str *d); > @@ -741,6 +742,12 @@ BLOBheap(Heap *heap, size_t capacity) > blob_heap(heap, capacity); > } > > +void > +BLOBdestroy(blob *b) > +{ > + GDKfree(b); > +} > + > var_t > BLOBput(Heap *h, var_t *bun, blob *val) > { > diff --git a/monetdb5/modules/atoms/blob.mal b/monetdb5/modules/atoms/blob.mal > --- a/monetdb5/modules/atoms/blob.mal > +++ b/monetdb5/modules/atoms/blob.mal > @@ -31,6 +31,7 @@ command put() address BLOBput; > command del() address BLOBdel; > command length() address BLOBlength; > command heap() address BLOBheap; > +command destroy() address BLOBdestroy; > > command blob(s:blob):blob > address BLOBblob_blob > diff --git a/monetdb5/modules/mal/Tests/inspect05.stable.out > b/monetdb5/modules/mal/Tests/inspect05.stable.out > --- a/monetdb5/modules/mal/Tests/inspect05.stable.out > +++ b/monetdb5/modules/mal/Tests/inspect05.stable.out > @@ -3399,6 +3399,7 @@ end main; > [ "blob", "command", "blob", "(s:str):blob > ", > "BLOBblob_fromstr;" > ] > [ "blob", "command", "blob", > "(s:blob):blob ", > "BLOBblob_blob;" > ] > [ "#convert", "command", "blob", > "():void ", > "BLOBconvert;" > ] > +[ "#destroy", "command", "blob", > "():void ", > "BLOBdestroy;" ] > [ "#del", "command", "blob", "():void ", > > "BLOBdel;" > ] > [ "#fromstr", "command", "blob", > "():void ", > "BLOBfromstr;" > ] > [ "#heap", "command", "blob", "():void ", > > "BLOBheap;" > ] > _______________________________________________ > Checkin-list mailing list > checkin-l...@monetdb.org > http://mail.monetdb.org/mailman/listinfo/checkin-list -- | Stefan.Manegold @ CWI.nl | DB Architectures (INS1) | | http://CWI.nl/~manegold/ | Science Park 123 (L321) | | Tel.: +31 (0)20 592-4212 | 1098 XG Amsterdam (NL) | ------------------------------------------------------------------------------ RSA(R) Conference 2012 Mar 27 - Feb 2 Save $400 by Jan. 27 Register now! http://p.sf.net/sfu/rsa-sfdev2dev2 _______________________________________________ Monetdb-developers mailing list Monetdb-developers@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/monetdb-developers