osl: Introduce volatile columns that need not be freed.
[paraslash.git] / osl.c
diff --git a/osl.c b/osl.c
index 36da808..7b4f91f 100644 (file)
--- a/osl.c
+++ b/osl.c
@@ -156,54 +156,6 @@ out:
        return ret;
 }
 
-/**
- * Map a file into memory.
- *
- * \param path Name of the regular file to map.
- * \param open_mode Either \p O_RDONLY or \p O_RDWR.
- * \param obj On success, the mapping is returned here.
- *
- * \return Positive on success, negative on errors. Possible errors include: \p
- * E_FSTAT, any errors returned by para_open(), \p E_EMPTY, \p E_MMAP.
- *
- * \sa para_open(), mmap(2).
- */
-int mmap_full_file(const char *path, int open_mode, struct osl_object *obj)
-{
-       int fd, ret, mmap_prot, mmap_flags;
-       struct stat file_status;
-
-       if (open_mode == O_RDONLY) {
-               mmap_prot = PROT_READ;
-               mmap_flags = MAP_PRIVATE;
-       } else {
-               mmap_prot = PROT_READ | PROT_WRITE;
-               mmap_flags = MAP_SHARED;
-       }
-       ret = para_open(path, open_mode, 0);
-       if (ret < 0)
-               return ret;
-       fd = ret;
-       ret = -E_FSTAT;
-       if (fstat(fd, &file_status) < 0)
-               goto out;
-       obj->size = file_status.st_size;
-       ret = -E_EMPTY;
-       PARA_DEBUG_LOG("%s: size %zu\n", path, obj->size);
-       if (!obj->size)
-               goto out;
-       obj->data = mmap(NULL, obj->size, mmap_prot, mmap_flags, fd, 0);
-       if (obj->data == MAP_FAILED) {
-               obj->data = NULL;
-               ret = -E_MMAP;
-               goto out;
-       }
-       ret = 1;
-out:
-       close(fd);
-       return ret;
-}
-
 /**
  * Traverse the given directory recursively.
  *
@@ -792,7 +744,9 @@ static int map_column(struct osl_table *t, unsigned col_num)
                return ret;
        }
        ret = mmap_full_file(filename, O_RDWR,
-               &t->columns[col_num].data_map);
+               &t->columns[col_num].data_map.data,
+               &t->columns[col_num].data_map.size,
+               NULL);
        free(filename);
        return ret;
 }
@@ -821,7 +775,7 @@ int map_table(struct osl_table *t, enum map_table_flags flags)
        filename = index_filename(t->desc);
        PARA_DEBUG_LOG("mapping table '%s' (index: %s)\n", t->desc->name, filename);
        ret = mmap_full_file(filename, flags & MAP_TBL_FL_MAP_RDONLY?
-               O_RDONLY : O_RDWR, &t->index_map);
+               O_RDONLY : O_RDWR, &t->index_map.data, &t->index_map.size, NULL);
        free(filename);
        if (ret < 0)
                return ret;
@@ -1040,8 +994,14 @@ static void free_volatile_objects(const struct osl_table *t,
        for (n = rb_first(&rb_col->rbtree); n; n = rb_next(n)) {
                struct osl_row *r = get_row_pointer(n, rb_col->rbtree_num);
                if (flags & OSL_FREE_VOLATILE)
-                       for (j = 0; j < t->num_volatile_columns; j++)
-                               free(r->volatile_objects[j].data);
+                       FOR_EACH_VOLATILE_COLUMN(j, t, cd) {
+                               if (cd->storage_flags & OSL_DONT_FREE)
+                                       continue;
+                               free(r->volatile_objects[
+                                       t->columns[j].volatile_num].data);
+                       }
+//                     for (j = 0; j < t->num_volatile_columns; j++)
+//                             free(r->volatile_objects[j].data);
                free(r->volatile_objects);
        }
 }
@@ -1952,7 +1912,7 @@ int osl_open_disk_object(const struct osl_table *t, const struct osl_row *r,
        filename = disk_storage_path(t, col_num, ds_name);
        free(ds_name);
        PARA_DEBUG_LOG("filename: %s\n", filename);
-       ret = mmap_full_file(filename, O_RDONLY, obj);
+       ret = mmap_full_file(filename, O_RDONLY, &obj->data, &obj->size, NULL);
        free(filename);
        return ret;
 }