X-Git-Url: http://git.tuebingen.mpg.de/?p=osl.git;a=blobdiff_plain;f=osl.c;h=0b3e88c487d7aa15a65c188af04826e9d13f93ea;hp=cce01aac4dc7c7fc6be09d47f274e12a5e0209fb;hb=b0884806fccc7a0b1e489ee57a3fa02e3a16fe84;hpb=f57b24f2f5b6d8ce5ca0d5ad67b5c086695d8eb2 diff --git a/osl.c b/osl.c index cce01aa..0b3e88c 100644 --- a/osl.c +++ b/osl.c @@ -57,6 +57,7 @@ static __must_check __printf_1_2 __malloc char *make_message(const char *fmt, .. free(p); return NULL; } + p = q; } return p; } @@ -82,6 +83,7 @@ static const unsigned int errmsgidx[] = { #include "errtab.h" #undef _S }; + __export const char *osl_strerror(int num) { if (IS_SYSTEM_ERROR(num)) @@ -89,6 +91,16 @@ __export const char *osl_strerror(int num) return msgstr.str + errmsgidx[num]; } +static int loglevel; + +static void __attribute ((constructor)) init_loglevel(void) +{ + char *p = getenv("OSL_LOGLEVEL"); + + /* don't log anything if unset */ + loglevel = p? atoi(p) : EMERG + 1; +} + /** * The log function. * @@ -105,7 +117,7 @@ __printf_2_3 void __log(int ll, const char* fmt,...) time_t t1; char str[255] = ""; - if (ll < 2) + if (ll < loglevel) return; outfd = stderr; time(&t1); @@ -271,38 +283,6 @@ static int verify_name(const char *name) return 1; } -/** - * Compare two osl objects pointing to unsigned integers of 32 bit size. - * - * \param obj1 Pointer to the first integer. - * \param obj2 Pointer to the second integer. - * - * \return The values required for an osl compare function. - * - * \sa osl_compare_func, osl_hash_compare(). - */ -int uint32_compare(const struct osl_object *obj1, const struct osl_object *obj2) -{ - uint32_t d1 = read_u32((const char *)obj1->data); - uint32_t d2 = read_u32((const char *)obj2->data); - - if (d1 < d2) - return 1; - if (d1 > d2) - return -1; - return 0; -} - -/** - * Compare two osl objects pointing to hash values. - * - * \param obj1 Pointer to the first hash object. - * \param obj2 Pointer to the second hash object. - * - * \return The values required for an osl compare function. - * - * \sa osl_compare_func, uint32_compare(). - */ int osl_hash_compare(const struct osl_object *obj1, const struct osl_object *obj2) { return hash_compare((HASH_TYPE *)obj1->data, (HASH_TYPE *)obj2->data); @@ -520,7 +500,7 @@ int read_table_desc(struct osl_object *map, struct osl_table_description *desc) return -E_OSL_VERSION_MISMATCH; desc->flags = read_u8(buf + IDX_TABLE_FLAGS); desc->num_columns = read_u16(buf + IDX_NUM_COLUMNS); - DEBUG_LOG("%u columns\n", desc->num_columns); + INFO_LOG("%u columns\n", desc->num_columns); if (!desc->num_columns) return -E_OSL_NO_COLUMNS; header_size = read_u16(buf + IDX_HEADER_SIZE); @@ -625,7 +605,7 @@ static int compare_table_descriptions(struct osl_table *t) if (strcmp(cd1->name, cd2->name)) goto out; } - DEBUG_LOG("table description of '%s' matches on-disk data, good\n", + INFO_LOG("table description of '%s' matches on-disk data, good\n", t->desc->name); ret = 1; out: @@ -680,13 +660,6 @@ static int create_table_index(struct osl_table *t) return ret; } -/** - * Create a new osl table. - * - * \param desc Pointer to the table description. - * - * \return Standard. - */ __export int osl_create_table(const struct osl_table_description *desc) { const struct osl_column_description *cd; @@ -701,7 +674,7 @@ __export int osl_create_table(const struct osl_table_description *desc) if (cd->storage_type == OSL_NO_STORAGE) continue; if (!table_dir) { - ret = para_mkdir(desc->dir, 0777); + ret = osl_mkdir(desc->dir, 0777); if (ret < 0 && !is_errno(-ret, EEXIST)) goto out; table_dir = make_message("%s/%s", desc->dir, @@ -709,7 +682,7 @@ __export int osl_create_table(const struct osl_table_description *desc) ret = -ERRNO_TO_ERROR(ENOMEM); if (!table_dir) goto out; - ret = para_mkdir(table_dir, 0777); + ret = osl_mkdir(table_dir, 0777); if (ret < 0) goto out; } @@ -728,7 +701,7 @@ __export int osl_create_table(const struct osl_table_description *desc) continue; } /* DISK STORAGE */ - ret = para_mkdir(filename, 0777); + ret = osl_mkdir(filename, 0777); free(filename); if (ret < 0) goto out; @@ -771,7 +744,7 @@ static void unmap_column(struct osl_table *t, unsigned col_num) int ret; if (!map.data) return; - ret = para_munmap(map.data, map.size); + ret = osl_munmap(map.data, map.size); assert(ret > 0); map.data = NULL; } @@ -784,7 +757,7 @@ static void unmap_column(struct osl_table *t, unsigned col_num) * * \return Positive on success, negative on errors. * - * \sa map_table(), enum osl_close_flags, para_munmap(). + * \sa map_table(), enum osl_close_flags, osl_munmap(). */ int unmap_table(struct osl_table *t, enum osl_close_flags flags) { @@ -794,12 +767,12 @@ int unmap_table(struct osl_table *t, enum osl_close_flags flags) if (!t->num_mapped_columns) /* can this ever happen? */ return 1; - DEBUG_LOG("unmapping table '%s'\n", t->desc->name); + INFO_LOG("unmapping table '%s'\n", t->desc->name); if (!t->index_map.data) return -E_OSL_NOT_MAPPED; if (flags & OSL_MARK_CLEAN) mark_table_clean(t); - ret = para_munmap(t->index_map.data, t->index_map.size); + ret = osl_munmap(t->index_map.data, t->index_map.size); if (ret < 0) return ret; t->index_map.data = NULL; @@ -858,7 +831,7 @@ int map_table(struct osl_table *t, enum map_table_flags flags) filename = index_filename(t->desc); if (!filename) return -ERRNO_TO_ERROR(ENOMEM); - DEBUG_LOG("mapping table '%s' (index: %s)\n", t->desc->name, filename); + INFO_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.data, &t->index_map.size, NULL); free(filename); @@ -890,10 +863,10 @@ int map_table(struct osl_table *t, enum map_table_flags flags) err: /* unmap what is already mapped */ for (i--; i >= 0; i--) { struct osl_object map = t->columns[i].data_map; - para_munmap(map.data, map.size); + osl_munmap(map.data, map.size); map.data = NULL; } - para_munmap(t->index_map.data, t->index_map.size); + osl_munmap(t->index_map.data, t->index_map.size); t->index_map.data = NULL; return ret; } @@ -1122,26 +1095,13 @@ void clear_rbtrees(struct osl_table *t) } -/** - * Close an osl table. - * - * \param t Pointer to the table to be closed. - * \param flags Options for what should be cleaned up. - * - * If osl_open_table() succeeds, the resulting table pointer must later be - * passed to this function in order to flush all changes to the file system and - * to free the resources that were allocated by osl_open_table(). - * - * \return Standard. - * - * \sa osl_open_table(), unmap_table(). - */ __export int osl_close_table(struct osl_table *t, enum osl_close_flags flags) { int ret; if (!t) return -E_OSL_BAD_TABLE; + NOTICE_LOG("closing table %s\n", t->desc->name); free_volatile_objects(t, flags); clear_rbtrees(t); ret = unmap_table(t, flags); @@ -1234,19 +1194,6 @@ int init_rbtrees(struct osl_table *t) return 1; } -/** - * Open an osl table. - * - * Each osl table must be opened before its data can be accessed. - * - * \param table_desc Describes the table to be opened. - * \param result Contains a pointer to the open table on success. - * - * The table description given by \a desc should coincide with the - * description used at creation time. - * - * \return Standard. - */ __export int osl_open_table(const struct osl_table_description *table_desc, struct osl_table **result) { @@ -1254,7 +1201,7 @@ __export int osl_open_table(const struct osl_table_description *table_desc, struct osl_table *t; const struct osl_column_description *cd; - INFO_LOG("opening table %s\n", table_desc->name); + NOTICE_LOG("opening table %s\n", table_desc->name); ret = init_table_structure(table_desc, &t); if (ret < 0) return ret; @@ -1305,7 +1252,7 @@ static int create_disk_storage_object_dir(const struct osl_table *t, dirname = disk_storage_dirname(t, col_num, ds_name); if (!dirname) return -ERRNO_TO_ERROR(ENOMEM); - ret = para_mkdir(dirname, 0777); + ret = osl_mkdir(dirname, 0777); free(dirname); if (ret < 0 && !is_errno(-ret, EEXIST)) return ret; @@ -1427,29 +1374,6 @@ static int delete_disk_storage_file(const struct osl_table *t, unsigned col_num, return 1; } -/** - * Add a new row to an osl table and retrieve this row. - * - * \param t Pointer to an open osl table. - * \param objects Array of objects to be added. - * \param row Result pointer. - * - * The \a objects parameter must point to an array containing one object per - * column. The order of the objects in the array is given by the table - * description of \a table. Several sanity checks are performed during object - * insertion and the function returns without modifying the table if any of - * these tests fail. In fact, it is atomic in the sense that it either - * succeeds or leaves the table unchanged (i.e. either all or none of the - * objects are added to the table). - * - * It is considered an error if an object is added to a column with associated - * rbtree if this object is equal to an object already contained in that column - * (i.e. the compare function for the column's rbtree returns zero). - * - * \return Standard. - * - * \sa struct osl_table_description, osl_compare_func, osl_add_row(). - */ __export int osl_add_and_get_row(struct osl_table *t, struct osl_object *objects, struct osl_row **row) { @@ -1592,37 +1516,11 @@ out: return ret; } -/** - * Add a new row to an osl table. - * - * \param t Same meaning as osl_add_and_get_row(). - * \param objects Same meaning as osl_add_and_get_row(). - * - * \return The return value of the underlying call to osl_add_and_get_row(). - * - * This is equivalent to osl_add_and_get_row(t, objects, NULL). - */ __export int osl_add_row(struct osl_table *t, struct osl_object *objects) { return osl_add_and_get_row(t, objects, NULL); } -/** - * Retrieve an object identified by row and column - * - * \param t Pointer to an open osl table. - * \param r Pointer to the row. - * \param col_num The column number. - * \param object The result pointer. - * - * The column determined by \a col_num must be of type \p OSL_MAPPED_STORAGE - * or \p OSL_NO_STORAGE, i.e. no disk storage objects may be retrieved by this - * function. - * - * \return Standard. - * - * \sa osl_storage_type, osl_open_disk_object(). - */ __export int osl_get_object(const struct osl_table *t, const struct osl_row *r, unsigned col_num, struct osl_object *object) { @@ -1656,19 +1554,6 @@ static int mark_mapped_object_invalid(const struct osl_table *t, return 1; } -/** - * Delete a row from an osl table. - * - * \param t Pointer to an open osl table. - * \param row Pointer to the row to delete. - * - * This removes all disk storage objects, removes all rbtree nodes, and frees - * all volatile objects belonging to the given row. For mapped columns, the - * data is merely marked invalid and may be pruned from time to time by - * para_fsck. - * - * \return Standard. - */ __export int osl_del_row(struct osl_table *t, struct osl_row *row) { struct osl_row *r = row; @@ -1725,21 +1610,6 @@ static int check_rbtree_col(const struct osl_table *t, unsigned col_num, return 1; } -/** - * Get the row that contains the given object. - * - * \param t Pointer to an open osl table. - * \param col_num The number of the column to be searched. - * \param obj The object to be looked up. - * \param result Points to the row containing \a obj. - * - * Lookup \a obj in \a t and return the row containing \a obj. The column - * specified by \a col_num must have an associated rbtree. - * - * \return Standard. - * - * \sa osl_storage_flags - */ __export int osl_get_row(const struct osl_table *t, unsigned col_num, const struct osl_object *obj, struct osl_row **result) { @@ -1760,7 +1630,7 @@ __export int osl_get_row(const struct osl_table *t, unsigned col_num, return 1; } -static int rbtree_loop(struct osl_column *col, void *private_data, +static int rbtree_loop(struct osl_column *col, void *private_data, osl_rbtree_loop_func *func) { struct rb_node *n, *tmp; @@ -1770,14 +1640,13 @@ static int rbtree_loop(struct osl_column *col, void *private_data, n; n = tmp, tmp = tmp? rb_next(tmp) : NULL) { struct osl_row *r = get_row_pointer(n, col->rbtree_num); - int ret = func(r, private_data); - if (ret < 0) - return ret; + if (func(r, private_data) < 0) + return -E_OSL_LOOP; } return 1; } -static int rbtree_loop_reverse(struct osl_column *col, void *private_data, +static int rbtree_loop_reverse(struct osl_column *col, void *private_data, osl_rbtree_loop_func *func) { struct rb_node *n, *tmp; @@ -1787,36 +1656,12 @@ static int rbtree_loop_reverse(struct osl_column *col, void *private_data, n; n = tmp, tmp = tmp? rb_prev(tmp) : NULL) { struct osl_row *r = get_row_pointer(n, col->rbtree_num); - int ret = func(r, private_data); - if (ret < 0) - return ret; + if (func(r, private_data) < 0) + return -E_OSL_LOOP; } return 1; } -/** - * Loop over all nodes in an rbtree. - * - * \param t Pointer to an open osl table. - * \param col_num The column to use for iterating over the elements. - * \param private_data Pointer that gets passed to \a func. - * \param func The function to be called for each node in the rbtree. - * - * This function does an in-order walk of the rbtree associated with \a - * col_num. It is an error if the \p OSL_RBTREE flag is not set for this - * column. For each node in the rbtree, the given function \a func is called - * with two pointers as arguments: The first osl_row* argument points to the - * row that contains the object corresponding to the rbtree node currently - * traversed, and the \a private_data pointer is passed verbatim to \a func as the - * second argument. The loop terminates either if \a func returns a negative - * value, or if all nodes of the tree have been visited. - * - * - * \return Standard. If the termination of the loop was caused by \a func - * returning a negative value, this value is returned. - * - * \sa osl_storage_flags, osl_rbtree_loop_reverse(), osl_compare_func. - */ __export int osl_rbtree_loop(const struct osl_table *t, unsigned col_num, void *private_data, osl_rbtree_loop_func *func) { @@ -1828,21 +1673,6 @@ __export int osl_rbtree_loop(const struct osl_table *t, unsigned col_num, return rbtree_loop(col, private_data, func); } -/** - * Loop over all nodes in an rbtree in reverse order. - * - * \param t Identical meaning as in \p osl_rbtree_loop(). - * \param col_num Identical meaning as in \p osl_rbtree_loop(). - * \param private_data Identical meaning as in \p osl_rbtree_loop(). - * \param func Identical meaning as in \p osl_rbtree_loop(). - * - * This function is identical to \p osl_rbtree_loop(), the only difference - * is that the tree is walked in reverse order. - * - * \return The same return value as \p osl_rbtree_loop(). - * - * \sa osl_rbtree_loop(). - */ __export int osl_rbtree_loop_reverse(const struct osl_table *t, unsigned col_num, void *private_data, osl_rbtree_loop_func *func) { @@ -1883,7 +1713,7 @@ static int rename_disk_storage_objects(struct osl_table *t, if (!old_filename || !new_filename) ret = -ERRNO_TO_ERROR(ENOMEM); else - ret = para_rename(old_filename, new_filename); + ret = osl_rename(old_filename, new_filename); free(old_filename); free(new_filename); if (ret < 0) @@ -1897,25 +1727,6 @@ out: } -/** - * Change an object in an osl table. - * - * \param t Pointer to an open osl table. - * \param r Pointer to the row containing the object to be updated. - * \param col_num Number of the column containing the object to be updated. - * \param obj Pointer to the replacement object. - * - * This function gets rid of all references to the old object. This includes - * removal of the rbtree node in case there is an rbtree associated with \a - * col_num. It then inserts \a obj into the table and the rbtree if necessary. - * - * If the \p OSL_RBTREE flag is set for \a col_num, you \b MUST call this - * function in order to change the contents of an object, even for volatile or - * mapped columns of constant size (which may be updated directly if \p - * OSL_RBTREE is not set). Otherwise the rbtree might become corrupted. - * - * \return Standard - */ __export int osl_update_object(struct osl_table *t, const struct osl_row *r, unsigned col_num, struct osl_object *obj) { @@ -2000,22 +1811,6 @@ __export int osl_update_object(struct osl_table *t, const struct osl_row *r, return 1; } -/** - * Retrieve an object of type \p OSL_DISK_STORAGE by row and column. - * - * \param t Pointer to an open osl table. - * \param r Pointer to the row containing the object. - * \param col_num The column number. - * \param obj Points to the result upon successful return. - * - * For columns of type \p OSL_DISK_STORAGE, this function must be used to - * retrieve one of its containing objects. Afterwards, osl_close_disk_object() - * must be called in order to deallocate the resources. - * - * \return Standard. - * - * \sa osl_get_object(), osl_storage_type, osl_close_disk_object(). - */ __export int osl_open_disk_object(const struct osl_table *t, const struct osl_row *r, unsigned col_num, struct osl_object *obj) { @@ -2042,30 +1837,11 @@ __export int osl_open_disk_object(const struct osl_table *t, const struct osl_ro return ret; } -/** - * Free resources that were allocated during osl_open_disk_object(). - * - * \param obj Pointer to the object previously returned by open_disk_object(). - * - * \return The return value of the underlying call to para_munmap(). - * - * \sa para_munmap(). - */ __export int osl_close_disk_object(struct osl_object *obj) { - return para_munmap(obj->data, obj->size); + return osl_munmap(obj->data, obj->size); } -/** - * Get the number of rows of the given table. - * - * \param t Pointer to an open osl table. - * \param num_rows Result is returned here. - * - * The number of rows returned via \a num_rows excluding any invalid rows. - * - * \return Positive on success, \p -E_OSL_BAD_TABLE if \a t is \p NULL. - */ __export int osl_get_num_rows(const struct osl_table *t, unsigned *num_rows) { if (!t) @@ -2075,22 +1851,6 @@ __export int osl_get_num_rows(const struct osl_table *t, unsigned *num_rows) return 1; } -/** - * Get the rank of a row. - * - * \param t An open osl table. - * \param r The row to get the rank of. - * \param col_num The number of an rbtree column. - * \param rank Result pointer. - * - * The rank is, by definition, the position of the row in the linear order - * determined by an in-order tree walk of the rbtree associated with column - * number \a col_num of \a table. - * - * \return Standard. - * - * \sa osl_get_nth_row(). - */ __export int osl_get_rank(const struct osl_table *t, struct osl_row *r, unsigned col_num, unsigned *rank) { @@ -2113,25 +1873,6 @@ __export int osl_get_rank(const struct osl_table *t, struct osl_row *r, return 1; } -/** - * Get the row with n-th greatest value. - * - * \param t Pointer to an open osl table. - * \param col_num The column number. - * \param n The rank of the desired row. - * \param result Row is returned here. - * - * Retrieve the n-th order statistic with respect to the compare function - * of the rbtree column \a col_num. In other words, get that row with - * \a n th greatest value in column \a col_num. It's an error if - * \a col_num is not a rbtree column, or if \a n is larger than the - * number of rows in the table. - * - * \return Standard. - * - * \sa osl_storage_flags, osl_compare_func, osl_get_row(), - * osl_rbtree_last_row(), osl_rbtree_first_row(), osl_get_rank(). - */ __export int osl_get_nth_row(const struct osl_table *t, unsigned col_num, unsigned n, struct osl_row **result) { @@ -2157,43 +1898,12 @@ __export int osl_get_nth_row(const struct osl_table *t, unsigned col_num, return 1; } -/** - * Get the row corresponding to the smallest rbtree node of a column. - * - * \param t An open rbtree table. - * \param col_num The number of the rbtree column. - * \param result A pointer to the first row is returned here. - * - * The rbtree node of the smallest object (with respect to the corresponding - * compare function) is selected and the row containing this object is - * returned. It is an error if \a col_num refers to a column without an - * associated rbtree. - * - * \return Standard. - * - * \sa osl_get_nth_row(), osl_rbtree_last_row(). - */ __export int osl_rbtree_first_row(const struct osl_table *t, unsigned col_num, struct osl_row **result) { return osl_get_nth_row(t, col_num, 1, result); } -/** - * Get the row corresponding to the greatest rbtree node of a column. - * - * \param t The same meaning as in \p osl_rbtree_first_row(). - * \param col_num The same meaning as in \p osl_rbtree_first_row(). - * \param result The same meaning as in \p osl_rbtree_first_row(). - * - * This function works just like osl_rbtree_first_row(), the only difference - * is that the row containing the greatest rather than the smallest object is - * returned. - * - * \return Standard. - * - * \sa osl_get_nth_row(), osl_rbtree_first_row(). - */ __export int osl_rbtree_last_row(const struct osl_table *t, unsigned col_num, struct osl_row **result) {