Changeset: 46769301f09c for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=46769301f09c
Modified Files:
monetdb5/mal/mal_debugger.c
monetdb5/mal/mal_debugger.h
monetdb5/modules/kernel/bat5.c
Branch: mbedded
Log Message:
moved BATinfo into the m5 layer, then used (also) in bat5.
diffs (truncated from 597 to 300 lines):
diff --git a/monetdb5/mal/mal_debugger.c b/monetdb5/mal/mal_debugger.c
--- a/monetdb5/mal/mal_debugger.c
+++ b/monetdb5/mal/mal_debugger.c
@@ -14,7 +14,6 @@
#include "mal.h"
#include "mal_debugger.h"
#include "mal_interpreter.h" /* for getArgReference() */
-#include "mal_linker.h" /* for getAddress() */
#include "mal_listing.h"
#include "mal_function.h"
#include "mal_parser.h"
@@ -209,31 +208,246 @@ mdbDump(Client cntxt, MalBlkPtr mb, MalS
printStack(cntxt->fdout, mb, stk);
}
+static inline char *
+pre(const char *s1, const char *s2, char *buf)
+{
+ snprintf(buf, 64, "%s%s", s1, s2);
+ return buf;
+}
+
+static inline char *
+local_itoa(ssize_t i, char *buf)
+{
+ snprintf(buf, 32, "%zd", i);
+ return buf;
+}
+static char *
+local_utoa(size_t i, char *buf)
+{
+ snprintf(buf, 32, "%zu", i);
+ return buf;
+}
+
+static inline char *
+oidtostr(oid i, char *p, size_t len)
+{
+ if (OIDtoStr(&p, &len, &i, false) < 0)
+ return NULL;
+ return p;
+}
+
+static gdk_return
+infoHeap(BAT *bk, BAT*bv, Heap *hp, str nme)
+{
+ char buf[1024], *p = buf;
+
+ if (!hp)
+ return GDK_SUCCEED;
+ while (*nme)
+ *p++ = *nme++;
+ strcpy(p, "free");
+ if (BUNappend(bk, buf, false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(hp->free, buf), false) != GDK_SUCCEED)
+ return GDK_FAIL;
+ strcpy(p, "size");
+ if (BUNappend(bk, buf, false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(hp->size, buf), false) != GDK_SUCCEED)
+ return GDK_FAIL;
+ strcpy(p, "storage");
+ if (BUNappend(bk, buf, false) != GDK_SUCCEED ||
+ BUNappend(bv, (hp->base == NULL || hp->base == (char*)1) ?
"absent" : (hp->storage == STORE_MMAP) ? (hp->filename[0] ? "memory mapped" :
"anonymous vm") : (hp->storage == STORE_PRIV) ? "private map" : "malloced",
false) != GDK_SUCCEED)
+ return GDK_FAIL;
+ strcpy(p, "newstorage");
+ if (BUNappend(bk, buf, false) != GDK_SUCCEED ||
+ BUNappend(bv, (hp->newstorage == STORE_MEM) ? "malloced" :
(hp->newstorage == STORE_PRIV) ? "private map" : "memory mapped", false) !=
GDK_SUCCEED)
+ return GDK_FAIL;
+ strcpy(p, "filename");
+ if (BUNappend(bk, buf, false) != GDK_SUCCEED ||
+ BUNappend(bv, hp->filename[0] ? hp->filename : "no file",
false) != GDK_SUCCEED)
+ return GDK_FAIL;
+ return GDK_SUCCEED;
+}
+
+#define COLLISION (8 * sizeof(size_t))
+
+static gdk_return
+HASHinfo(BAT *bk, BAT *bv, Hash *h, str s)
+{
+ BUN i;
+ BUN j;
+ BUN k;
+ BUN cnt[COLLISION + 1];
+ char buf[32];
+ char prebuf[64];
+
+ if (BUNappend(bk, pre(s, "type", prebuf), false) != GDK_SUCCEED ||
+ BUNappend(bv, ATOMname(h->type),false) != GDK_SUCCEED ||
+ BUNappend(bk, pre(s, "mask", prebuf), false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(h->nbucket, buf),false) != GDK_SUCCEED)
+ return GDK_FAIL;
+
+ for (i = 0; i < COLLISION + 1; i++) {
+ cnt[i] = 0;
+ }
+ for (i = 0; i < h->nbucket; i++) {
+ j = HASHlist(h, i);
+ for (k = 0; j; k++)
+ j >>= 1;
+ cnt[k]++;
+ }
+
+ for (i = 0; i < COLLISION + 1; i++)
+ if (cnt[i]) {
+ if (BUNappend(bk, pre(s,
local_utoa(i?(((size_t)1)<<(i-1)):0, buf), prebuf), false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa((size_t) cnt[i], buf),
false) != GDK_SUCCEED)
+ return GDK_FAIL;
+ }
+ return GDK_SUCCEED;
+}
+
+str
+BATinfo(BAT **key, BAT **val, const bat bid)
+{
+ const char *mode, *accessmode;
+ BAT *bk = NULL, *bv= NULL, *b;
+ char bf[oidStrlen];
+ char buf[32];
+
+ if ((b = BATdescriptor(bid)) == NULL) {
+ throw(MAL, "BATinfo", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
+ }
+
+ bk = COLnew(0, TYPE_str, 128, TRANSIENT);
+ bv = COLnew(0, TYPE_str, 128, TRANSIENT);
+ if (bk == NULL || bv == NULL) {
+ BBPreclaim(bk);
+ BBPreclaim(bv);
+ BBPunfix(b->batCacheid);
+ throw(MAL, "bat.getInfo", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ }
+
+ if (b->batTransient) {
+ mode = "transient";
+ } else {
+ mode = "persistent";
+ }
+
+ switch (b->batRestricted) {
+ case BAT_READ:
+ accessmode = "read-only";
+ break;
+ case BAT_WRITE:
+ accessmode = "updatable";
+ break;
+ case BAT_APPEND:
+ accessmode = "append-only";
+ break;
+ default:
+ accessmode = "unknown";
+ }
+
+ if (BUNappend(bk, "batId", false) != GDK_SUCCEED ||
+ BUNappend(bv, BATgetId(b), false) != GDK_SUCCEED ||
+ BUNappend(bk, "batCacheid", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) b->batCacheid, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "tparentid", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) b->theap.parentid, buf), false)
!= GDK_SUCCEED ||
+ BUNappend(bk, "batSharecnt", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) b->batSharecnt, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "batCount", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa((size_t) b->batCount, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "batCapacity", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa((size_t) b->batCapacity, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "head", false) != GDK_SUCCEED ||
+ BUNappend(bv, ATOMname(TYPE_void), false) != GDK_SUCCEED ||
+ BUNappend(bk, "tail", false) != GDK_SUCCEED ||
+ BUNappend(bv, ATOMname(b->ttype), false) != GDK_SUCCEED ||
+ BUNappend(bk, "batPersistence", false) != GDK_SUCCEED ||
+ BUNappend(bv, mode, false) != GDK_SUCCEED ||
+ BUNappend(bk, "batRestricted", false) != GDK_SUCCEED ||
+ BUNappend(bv, accessmode, false) != GDK_SUCCEED ||
+ BUNappend(bk, "batRefcnt", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) BBP_refs(b->batCacheid), buf),
false) != GDK_SUCCEED ||
+ BUNappend(bk, "batLRefcnt", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) BBP_lrefs(b->batCacheid), buf),
false) != GDK_SUCCEED ||
+ BUNappend(bk, "batDirty", false) != GDK_SUCCEED ||
+ BUNappend(bv, BATdirty(b) ? "dirty" : "clean", false) !=
GDK_SUCCEED ||
+
+ BUNappend(bk, "hseqbase", false) != GDK_SUCCEED ||
+ BUNappend(bv, oidtostr(b->hseqbase, bf, sizeof(bf)), FALSE) !=
GDK_SUCCEED ||
+
+ BUNappend(bk, "tident", false) != GDK_SUCCEED ||
+ BUNappend(bv, b->tident, false) != GDK_SUCCEED ||
+ BUNappend(bk, "tdense", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) BATtdense(b), buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "tseqbase", false) != GDK_SUCCEED ||
+ BUNappend(bv, oidtostr(b->tseqbase, bf, sizeof(bf)), FALSE) !=
GDK_SUCCEED ||
+ BUNappend(bk, "tsorted", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) BATtordered(b), buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "trevsorted", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) BATtrevordered(b), buf), false)
!= GDK_SUCCEED ||
+ BUNappend(bk, "tkey", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) b->tkey, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "tvarsized", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) b->tvarsized, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "tnosorted", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->tnosorted, buf), false) != GDK_SUCCEED
||
+ BUNappend(bk, "tnorevsorted", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->tnorevsorted, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "tnokey[0]", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->tnokey[0], buf), false) != GDK_SUCCEED
||
+ BUNappend(bk, "tnokey[1]", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->tnokey[1], buf), false) != GDK_SUCCEED
||
+ BUNappend(bk, "tnonil", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->tnonil, buf), false) != GDK_SUCCEED ||
+ BUNappend(bk, "tnil", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->tnil, buf), false) != GDK_SUCCEED ||
+
+ BUNappend(bk, "batInserted", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->batInserted, buf), false) !=
GDK_SUCCEED ||
+ BUNappend(bk, "ttop", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_utoa(b->theap.free, buf), false) != GDK_SUCCEED
||
+ BUNappend(bk, "batCopiedtodisk", false) != GDK_SUCCEED ||
+ BUNappend(bv, local_itoa((ssize_t) b->batCopiedtodisk, buf), false)
!= GDK_SUCCEED ||
+ BUNappend(bk, "batDirtydesc", false) != GDK_SUCCEED ||
+ BUNappend(bv, b->batDirtydesc ? "dirty" : "clean", false) !=
GDK_SUCCEED ||
+
+ BUNappend(bk, "theap.dirty", false) != GDK_SUCCEED ||
+ BUNappend(bv, b->theap.dirty ? "dirty" : "clean", false) !=
GDK_SUCCEED ||
+ infoHeap(bk, bv, &b->theap, "tail.") != GDK_SUCCEED ||
+
+ BUNappend(bk, "tvheap->dirty", false) != GDK_SUCCEED ||
+ BUNappend(bv, (b->tvheap && b->tvheap->dirty) ? "dirty" : "clean",
false) != GDK_SUCCEED ||
+ infoHeap(bk, bv, b->tvheap, "theap.") != GDK_SUCCEED ||
+
+ /* dump index information */
+ (b->thash &&
+ HASHinfo(bk, bv, b->thash, "thash->") != GDK_SUCCEED)) {
+ BBPreclaim(bk);
+ BBPreclaim(bv);
+ BBPunfix(b->batCacheid);
+ throw(MAL, "bat.getInfo", SQLSTATE(HY013) MAL_MALLOC_FAIL);
+ }
+ *key = bk;
+ *val = bv;
+ assert(BATcount(bk) == BATcount(bv));
+ BBPunfix(bid);
+ return MAL_SUCCEED;
+}
+
#ifndef NDEBUG
static void
printBatDetails(stream *f, bat bid)
{
BAT *b[2];
- bat ret,ret2;
- MALfcn fcn;
/* at this level we don't know bat kernel primitives */
mnstr_printf(f, "#Show info for %d\n", bid);
- fcn = getAddress(getName("bat"), "BKCinfo");
- if (fcn) {
- (*fcn)(&ret,&ret2, &bid);
- b[0] = BATdescriptor(ret);
- if (b[0] == NULL)
- return;
- b[1] = BATdescriptor(ret2);
- if (b[1] == NULL) {
- BBPunfix(b[0]->batCacheid);
- return;
- }
- BATprintcolumns(f, 2, b);
- BBPunfix(b[0]->batCacheid);
- BBPunfix(b[1]->batCacheid);
- }
+ if (BATinfo(&b[0],&b[1], bid) != MAL_SUCCEED)
+ return;
+ BATprintcolumns(f, 2, b);
+ BBPunfix(b[0]->batCacheid);
+ BBPunfix(b[1]->batCacheid);
}
static void
@@ -567,45 +781,26 @@ static void
printBatProperties(stream *f, VarPtr n, ValPtr v, str props)
{
if (isaBatType(n->type) && v->val.ival) {
- bat bid;
- bat ret,ret2;
- MALfcn fcn;
+ bat bid = v->val.ival;
+ BAT *b[2];
+ str res;
BUN p;
- /* at this level we don't know bat kernel primitives */
- fcn = getAddress(getName("bat"), "BKCinfo");
- if (fcn) {
- BAT *b[2];
- str res;
-
- bid = v->val.ival;
- mnstr_printf(f, "BAT %d %s= ", bid, props);
- res = (*fcn)(&ret, &ret2, &bid);
- if (res != MAL_SUCCEED) {
- GDKfree(res);
- mnstr_printf(f, "mal.info failed\n");
- return;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list