summaryrefslogtreecommitdiff
path: root/c_src/permdb.c
diff options
context:
space:
mode:
authorMagnus Ahltorp <map@kth.se>2016-02-17 14:22:57 +0100
committerLinus Nordberg <linus@nordu.net>2016-04-25 13:14:12 +0200
commit110a39cd613b83cc9df27645e6472785c238bcbc (patch)
tree4fea69ed36f66b8ea36fa3ff52d0afccde6a3da1 /c_src/permdb.c
parentaac8745abf3f72a13ccf7bc6cf305da637a61b12 (diff)
keypart no longer allocates memory
Diffstat (limited to 'c_src/permdb.c')
-rw-r--r--c_src/permdb.c54
1 files changed, 26 insertions, 28 deletions
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--;
}