Changeset: 4379c833cfa4 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=4379c833cfa4
Modified Files:
gdk/gdk.h
gdk/gdk_atoms.c
gdk/gdk_bat.c
gdk/gdk_heap.c
gdk/gdk_storage.c
monetdb5/mal/mal.h
monetdb5/modules/mal/mdb.mx
tools/mserver/mserver5.1
tools/mserver/mserver5.c
Branch: default
Log Message:
Add heap tracing
Re-used the EXTENDMASK as HEAPMASK to trace solely the behavior
of the heap management.
diffs (282 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2388,8 +2388,8 @@ VALptr(ValPtr v)
#define OPTMASK (1<<27)
#define OPTDEBUG if (GDKdebug & OPTMASK)
-#define EXTENDMASK (1<<28)
-#define EXTENDDEBUG if (GDKdebug & EXTENDMASK)
+#define HEAPMASK (1<<28)
+#define HEAPDEBUG if (GDKdebug & HEAPMASK)
#define FORCEMITOMASK (1<<29)
#define FORCEMITODEBUG if (GDKdebug & FORCEMITOMASK)
diff --git a/gdk/gdk_atoms.c b/gdk/gdk_atoms.c
--- a/gdk/gdk_atoms.c
+++ b/gdk/gdk_atoms.c
@@ -1203,7 +1203,7 @@ strPut(Heap *h, var_t *dst, const char *
/* if there is reserved space, first use the reserved
space */
newsize = MIN(newsize, h->maxsize);
}
- EXTENDDEBUG fprintf(stderr, "#HEAPextend in strPut %s " SZFMT "
" SZFMT "\n", h->filename, h->size, newsize);
+ HEAPDEBUG fprintf(stderr, "#HEAPextend in strPut %s " SZFMT " "
SZFMT "\n", h->filename, h->size, newsize);
if (HEAPextend(h, newsize) < 0) {
return 0;
}
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -470,12 +470,12 @@ BATextend(BAT *b, BUN newcap)
b->batCapacity = newcap;
hheap_size *= Hsize(b);
- if (b->H->heap.base && GDKdebug & EXTENDMASK)
+ if (b->H->heap.base && GDKdebug & HEAPMASK)
fprintf(stderr, "#HEAPextend in BATextend %s " SZFMT " " SZFMT
"\n", b->H->heap.filename, b->H->heap.size, hheap_size);
if (b->H->heap.base && HEAPextend(&b->H->heap, hheap_size) < 0)
return NULL;
theap_size *= Tsize(b);
- if (b->T->heap.base && GDKdebug & EXTENDMASK)
+ if (b->T->heap.base && GDKdebug & HEAPMASK)
fprintf(stderr, "#HEAPextend in BATextend %s " SZFMT " " SZFMT
"\n", b->T->heap.filename, b->T->heap.size, theap_size);
if (b->T->heap.base && HEAPextend(&b->T->heap, theap_size) < 0)
return NULL;
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -126,7 +126,7 @@ HEAPcacheAdd( void *base, size_t maxsz,
}
if (!added)
return GDKmunmap(base, maxsz);
- ALLOCDEBUG fprintf(stderr, "#HEAPcacheAdd (%s) " SZFMT " " PTRFMT " %d
%d %d\n", fn, maxsz, PTRFMTCAST base, storage, free_file, hc->used);
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPcacheAdd (%s) " SZFMT " " PTRFMT "
%d %d %d\n", fn, maxsz, PTRFMTCAST base, storage, free_file, hc->used);
return 0;
}
@@ -137,7 +137,7 @@ HEAPcacheFind( size_t *maxsz, char *fn,
*maxsz = (1 + (*maxsz >> 16)) << 16; /* round up to 64K */
if (hc && mode == STORE_MMAP && hc->used < hc->sz) {
- ALLOCDEBUG fprintf(stderr, "#HEAPcacheFind (%s)" SZFMT " %d
%d\n", fn, *maxsz, mode, hc->used);
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPcacheFind (%s)" SZFMT " %d
%d\n", fn, *maxsz, mode, hc->used);
gdk_set_lock(HEAPcacheLock, "HEAPcache_init");
if (hc->used) {
@@ -207,7 +207,7 @@ HEAPcacheFind( size_t *maxsz, char *fn,
return GDKload(fn, NULL, *maxsz, *maxsz, mode);
}
} else
- ALLOCDEBUG fprintf(stderr, "#HEAPcacheFind (%s) re-used\n", fn);
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPcacheFind (%s) re-used\n",
fn);
return base;
}
@@ -283,7 +283,7 @@ HEAPalloc(Heap *h, size_t nitems, size_t
if (h->filename == NULL || (h->size < minsize)) {
h->storage = STORE_MEM;
h->base = (char *) GDKmallocmax(h->size, &h->maxsize, 0);
- ALLOCDEBUG fprintf(stderr, "#HEAPalloc " SZFMT " " SZFMT " "
PTRFMT "%s\n", h->size, h->maxsize, PTRFMTCAST h->base, h->base && ((ssize_t*)
h->base)[-1] < 0 ? " VM" : "");
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPalloc " SZFMT " " SZFMT "
" PTRFMT "%s\n", h->size, h->maxsize, PTRFMTCAST h->base, h->base &&
((ssize_t*) h->base)[-1] < 0 ? " VM" : "");
}
if (h->filename && h->base == NULL) {
char *of = h->filename;
@@ -345,7 +345,7 @@ HEAPextend(Heap *h, size_t size)
return 0;
if (h->storage != STORE_MEM) {
- EXTENDDEBUG fprintf(stderr, "#HEAPextend: extending %s mmapped
heap\n", h->storage == STORE_MMAP ? "shared" : "privately");
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPextend: extending %s
mmapped heap\n", h->storage == STORE_MMAP ? "shared" : "privately");
/* memory mapped files extend: save and remap */
if (HEAPsave_intern(h, nme, ext, ".tmp") < 0)
return -1;
@@ -379,9 +379,8 @@ HEAPextend(Heap *h, size_t size)
if (!must_mmap) {
void *p = h->base;
h->newstorage = h->storage = STORE_MEM;
- EXTENDDEBUG fprintf(stderr, "#HEAPextend: extending
malloced heap\n");
h->base = (char *) GDKreallocmax(h->base, size,
&h->maxsize, 0);
- ALLOCDEBUG fprintf(stderr, "#HEAPextend " SZFMT " "
SZFMT " " PTRFMT " " PTRFMT "\n", size, h->maxsize, PTRFMTCAST p, PTRFMTCAST
h->base);
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPextend: extending
malloced heap " SZFMT " " SZFMT " " PTRFMT " " PTRFMT "\n", size, h->maxsize,
PTRFMTCAST p, PTRFMTCAST h->base);
if (h->base)
return 0;
}
@@ -414,7 +413,7 @@ HEAPextend(Heap *h, size_t size)
h->forcemap = 0;
}
h->base = NULL;
- EXTENDDEBUG fprintf(stderr, "#HEAPextend:
converting malloced to %s mmapped heap\n", h->newstorage == STORE_MMAP ?
"shared" : "privately");
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPextend:
converting malloced to %s mmapped heap\n", h->newstorage == STORE_MMAP ?
"shared" : "privately");
/* try to allocate a memory-mapped based heap */
if (HEAPload(h, nme, ext, FALSE) >= 0) {
MT_madvise(h->base, h->size,
MMAP_SEQUENTIAL);
@@ -561,7 +560,7 @@ HEAPfree_(Heap *h, int free_file)
{
if (h->base) {
if (h->storage == STORE_MEM) { /* plain memory */
- ALLOCDEBUG fprintf(stderr, "#HEAPfree " SZFMT " " SZFMT
" " PTRFMT "%s\n", h->size, h->maxsize, PTRFMTCAST h->base, h->base &&
((ssize_t*) h->base)[-1] < 0 ? " VM" : "");
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPfree " SZFMT " "
SZFMT " " PTRFMT "%s\n", h->size, h->maxsize, PTRFMTCAST h->base, h->base &&
((ssize_t*) h->base)[-1] < 0 ? " VM" : "");
GDKfree(h->base);
} else { /* mapped file, or STORE_PRIV */
int ret = HEAPcacheAdd(h->base, h->maxsize,
h->filename, h->storage, free_file);
@@ -570,7 +569,7 @@ HEAPfree_(Heap *h, int free_file)
GDKsyserror("HEAPfree: %s was not mapped\n",
h->filename);
assert(0);
}
- IODEBUG THRprintf(GDKstdout,
+ HEAPDEBUG mnstr_printf(GDKerr,
"#munmap(base=" PTRFMT ", size="
SZFMT ") = %d\n",
PTRFMTCAST(void *)h->base,
h->maxsize, ret);
@@ -630,7 +629,7 @@ HEAPload_intern(Heap *h, const char *nme
fp = (FILE *) GDKfilelocate(nme, "mrb+", ext);
if (fp) {
ret = ftruncate(fileno(fp), (off_t) truncsize);
- IODEBUG THRprintf(GDKstdout, "#ftruncate(file=%s.%s,
size=" SZFMT ") = %d\n", nme, ext, truncsize, ret);
+ HEAPDEBUG mnstr_printf(GDKerr, "#ftruncate(file=%s.%s,
size=" SZFMT ") = %d\n", nme, ext, truncsize, ret);
fclose(fp);
if (ret == 0) {
h->size = h->maxsize = truncsize;
@@ -639,8 +638,8 @@ HEAPload_intern(Heap *h, const char *nme
}
}
- IODEBUG {
- THRprintf(GDKstdout, "#HEAPload(%s.%s,storage=%d,free=" SZFMT
",size=" SZFMT ")\n", nme, ext, h->storage, h->free, h->size);
+ HEAPDEBUG {
+ mnstr_printf(GDKerr, "#HEAPload(%s.%s,storage=%d,free=" SZFMT
",size=" SZFMT ")\n", nme, ext, h->storage, h->free, h->size);
}
/* On some OSs (WIN32,Solaris), it is prohibited to write to a
file that is open in MAP_PRIVATE (FILE_MAP_COPY)
@@ -657,7 +656,7 @@ HEAPload_intern(Heap *h, const char *nme
if (ret == 0) {
t0 = GDKms();
ret = unlink(dstpath);
- IODEBUG THRprintf(GDKstdout, "#unlink %s = %d
(%dms)\n", dstpath, ret, GDKms() - t0);
+ HEAPDEBUG mnstr_printf(GDKerr, "#unlink %s = %d
(%dms)\n", dstpath, ret, GDKms() - t0);
}
t0 = GDKms();
ret = rename(srcpath, dstpath);
@@ -665,7 +664,7 @@ HEAPload_intern(Heap *h, const char *nme
GDKsyserror("HEAPload: rename of %s failed\n", srcpath);
return -1;
}
- IODEBUG THRprintf(GDKstdout, "#rename %s %s = %d (%dms)\n",
srcpath, dstpath, ret, GDKms() - t0);
+ HEAPDEBUG mnstr_printf(GDKerr, "#rename %s %s = %d (%dms)\n",
srcpath, dstpath, ret, GDKms() - t0);
}
h->base = (char *) GDKload(nme, ext, h->free, h->size, h->newstorage);
@@ -711,8 +710,8 @@ HEAPsave_intern(Heap *h, const char *nme
} else if (store != STORE_MEM) {
store = h->storage;
}
- IODEBUG {
- THRprintf(GDKstdout, "#HEAPsave(%s.%s,storage=%d,free=" SZFMT
",size=" SZFMT ")\n", nme, ext, h->newstorage, h->free, h->size);
+ HEAPDEBUG {
+ mnstr_printf(GDKerr, "#HEAPsave(%s.%s,storage=%d,free=" SZFMT
",size=" SZFMT ")\n", nme, ext, h->newstorage, h->free, h->size);
}
return GDKsave(nme, ext, h->base, h->free, store);
}
@@ -1021,7 +1020,7 @@ HEAP_malloc(Heap *heap, size_t nbytes)
// Double the size of the heap.
// TUNE: increase heap by diffent amount.
*/
- EXTENDDEBUG fprintf(stderr, "#HEAPextend in HEAP_malloc %s "
SZFMT " " SZFMT "\n", heap->filename, heap->size, newsize);
+ HEAPDEBUG mnstr_printf(GDKerr, "#HEAPextend in HEAP_malloc %s "
SZFMT " " SZFMT "\n", heap->filename, heap->size, newsize);
if (HEAPextend(heap, newsize) < 0)
return 0;
heap->free = newsize;
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -627,11 +627,11 @@ BATload_intern(bat i, int lock)
BUN cap = b->batCapacity;
if (cap < (b->T->heap.size >> b->T->shift)) {
cap = (BUN) (b->T->heap.size >> b->T->shift);
- EXTENDDEBUG fprintf(stderr, "#HEAPextend in
BATload_inter %s " SZFMT " " SZFMT "\n", b->H->heap.filename, b->H->heap.size,
headsize(b, cap));
+ HEAPDEBUG fprintf(stderr, "#HEAPextend in
BATload_inter %s " SZFMT " " SZFMT "\n", b->H->heap.filename, b->H->heap.size,
headsize(b, cap));
HEAPextend(&b->H->heap, headsize(b, cap));
b->batCapacity = cap;
} else {
- EXTENDDEBUG fprintf(stderr, "#HEAPextend in
BATload_intern %s " SZFMT " " SZFMT "\n", b->T->heap.filename, b->T->heap.size,
tailsize(b, cap));
+ HEAPDEBUG fprintf(stderr, "#HEAPextend in
BATload_intern %s " SZFMT " " SZFMT "\n", b->T->heap.filename, b->T->heap.size,
tailsize(b, cap));
HEAPextend(&b->T->heap, tailsize(b, cap));
}
}
diff --git a/monetdb5/mal/mal.h b/monetdb5/mal/mal.h
--- a/monetdb5/mal/mal.h
+++ b/monetdb5/mal/mal.h
@@ -71,6 +71,7 @@ mal_export int memoryclaims; /* num
#define GRPmemory (MEMMASK | ALLOCMASK )
#define GRPproperties (CHECKMASK | PROPMASK | BATMASK )
#define GRPio (IOMASK | PERFMASK )
+#define GRPheaps (HEAPMASK)
#define GRPtransactions (TMMASK | DELTAMASK | TEMMASK)
#define GRPmodules (LOADMASK)
#define GRPalgorithms (ALGOMASK | ESTIMASK)
diff --git a/monetdb5/modules/mal/mdb.mx b/monetdb5/modules/mal/mdb.mx
--- a/monetdb5/modules/mal/mdb.mx
+++ b/monetdb5/modules/mal/mdb.mx
@@ -438,6 +438,8 @@ MDBsetDebugStr(int *ret, str *flg)
GDKdebug |= GRPproperties;
if( strcmp("io",*flg)==0)
GDKdebug |= GRPio;
+ if( strcmp("heaps",*flg)==0)
+ GDKdebug |= GRPheaps;
if( strcmp("transactions",*flg)==0)
GDKdebug |= GRPtransactions;
if( strcmp("modules",*flg)==0)
diff --git a/tools/mserver/mserver5.1 b/tools/mserver/mserver5.1
--- a/tools/mserver/mserver5.1
+++ b/tools/mserver/mserver5.1
@@ -122,7 +122,7 @@ integer, which value can be (a combinati
for debugging (GDK developers, only)
134217728 = OPTMASK = trace the actions, decisions and
effects of MAL optimizers
- 268435456 = EXTENDMASK = trace/debug HEAPextend;
+ 268435456 = HEAPMASK = trace/debug HEAPextend;
used only for development & debugging
536870912 = FORCEMITOMASK = forcefully activate mitosis even on
small tables, i.e., split small tables
diff --git a/tools/mserver/mserver5.c b/tools/mserver/mserver5.c
--- a/tools/mserver/mserver5.c
+++ b/tools/mserver/mserver5.c
@@ -95,8 +95,9 @@ usage(char *prog)
fprintf(stderr,"The debug, testing & trace options:\n");
fprintf(stderr," --threads\n");
fprintf(stderr," --memory\n");
+ fprintf(stderr," --io\n");
+ fprintf(stderr," --heaps\n");
fprintf(stderr," --properties\n");
- fprintf(stderr," --io\n");
fprintf(stderr," --transactions\n");
fprintf(stderr," --modules\n");
fprintf(stderr," --algorithms\n");
@@ -231,6 +232,7 @@ main(int argc, char **av)
{"performance",0,0,0},
{"xproperties",0,0,0},
{"forcemito",0,0,0},
+ {"heaps",0,0,0},
{0, 0, 0, 0}
};
@@ -270,7 +272,7 @@ main(int argc, char **av)
for (;;) {
int option_index = 0;
- int c = getopt_long(argc, av, "c:d::t:rh?s:m:i:a:e:x",
+ int c = getopt_long(argc, av, "c:d::t:rh?s:m:i:a:e:x:h",
long_options, &option_index);
if (c == -1)
@@ -352,6 +354,10 @@ main(int argc, char **av)
grpdebug |= GRPthreads;
break;
}
+ if (strcmp(long_options[option_index].name, "heaps") ==
0) {
+ grpdebug |= GRPheaps;
+ break;
+ }
usage(prog);
/* not reached */
case 'c':
_______________________________________________
Checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list