summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile4
-rw-r--r--src/lib/batch.c27
-rw-r--r--src/lib/mdb.h3
-rw-r--r--src/test.c17
4 files changed, 35 insertions, 16 deletions
diff --git a/Makefile b/Makefile
index 694bf6f..e039ed5 100644
--- a/Makefile
+++ b/Makefile
@@ -14,8 +14,8 @@ lib: $(BUILD)
test: dev_lib
$(CC) src/test.c $(D_FLAGS) -g $(C_FLAGS) -o $(BUILD)/test.out
- valgrind --leak-check=full ./$(BUILD)/test.out
- valgrind --tool=helgrind ./$(BUILD)/test.out
+ valgrind --leak-check=full ./$(BUILD)/test.out 2> dbg
+ valgrind --tool=helgrind ./$(BUILD)/test.out 2>> dbg
rm -rf $(BUILD)
dev: dev_lib
diff --git a/src/lib/batch.c b/src/lib/batch.c
index 91def77..b8b7629 100644
--- a/src/lib/batch.c
+++ b/src/lib/batch.c
@@ -2,7 +2,6 @@
#include <string.h>
#include <stdlib.h>
#include <threads.h>
-#include <stdatomic.h>
#include "mdb.h"
@@ -16,7 +15,7 @@ char *setkey_str;
mtx_t setkey_mtx;
int setkeys(tablist_t **list, char *pair)
{
- int rc;
+ int rc = 0;
setkey_copy = calloc(list[0]->len, sizeof(tablist_t));
memcpy(setkey_copy, *list, list[0]->len * sizeof(tablist_t));
setkey_str = pair;
@@ -28,9 +27,10 @@ int setkeys(tablist_t **list, char *pair)
for (int i = 0; i < setkey_copy[0].len; ++i)
thrd_create(&thrds[i], setkey_helper, clone(i));
for (int i = 0; i < setkey_copy[0].len; ++i) {
- thrd_join(thrds[i], &rc);
if (rc)
- break;
+ thrd_join(thrds[i], NULL);
+ else
+ thrd_join(thrds[i], &rc);
}
if (!rc)
memcpy(*list, setkey_copy, setkey_copy[0].len * sizeof(tablist_t));
@@ -45,7 +45,7 @@ char *delkey_str;
mtx_t delkey_mtx;
int delkeys(tablist_t *list, char *key)
{
- int rc;
+ int rc = 0;
delkey_copy = calloc(list[0].len, sizeof(tablist_t));
memcpy(delkey_copy, list, list[0].len * sizeof(tablist_t));
delkey_str = key;
@@ -57,9 +57,10 @@ int delkeys(tablist_t *list, char *key)
for (int i = 0; i < delkey_copy[0].len; ++i)
thrd_create(&thrds[i], delkey_helper, clone(i));
for (int i = 0; i < delkey_copy[0].len; ++i) {
- thrd_join(thrds[i], &rc);
if (rc)
- break;
+ thrd_join(thrds[i], NULL);
+ else
+ thrd_join(thrds[i], &rc);
}
if (!rc)
memcpy(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t));
@@ -70,27 +71,27 @@ int delkeys(tablist_t *list, char *key)
static int setkey_helper(void *thr_data)
{
- int *id = (int *) thr_data;
- int rc;
+ int rc = 0;
- mtx_lock(&setkey_mtx);
+ mtx_lock(&setkey_mtx);
+ int *id = (int *) thr_data;
rc = setkey(&setkey_copy, *id, setkey_str);
+ free(id);
mtx_unlock(&setkey_mtx);
- free(id);
return rc;
}
static int delkey_helper(void *thr_data)
{
- int *id = (int *) thr_data;
int rc;
mtx_lock(&delkey_mtx);
+ int *id = (int *) thr_data;
rc = delkey(delkey_copy, *id, delkey_str);
+ free(id);
mtx_unlock(&delkey_mtx);
- free(id);
return rc;
}
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index bd9c064..f1c6a1c 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -19,10 +19,11 @@ typedef struct {
} tablist_t;
// Table operations
-int *getkeys(tablist_t *list, int id);
tabidx_t getkey(tablist_t *list, int id, char *key);
int setkey(tablist_t **list, int id, char *pair);
int delkey(tablist_t *list, int id, char *key);
+
+int *getkeys(tablist_t *list, int id);
int setkeys(tablist_t **list, char *pair);
int delkeys(tablist_t *list, char *key);
diff --git a/src/test.c b/src/test.c
index dd96490..7f46105 100644
--- a/src/test.c
+++ b/src/test.c
@@ -51,10 +51,27 @@ void test_delkeys(void)
free(list);
}
+void test_delkeys_fail(void)
+{
+ tablist_t *list = readdb("dbs/test.db");
+ if (!delkeys(list, "Row_4"))
+ fprintf(stderr, "test_delkeys_fail: failed\n");
+ for (int i = 0; i < list[0].len; ++i) {
+ int *indexes = getkeys(list, i);
+ for (int j = 0; indexes[j]; ++j)
+ delkey(list, i, list[i].tab[indexes[j]].key);
+ free(indexes);
+ }
+ free(list);
+}
+
int main(void)
{
test_setkeys();
test_setkeys_fail();
+
test_delkeys();
+ test_delkeys_fail();
+
exit(0);
}