From 110a39cd613b83cc9df27645e6472785c238bcbc Mon Sep 17 00:00:00 2001 From: Magnus Ahltorp Date: Wed, 17 Feb 2016 14:22:57 +0100 Subject: keypart no longer allocates memory --- c_src/permdb.c | 54 ++++++++++++++++++++++++++---------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) (limited to 'c_src/permdb.c') diff --git a/c_src/permdb.c b/c_src/permdb.c index 5b25abb..5ebdbe4 100644 --- a/c_src/permdb.c +++ b/c_src/permdb.c @@ -444,20 +444,18 @@ keybits(const unsigned char *key, unsigned int level) return (b >> (6-(level*2) % 8)) & 0x3; } -static char * -keypart(const unsigned char *key, unsigned int level) -{ - unsigned char *result = malloc(level+1); +#define KEYPART_MAX (keylen*4+1) +static void +keypart(const unsigned char *key, unsigned int level, char *s) +{ unsigned int i; for (i = 0; i < level; i++) { unsigned char b = keybits(key, i); - result[i] = b + (unsigned char) '0'; + s[i] = b + (unsigned char) '0'; } - result[level] = 0; - - return (char *)result; + s[level] = 0; } static void @@ -635,14 +633,14 @@ getpath(permdb_object *state, const unsigned char *key, struct nodelist *nodes) return (char) kb; } level++; - char *kp = keypart(key, level); + char kp[KEYPART_MAX]; + keypart(key, level, kp); node = readnode(state, entryoffset(entry), kp); if (iserrornode(node)) { free(kp); dprintf(READ, (stderr, "getpath: not found\n")); return -1; } - free(kp); } } @@ -670,9 +668,9 @@ getpathlastnode(permdb_object *state, const unsigned char *key) break; } level++; - char *kp = keypart(key, level); + char kp[KEYPART_MAX]; + keypart(key, level, kp); node = readnode(state, entryoffset(entry), kp); - free(kp); } node_entry entry = get_entry_in_node(node, kb); @@ -826,17 +824,17 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, addentry(&leafnode, keybits(olddatakey, level), buildentry(1, olddataoffset)); free(olddatakey); { - char *cachekey = keypart(key, level); + char cachekey[KEYPART_MAX]; + keypart(key, level, cachekey); put_node_in_dirtynodes(state, cachekey, leafnode); - free(cachekey); } level--; while (level > foundlevel) { node_object node = nullnode; addentry(&node, keybits(key, level), NODE_ENTRY_DIRTY_NODE); - char *cachekey = keypart(key, level); + char cachekey[KEYPART_MAX]; + keypart(key, level, cachekey); put_node_in_dirtynodes(state, cachekey, node); - free(cachekey); level--; } overwriteentry(&lastnode, keybits(key, foundlevel), NODE_ENTRY_DIRTY_NODE); @@ -845,9 +843,9 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, int level = (int) foundlevel; { - char *cachekey = keypart(key, (unsigned int) level); + char cachekey[KEYPART_MAX]; + keypart(key, (unsigned int) level, cachekey); put_node_in_dirtynodes(state, cachekey, lastnode); - free(cachekey); } level--; @@ -859,9 +857,9 @@ addindex(permdb_object *state, const unsigned char *key, unsigned int keylength, } node_object node = nodes.nodes[level]; overwriteentry(&node, keybits(key, (unsigned int) level), NODE_ENTRY_DIRTY_NODE); - char *cachekey = keypart(key, (unsigned int) level); + char cachekey[KEYPART_MAX]; + keypart(key, (unsigned int) level, cachekey); put_node_in_dirtynodes(state, cachekey, node); - free(cachekey); level--; } @@ -917,17 +915,17 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, addentry(&leafnode, keybits(olddatakey, level), buildentry(1, olddataoffset)); free(olddatakey); { - char *cachekey = keypart(key, level); + char cachekey[KEYPART_MAX]; + keypart(key, level, cachekey); put_node_in_dirtynodes(state, cachekey, leafnode); - free(cachekey); } level--; while (level > foundlevel) { node_object node = nullnode; addentry(&node, keybits(key, level), NODE_ENTRY_DIRTY_NODE); - char *cachekey = keypart(key, level); + char cachekey[KEYPART_MAX]; + keypart(key, level, cachekey); put_node_in_dirtynodes(state, cachekey, node); - free(cachekey); level--; } overwriteentry(&lastnode, keybits(key, foundlevel), NODE_ENTRY_DIRTY_NODE); @@ -936,9 +934,9 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, int level = (int) foundlevel; { - char *cachekey = keypart(key, (unsigned int) level); + char cachekey[KEYPART_MAX]; + keypart(key, (unsigned int) level, cachekey); put_node_in_dirtynodes(state, cachekey, lastnode); - free(cachekey); } level--; @@ -950,9 +948,9 @@ addvalue(permdb_object *state, const unsigned char *key, unsigned int keylength, } node_object node = nodes.nodes[level]; overwriteentry(&node, keybits(key, (unsigned int) level), NODE_ENTRY_DIRTY_NODE); - char *cachekey = keypart(key, (unsigned int) level); + char cachekey[KEYPART_MAX]; + keypart(key, (unsigned int) level, cachekey); put_node_in_dirtynodes(state, cachekey, node); - free(cachekey); level--; } -- cgit v1.1