Changeset: 64c17c14abe1 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=64c17c14abe1 Modified Files: gdk/gdk_heap.c Branch: Feb2013 Log Message:
Check that GDKmove succeeded. Also some layout fixes.
diffs (137 lines):
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -113,17 +113,25 @@ HEAPcacheAdd(void *base, size_t maxsz, c
MT_lock_set(&HEAPcacheLock, "HEAPcache_init");
if (hc && free_file && fn && storage == STORE_MMAP && hc->used <
hc->sz) {
- if (hc->used < hc->sz) {
- heap_cache_e *e = hc->hc+hc->used;
+ heap_cache_e *e = hc->hc+hc->used;
- e->base = base;
- e->maxsz = maxsz;
- snprintf(e->fn, PATHLENGTH, "%d", hc->used);
- GDKunlink(HCDIR, e->fn, NULL);
- GDKmove(BATDIR, fn, NULL, HCDIR, e->fn, NULL);
+ e->base = base;
+ e->maxsz = maxsz;
+ snprintf(e->fn, PATHLENGTH, "%d", hc->used);
+ GDKunlink(HCDIR, e->fn, NULL);
+ added = 1;
+ if (GDKmove(BATDIR, fn, NULL, HCDIR, e->fn, NULL) < 0) {
+ /* try to create the directory, if that was
+ * the problem */
+ char path[PATHLENGTH];
+
+ GDKfilepath(path, HCDIR, e->fn, NULL);
+ GDKcreatedir(path);
+ if (GDKmove(BATDIR, fn, NULL, HCDIR, e->fn, NULL) < 0)
+ added = 0;
+ }
+ if (added)
hc->used++;
- added = 1;
- }
}
MT_lock_unset(&HEAPcacheLock, "HEAPcache_init");
if (!added)
@@ -160,54 +168,50 @@ HEAPcacheFind(size_t *maxsz, char *fn, s
cursz = e->maxsz;
}
}
- if (e != NULL) {
- if (e->maxsz < *maxsz) {
- /* resize file ? */
- FILE *fp;
- long_str fn;
+ if (e != NULL && e->maxsz < *maxsz) {
+ /* resize file ? */
+ FILE *fp;
+ long_str fn;
- GDKfilepath(fn, HCDIR, e->fn, NULL);
+ GDKfilepath(fn, HCDIR, e->fn, NULL);
- if ((fp = fopen(fn, "rb+")) != NULL &&
+ if ((fp = fopen(fn, "rb+")) != NULL &&
#ifdef _WIN64
- _fseeki64(fp, (ssize_t) *maxsz-1,
SEEK_SET) >= 0 &&
+ _fseeki64(fp, (ssize_t) *maxsz-1, SEEK_SET)
>= 0 &&
#else
#ifdef HAVE_FSEEKO
- fseeko(fp, (off_t) *maxsz-1,
SEEK_SET) >= 0 &&
+ fseeko(fp, (off_t) *maxsz-1, SEEK_SET) >= 0
&&
#else
- fseek(fp, (long) *maxsz-1,
SEEK_SET) >= 0 &&
+ fseek(fp, (long) *maxsz-1, SEEK_SET) >= 0 &&
#endif
#endif
- fputc('\n', fp) >= 0 &&
- fflush(fp) >= 0) {
- if (fclose(fp) >= 0) {
- void *base =
GDKload(fn, NULL, *maxsz, *maxsz, STORE_MMAP);
- GDKmunmap(e->base,
e->maxsz);
- e->base = base;
- e->maxsz = *maxsz;
- } else {
- /* extending
- * may have
- * failed
- * since
- * fclose
- * failed */
- e = NULL;
- }
- /* after fclose, successful or
- * not, we can't call fclose
- * again */
- fp = NULL;
- }
- if (fp) {
- /* if set, extending
- * the file failed */
- fclose(fp);
+ fputc('\n', fp) >= 0 &&
+ fflush(fp) >= 0) {
+ if (fclose(fp) >= 0) {
+ void *base = GDKload(fn, NULL,
*maxsz, *maxsz, STORE_MMAP);
+ GDKmunmap(e->base, e->maxsz);
+ e->base = base;
+ e->maxsz = *maxsz;
+ } else {
+ /* extending may have
+ * failed since fclose
+ * failed */
e = NULL;
}
+ /* after fclose, successful or
+ * not, we can't call fclose
+ * again */
+ fp = NULL;
+ }
+ if (fp) {
+ /* if set, extending the file
+ * failed */
+ fclose(fp);
+ e = NULL;
}
}
if (e != NULL) {
+ /* move cached heap to its new location */
base = e->base;
*maxsz = e->maxsz;
if (GDKmove(HCDIR, e->fn, NULL, BATDIR, fn,
NULL)<0) {
@@ -217,8 +221,11 @@ HEAPcacheFind(size_t *maxsz, char *fn, s
GDKfilepath(path, BATDIR, fn, NULL);
GDKcreatedir(path);
- GDKmove(HCDIR, e->fn, NULL, BATDIR, fn,
NULL);
+ if (GDKmove(HCDIR, e->fn, NULL, BATDIR,
fn, NULL) < 0)
+ e = NULL;
}
+ }
+ if (e != NULL) {
hc->used--;
i = (int) (e - hc->hc);
if (i < hc->used) {
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list
