X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=osl.c;h=9843a02034fc8927bdcce36be4bc6f7959d6f88d;hp=36da808af853aa58495382c2c6fd1afe3893b5e8;hb=f9d356c65720f944550f36af6dd364d0f0869dde;hpb=c2ac39f76d245816a919d94790672fb66e9a7253 diff --git a/osl.c b/osl.c index 36da808a..9843a020 100644 --- 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); } } @@ -1615,7 +1575,7 @@ int osl_del_row(struct osl_table *t, struct osl_row *row) mark_mapped_object_invalid(t, r->num, i); continue; } - if (st == OSL_NO_STORAGE) + if (st == OSL_NO_STORAGE && !(cd->storage_flags & OSL_DONT_FREE)) free(r->volatile_objects[col->volatile_num].data); } if (t->num_mapped_columns) { @@ -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; } @@ -2053,8 +2013,17 @@ int osl_get_nth_row(const struct osl_table *t, unsigned col_num, { struct osl_column *col; struct rb_node *node; - int ret = check_rbtree_col(t, col_num, &col); + unsigned num_rows; + int ret; + if (n == 0) + return -E_RB_KEY_NOT_FOUND; + ret = osl_get_num_rows(t, &num_rows); + if (ret < 0) + return ret; + if (n > num_rows) + return -E_RB_KEY_NOT_FOUND; + ret = check_rbtree_col(t, col_num, &col); if (ret < 0) return ret; node = rb_nth(col->rbtree.rb_node, n);