From d610249c7b962a47cad102090ffb5f28a697751f Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Thu, 18 Feb 2016 14:45:11 +0100 Subject: Use utarray instead of home-grown list --- c_src/permdb.c | 97 +++++++++++++++------------------------------------------- 1 file changed, 24 insertions(+), 73 deletions(-) (limited to 'c_src/permdb.c') diff --git a/c_src/permdb.c b/c_src/permdb.c index 50618c5..9221f45 100644 --- a/c_src/permdb.c +++ b/c_src/permdb.c @@ -22,11 +22,11 @@ #include "util.h" #include "uthash.h" +#include "utarray.h" #include "pstring.h" #define INDEX_COMMIT_TRAILER_SIZE (sizeof(uint64_t) + SHA256_DIGEST_SIZE + sizeof(index_commit_cookie)) -static const int bitsperlevel = 2; static const int keylen = 32; struct permdb_object { @@ -580,35 +580,10 @@ entryoffset(node_entry entry) return entry & NODE_ENTRY_OFFSET_MASK; } -struct nodelist { - node_object *nodes; - unsigned int len; - unsigned int pos; -}; - -static void -add_entry_to_nodelist(struct nodelist *list, node_object node) -{ - list->nodes[list->pos] = node; - list->pos++; -} - -static void -init_nodelist(struct nodelist *list) -{ - list->len = keylen * 8 / bitsperlevel; - list->nodes = malloc(sizeof(node_object) * list->len); - list->pos = 0; -} - -static void -free_nodelist(struct nodelist *list) -{ - free(list->nodes); -} +UT_icd node_object_icd = {sizeof(node_object), NULL, NULL, NULL }; static char -getpath(permdb_object *state, const unsigned char *key, struct nodelist *nodes) +getpath(permdb_object *state, const unsigned char *key, UT_array *nodes) { unsigned int level = 0; @@ -626,11 +601,7 @@ getpath(permdb_object *state, const unsigned char *key, struct nodelist *nodes) while (1) { unsigned char kb = keybits(key, level); node_entry entry = get_entry_in_node(node, kb); - if (nodes->pos >= nodes->len) { - fprintf(stderr, "tried to write after end of allocated list: level %d\n", level); - return -1; - } - add_entry_to_nodelist(nodes, node); + utarray_push_back(nodes, &node); if (entry == 0 || isdata(entry)) { dprintf(READ, (stderr, "getpath: return node\n")); return (char) kb; @@ -785,35 +756,30 @@ writedata(permdb_object *state, const unsigned char *key, const unsigned char *d int addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, node_offset dataoffset) { - struct nodelist nodes; - init_nodelist(&nodes); + UT_array *nodes; + utarray_new(nodes, &node_object_icd); - char kb = getpath(state, key, &nodes); + char kb = getpath(state, key, nodes); if (kb == -1) { - free_nodelist(&nodes); + utarray_free(nodes); return -1; } - unsigned int foundlevel = nodes.pos - 1; + unsigned int foundlevel = utarray_len(nodes) - 1; - if (foundlevel >= nodes.len) { - fprintf(stderr, "tried to read after end of allocated list\n"); - free_nodelist(&nodes); - return 0; - } - node_object lastnode = nodes.nodes[foundlevel]; + node_object lastnode = *(node_object *)utarray_back(nodes); if (get_entry_in_node(lastnode, (unsigned char) kb) == 0) { addentry(&lastnode, keybits(key, foundlevel), buildentry(1, dataoffset)); } else { node_offset olddataoffset = entryoffset(get_entry_in_node(lastnode, (unsigned char) kb)); unsigned char *olddatakey = readdatakey(state, olddataoffset); if (olddatakey == NULL) { - free_nodelist(&nodes); + utarray_free(nodes); return -1; } if (memcmp(olddatakey, key, keylen) == 0) { - free_nodelist(&nodes); + utarray_free(nodes); free(olddatakey); return 0; } @@ -852,12 +818,7 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, level--; while (level >= 0) { - if (level >= (int) nodes.len) { - fprintf(stderr, "tried to read after end of allocated list\n"); - free_nodelist(&nodes); - return 0; - } - node_object node = nodes.nodes[level]; + node_object node = *(node_object *)utarray_eltptr(nodes, level); overwriteentry(&node, keybits(key, (unsigned int) level), NODE_ENTRY_DIRTY_NODE); ps_string cachekey; keypart(key, (unsigned int) level, &cachekey); @@ -865,7 +826,7 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, level--; } - free_nodelist(&nodes); + utarray_free(nodes); return 1; } @@ -874,24 +835,19 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, int addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, const unsigned char *data, size_t datalength) { - struct nodelist nodes; - init_nodelist(&nodes); + UT_array *nodes; + utarray_new(nodes, &node_object_icd); - char kb = getpath(state, key, &nodes); + char kb = getpath(state, key, nodes); if (kb == -1) { - free_nodelist(&nodes); + utarray_free(nodes); return -1; } - unsigned int foundlevel = nodes.pos - 1; + unsigned int foundlevel = utarray_len(nodes) - 1; - if (foundlevel >= nodes.len) { - fprintf(stderr, "tried to read after end of allocated list\n"); - free_nodelist(&nodes); - return 0; - } - node_object lastnode = nodes.nodes[foundlevel]; + node_object lastnode = *(node_object *)utarray_back(nodes); if (get_entry_in_node(lastnode, (unsigned char) kb) == 0) { node_offset dataoffset = writedata(state, key, data, datalength); addentry(&lastnode, keybits(key, foundlevel), buildentry(1, dataoffset)); @@ -899,11 +855,11 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, node_offset olddataoffset = entryoffset(get_entry_in_node(lastnode, (unsigned char) kb)); unsigned char *olddatakey = readdatakey(state, olddataoffset); if (olddatakey == NULL) { - free_nodelist(&nodes); + utarray_free(nodes); return -1; } if (memcmp(olddatakey, key, keylen) == 0) { - free_nodelist(&nodes); + utarray_free(nodes); free(olddatakey); return 0; } @@ -943,12 +899,7 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, level--; while (level >= 0) { - if (level >= (int) nodes.len) { - fprintf(stderr, "tried to read after end of allocated list\n"); - free_nodelist(&nodes); - return 0; - } - node_object node = nodes.nodes[level]; + node_object node = *(node_object *)utarray_eltptr(nodes, level); overwriteentry(&node, keybits(key, (unsigned int) level), NODE_ENTRY_DIRTY_NODE); ps_string cachekey; keypart(key, (unsigned int) level, &cachekey); @@ -956,7 +907,7 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, level--; } - free_nodelist(&nodes); + utarray_free(nodes); return 1; } -- cgit v1.1