summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-03-21 10:55:56 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-03-21 10:55:56 -0400
commita269ad1f5f09573830f2344297e289921a4f4f7a (patch)
treec77b810ac942bdccf45276b54cc41bca6239eb7a /src/lib
parentd1eb4277100d5ef08d6768d394660e89bf656250 (diff)
Made batch operations thread and memory safe
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/batch.c27
-rw-r--r--src/lib/mdb.h3
2 files changed, 16 insertions, 14 deletions
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);