Changeset: 7b053a18ef98 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7b053a18ef98 Modified Files: gdk/gdk_heap.mx Branch: default Log Message:
added debug output (on ALLOCDEBUG) optimize which heap is reused (ie equal or larger (but smallest possible)). diffs (126 lines): diff --git a/gdk/gdk_heap.mx b/gdk/gdk_heap.mx --- a/gdk/gdk_heap.mx +++ b/gdk/gdk_heap.mx @@ -82,6 +82,8 @@ HEAPcacheInit(void) { if (!hc) { + int i; + MT_lock_init(&HEAPcacheLock, "HEAPcache_init"); gdk_set_lock(HEAPcacheLock, "HEAPcache_init"); hc = (heap_cache*)GDKmalloc(sizeof(heap_cache)); @@ -89,6 +91,13 @@ hc->sz = HEAP_CACHE_SIZE; hc->hc = (heap_cache_e*)GDKmalloc(sizeof(heap_cache_e)*hc->sz); GDKcreatedir(HCDIR DIR_SEP_STR); + /* clean old leftovers */ + for(i=0;i<HEAP_CACHE_SIZE;i++){ + char fn[PATHLENGTH]; + + snprintf(fn, PATHLENGTH, "%d", i); + GDKunlink(HCDIR, fn, NULL); + } gdk_unset_lock(HEAPcacheLock, "HEAPcache_init"); } } @@ -98,7 +107,9 @@ { int added = 0; - if (free_file && fn && storage == STORE_MMAP && hc->used < hc->sz) { + + ALLOCDEBUG fprintf(stderr, "#HEAPcacheAdd (%s)" SZFMT " " PTRFMT "%d %d %d\n", fn, maxsz, PTRFMTCAST base, storage, free_file, hc->used); + if (hc && free_file && fn && storage == STORE_MMAP && hc->used < hc->sz) { gdk_set_lock(HEAPcacheLock, "HEAPcache_init"); if (hc->used < hc->sz) { heap_cache_e *e = hc->hc+hc->used; @@ -113,7 +124,7 @@ } gdk_unset_lock(HEAPcacheLock, "HEAPcache_init"); } - if (!added) + if (!added) return GDKmunmap(base, maxsz); return 0; } @@ -123,24 +134,31 @@ { void *base = NULL; + ALLOCDEBUG fprintf(stderr, "#HEAPcacheAdd (%s)" SZFMT " %d %d\n", fn, *maxsz, mode, hc->used); *maxsz = (1 + (*maxsz >> 16)) << 16; /* round up to 64K */ - if (mode == STORE_MMAP && hc->used < hc->sz) { + if (hc && mode == STORE_MMAP && hc->used < hc->sz) { gdk_set_lock(HEAPcacheLock, "HEAPcache_init"); if (hc->used) { - /* Simply use first and extend - * - * if (hc->hc[0].maxsz < *maxsz) { - * only on linux we could use mremap. - * instead we do mmap before munmap. - * res = MT_mmap_remap(hdl, *maxsz - hc->hc[0].maxsz, hc->hc[0].maxsz) - */ - if (hc->hc[0].maxsz < *maxsz) { + int i; + heap_cache_e *e = NULL; + + /* find best match */ + for(i=0;i<hc->used;i++) { + if (hc->hc[i].maxsz >= *maxsz) { + if (!e || hc->hc[i].maxsz < e->maxsz) + e = hc->hc+i; + } + } + if (!e) + e = hc->hc; + i = e - hc->hc; + if (e->maxsz < *maxsz) { /* resize file ? */ FILE *fp; long_str fn; int mod = MMAP_READ | MMAP_WRITE | MMAP_SEQUENTIAL | MMAP_SYNC; - GDKfilepath(fn, HCDIR, hc->hc[0].fn, NULL); + GDKfilepath(fn, HCDIR, e->fn, NULL); if ((fp = fopen(fn, "rb+")) != NULL && #ifdef _WIN64 @@ -156,26 +174,26 @@ fflush(fp) >= 0 && fclose(fp) >= 0) { void *base = GDKload(fn, NULL, *maxsz, *maxsz, mod); - GDKmunmap(hc->hc[0].base, hc->hc[0].maxsz); - hc->hc[0].base = base; - hc->hc[0].maxsz = *maxsz; + GDKmunmap(e->base, e->maxsz); + e->base = base; + e->maxsz = *maxsz; } } - base = hc->hc[0].base; - *maxsz = hc->hc[0].maxsz; - if (GDKmove(HCDIR, hc->hc[0].fn, NULL, BATDIR, fn, NULL)<0) { + base = e->base; + *maxsz = e->maxsz; + if (GDKmove(HCDIR, e->fn, NULL, BATDIR, fn, NULL)<0) { /* try to create the directory, if that was the problem */ char path[PATHLENGTH]; GDKfilepath(path, BATDIR, fn, NULL); GDKcreatedir(path); - GDKmove(HCDIR, hc->hc[0].fn, NULL, BATDIR, fn, NULL); + GDKmove(HCDIR, e->fn, NULL, BATDIR, fn, NULL); } hc->used--; - if (hc->used) { - hc->hc[0].base = hc->hc[hc->used].base; - hc->hc[0].maxsz = hc->hc[hc->used].maxsz; - GDKmove(HCDIR, hc->hc[hc->used].fn, NULL, HCDIR, hc->hc[0].fn, NULL); + if (i < hc->used) { + e->base = hc->hc[hc->used].base; + e->maxsz = hc->hc[hc->used].maxsz; + GDKmove(HCDIR, hc->hc[hc->used].fn, NULL, HCDIR, e->fn, NULL); } } gdk_unset_lock(HEAPcacheLock, "HEAPcache_init"); _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list