Improve documentation of osl_rbtree_loop().
[osl.git] / osl.h.in
index a586be293ac228382fc7413b508539bc425a2808..3d21439719c3277bbd9d181d717cf82df7244e6b 100644 (file)
--- a/osl.h.in
+++ b/osl.h.in
@@ -1,13 +1,18 @@
-#include <sys/mman.h>
 /*
- * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2009 Andre Noll <maan@tuebingen.mpg.de>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
 /** \file osl.h User interface for the object storage layer. */
 
-/** describes an object of the object storage layer (osl) */
+#include <sys/mman.h>
+#include <inttypes.h>
+
+/** Export all declarations in this file. */
+#pragma GCC visibility push(default)
+
+/** Describes an object of the object storage layer (osl) */
 struct osl_object {
        /** Pointer to the data of the object. */
        void *data;
@@ -37,7 +42,7 @@ enum osl_storage_type {
         OSL_DISK_STORAGE,
        /**
         * Objects for columns of this type are volatile: They are only stored
-        * in memory and are discarded once the table gets closed.
+        * in memory and are discarded when the table is closed.
         */
        OSL_NO_STORAGE
 };
@@ -57,40 +62,47 @@ enum osl_storage_flags {
        OSL_RBTREE = 1,
        /** The data for this column will have constant size. */
        OSL_FIXED_SIZE = 2,
-       /** All values of this column will be different. */
+       /** All values are different. Must be set if \p OSL_RBTREE is set. */
        OSL_UNIQUE = 4,
        /** Do not free the data for this column (\p OSL_NO_STORAGE). */
        OSL_DONT_FREE = 8
 };
 
+/** Opaque osl table structure. */
 struct osl_table;
+/** Opaque osl row structure. */
 struct osl_row;
 
 /**
  * In order to build up an rbtree a compare function for the objects must be
- * specified. Such a function always takes pointers to the two objects to be
- * compared. It must return -1, zero, or 1, if the first argument is considered
- * to  be  respectively less than, equal to, or greater than the second. If two
- * members compare as equal, their order in the sorted array is undefined.
+ * provided. This function takes pointers to the two objects to be compared. It
+ * must return -1, zero, or 1, if the first argument is considered to be
+ * respectively less than, equal to, or greater than the second. If two members
+ * compare as equal, their order in the rbtree is undefined.
  */
 typedef int osl_compare_func(const struct osl_object *obj1,
        const struct osl_object *obj2);
-typedef int osl_rbtree_loop_func(struct osl_row *row, void *data);
 
-osl_compare_func osl_hash_compare, uint32_compare;
+/**
+ * The osl_rbreee_loop functions take a function pointer of this type. For each
+ * node in the rbtree, the given function is called.
+ *
+ * \sa osl_rbtree_loop(), osl_rbtree_loop_reverse().
+ */
+typedef int osl_rbtree_loop_func(struct osl_row *row, void *data);
 
 /**
  * Describes one column of a osl table.
  */
 struct osl_column_description {
-       /** One of zje tree possible types of storage */
-       enum osl_storage_type storage_type;
-       /** Specifies further properties of the column */
-       enum osl_storage_flags storage_flags;
+       /** One of the three possible types of storage, \sa osl_storage_type. */
+       uint16_t storage_type;
+       /** Specifies further properties of the column, \sa osl_storage_flags. */
+       uint16_t storage_flags;
        /**
         * The column name determines the name of the directory where all data
         * for this column will be stored. Its hash is stored in the table
-        * header. This field is ignored if the storage type is \a NO_STORAGE
+        * header. This field is ignored if the storage type is \a NO_STORAGE.
         */
        char *name;
        /**
@@ -104,7 +116,7 @@ struct osl_column_description {
        osl_compare_func *compare_function;
        /**
         * If the \a OSL_FIXED_SIZE flag is set for this column, this value
-        * determines the fixed size of all objects of this column. It is
+        * describes the number of bytes of each object of this column. It is
         * ignored, if \a OSL_FIXED_SIZE is not set.
         */
        uint32_t data_size;
@@ -112,9 +124,17 @@ struct osl_column_description {
 
 /**
  * Describes one osl table.
+ *
+ * A pointer to the table description is passed to \ref osl_create_table() and
+ * \ref osl_open_table(). The osl library calls which operate on an open table
+ * refer to the fields of the table description through this pointer. Hence the
+ * table description must not be modified or freed before the table is closed.
  */
 struct osl_table_description {
-       /** The directory which contains all files of this table. */
+       /**
+        * The directory which contains all files of this table. This may be
+        * either relative to the cwd or an absolute path.
+        */
        const char *dir;
        /**
         * The table name. A subdirectory of \a dir called \a name is created
@@ -124,8 +144,8 @@ struct osl_table_description {
        const char *name;
        /** The number of columns of this table. */
        uint16_t num_columns;
-       /** Further table-wide information. */
-       enum osl_table_flags flags;
+       /** Further table-wide information, \sa osl_table_flags. */
+       uint8_t flags;
        /** The array describing the individual columns of the table. */
        struct osl_column_description *column_descriptions;
 };
@@ -133,9 +153,10 @@ struct osl_table_description {
 /** Flags to be passed to \a osl_close_table(). */
 enum osl_close_flags {
        /**
-        * The table header contains a "dirty" flag which specifies whether
-        * the table is currently open by another process. This flag specifies
-        * that the dirty flag should be cleared before closing the table.
+        * The table header contains a "dirty" flag which indicates whether the
+        * table is currently held open by another process. The \a
+        * OSL_MARK_CLEAN flag instructs libosl to clear the dirty flag when
+        * the table is closed.
         */
        OSL_MARK_CLEAN = 1,
        /**
@@ -146,36 +167,334 @@ enum osl_close_flags {
        OSL_FREE_VOLATILE = 2
 };
 
-
-
+/**
+ * Create a new osl table.
+ *
+ * \param desc Pointer to the table description.
+ *
+ * \return Standard.
+ */
 int osl_create_table(const struct osl_table_description *desc);
+
+/**
+ * Open an osl table.
+ *
+ * Each osl table must be opened before its data can be accessed.
+ *
+ * \param 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.
+ */
 int osl_open_table(const struct osl_table_description *desc,
        struct osl_table **result);
+
+/**
+ * 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().
+ */
 int osl_close_table(struct osl_table *t, enum osl_close_flags flags);
+
+/**
+ * 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. \a result is set to \p NULL if and only if the function
+ * returns negative.
+ *
+ * \sa osl_storage_flags
+ */
 int osl_get_row(const struct osl_table *t, unsigned col_num,
        const struct osl_object *obj, struct osl_row **result);
+
+/**
+ * Retrieve an object identified by row and column.
+ *
+ * \param t Pointer to an open osl table.
+ * \param row 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().
+ */
 int osl_get_object(const struct osl_table *t, const struct osl_row *row,
        unsigned col_num, struct osl_object *object);
+
+/**
+ * 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().
+ */
 int osl_open_disk_object(const struct osl_table *t,
        const struct osl_row *r, unsigned col_num, struct osl_object *obj);
+
+/**
+ * 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 munmap().
+ *
+ * \sa munmap(2).
+ */
 int osl_close_disk_object(struct osl_object *obj);
+
+/**
+ * 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().
+ */
 int osl_add_and_get_row(struct osl_table *t, struct osl_object *objects,
        struct osl_row **row);
+
+/**
+ * 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).
+ */
 int osl_add_row(struct osl_table *t, struct osl_object *objects);
+
+/**
+ * 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
+ * oslfsck.
+ *
+ * \return Standard.
+ */
 int osl_del_row(struct osl_table *t, struct osl_row *row);
+
+/**
+ * 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, \p -E_OSL_LOOP is returned. This is the only
+ * possible error.
+ *
+ * \sa osl_storage_flags, osl_rbtree_loop_reverse(), osl_compare_func.
+ */
 int osl_rbtree_loop(const struct osl_table *t, unsigned col_num,
        void *private_data, osl_rbtree_loop_func *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().
+ */
 int osl_rbtree_loop_reverse(const struct osl_table *t, unsigned col_num,
        void *private_data, osl_rbtree_loop_func *func);
+
+/**
+ * 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 corrupt.
+ *
+ * \return Standard
+ */
 int osl_update_object(struct osl_table *t, const struct osl_row *r,
        unsigned col_num, struct osl_object *obj);
+
+/**
+ * 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.
+ */
 int osl_get_num_rows(const struct osl_table *t, unsigned *num_rows);
+
+/**
+ * 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().
+ */
 int osl_rbtree_first_row(const struct osl_table *t, unsigned col_num,
        struct osl_row **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().
+ */
 int osl_rbtree_last_row(const struct osl_table *t, unsigned col_num,
        struct osl_row **result);
+
+/**
+ * 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 the row with
+ * \a n th greatest value in column \a col_num. It is 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().
+ */
 int osl_get_nth_row(const struct osl_table *t, unsigned col_num,
        unsigned n, struct osl_row **result);
+
+/**
+ * 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().
+ */
 int osl_get_rank(const struct osl_table *t, struct osl_row *r,
        unsigned col_num, unsigned *rank);
-const char *osl_strerror(int nr);
+
+/**
+ * Get a string describing the error code passed in the argument.
+ *
+ * \param num The error code.
+ *
+ * This works just like strerror(3). The given number must be an osl error
+ * code. The result must not be freed by the caller.
+ *
+ * \return The error text corresponding to an osl error code.
+ */
+const char *osl_strerror(int num);
+
+#pragma GCC visibility pop