#include "util.h"
#include "osl_core.h"
-/* Taken from Drepper: How to write shared libraries, Appendix B. */
+/*
+ * Taken from Drepper: How to write shared libraries, Appendix B.
+ *
+ * The main reason for this rather fancy implementation of strerror() is to
+ * avoid having an array of pointers. This is desirable because initialized
+ * pointer variables increase the startup time of the library due to the
+ * processing of relocations.
+ */
#include <stddef.h>
#define MSGSTRFIELD(line) MSGSTRFIELD1(line)
#define MSGSTRFIELD1(line) str##line
int row_is_invalid(struct osl_table *t, uint32_t row_num)
{
char *row_index;
- int i, ret = get_row_index(t, row_num, &row_index);
+ int ret = get_row_index(t, row_num, &row_index);
+ unsigned n;
if (ret < 0)
return ret;
- for (i = 0; i < t->row_index_size; i++) {
- if ((unsigned char)row_index[i] != 0xff)
+ for (n = 0; n < t->row_index_size; n++) {
+ if ((unsigned char)row_index[n] != 0xff)
return 0;
}
INFO_LOG("row %d is invalid\n", row_num);
*/
int init_rbtrees(struct osl_table *t)
{
- int i, ret;
+ int ret;
+ unsigned n;
const struct osl_column_description *cd;
/* create rbtrees */
- FOR_EACH_RBTREE_COLUMN(i, t, cd)
- t->columns[i].rbtree = RB_ROOT;
+ FOR_EACH_RBTREE_COLUMN(n, t, cd)
+ t->columns[n].rbtree = RB_ROOT;
/* add valid rows to rbtrees */
t->num_invalid_rows = 0;
- for (i = 0; i < t->num_rows; i++) {
+ for (n = 0; n < t->num_rows; n++) {
struct osl_object *volatile_objs;
- ret = row_is_invalid(t, i);
+ ret = row_is_invalid(t, n);
if (ret < 0)
return ret;
if (ret) {
return -E_OSL_NOMEM;
} else
volatile_objs = NULL;
- ret = add_row_to_rbtrees(t, i, volatile_objs, NULL);
+ ret = add_row_to_rbtrees(t, n, volatile_objs, NULL);
if (ret < 0)
return ret;
}
}
remove_rb_node(t, col_num, r);
if (cd->storage_type == OSL_NO_STORAGE) { /* TODO: If fixed size, reuse object? */
- free(r->volatile_objects[col->volatile_num].data);
+ if (!(cd->storage_flags & OSL_DONT_FREE))
+ free(r->volatile_objects[col->volatile_num].data);
r->volatile_objects[col->volatile_num] = *obj;
} else if (cd->storage_type == OSL_DISK_STORAGE) {
char *ds_name;
unsigned num_rows;
int ret;
+ *result = NULL;
if (n == 0)
return -E_OSL_RB_KEY_NOT_FOUND;
ret = osl_get_num_rows(t, &num_rows);