summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbpc2003 <wpesfriendnva@gmail.com>2025-04-24 10:18:03 -0400
committerbpc2003 <wpesfriendnva@gmail.com>2025-04-24 10:18:03 -0400
commit5b0d930e9e2605add559a70591573ffaa2fd8404 (patch)
tree6d227666ae79a2100410e881aafc07c04d329655
parent49a24bf62efc8d46e813d769dac2c36c413c21e8 (diff)
Implemented Isolation int setkeys and getkeys
-rw-r--r--src/lib/delkeys.c2
-rw-r--r--src/lib/getkeys.c17
-rw-r--r--src/lib/mdb.h2
-rw-r--r--src/lib/setkeys.c60
-rw-r--r--src/lib/utils.c7
-rw-r--r--src/lib/utils.h3
6 files changed, 48 insertions, 43 deletions
diff --git a/src/lib/delkeys.c b/src/lib/delkeys.c
index 36a5174..a828e8d 100644
--- a/src/lib/delkeys.c
+++ b/src/lib/delkeys.c
@@ -22,7 +22,7 @@ struct params {
int delkeys(tablist_t *list, int id, char **keys, int len)
{
mtx_t mtx;
- if (id < -1 || len < 0)
+ if (id >= list[0].len || id < -1 || len < 0)
return -1;
if (mtx_init(&mtx, mtx_plain) != thrd_success)
return -2;
diff --git a/src/lib/getkeys.c b/src/lib/getkeys.c
index cdba202..ab1cb2f 100644
--- a/src/lib/getkeys.c
+++ b/src/lib/getkeys.c
@@ -11,6 +11,7 @@ static tabidx_t getkey(tablist_t *list, int id, char *key);
static int getkeys_helper(void *data);
struct params {
+ mtx_t *mtx;
tablist_t *list;
tablist_t *ret;
char **keys;
@@ -19,12 +20,11 @@ struct params {
int pid;
};
-static struct params *pass(tablist_t *list, tablist_t *ret, char **keys, int len, int lid, int pid);
-
-mtx_t mtx;
+static struct params *pass(mtx_t *mtx, tablist_t *list, tablist_t *ret, char **keys, int len, int lid, int pid);
tablist_t *getkeys(tablist_t *list, int id, char **keys, int klen)
{
+ mtx_t mtx;
if (id >= list[0].len || id < -1 || mtx_init(&mtx, mtx_plain) != thrd_success)
return NULL;
int rc = 0;
@@ -32,11 +32,11 @@ tablist_t *getkeys(tablist_t *list, int id, char **keys, int klen)
tablist_t *indexes = calloc(len, sizeof(tablist_t));
indexes[0].len = len;
if (id >= 0)
- rc = getkeys_helper(pass(list, indexes, keys, klen, id, 0));
+ rc = getkeys_helper(pass(&mtx, list, indexes, keys, klen, id, 0));
else {
thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t));
for (int i = 0; i < list[0].len; ++i)
- thrd_create(&thrds[i], getkeys_helper, pass(list, indexes, keys, klen, i, i));
+ thrd_create(&thrds[i], getkeys_helper, pass(&mtx, list, indexes, keys, klen, i, i));
for (int i = 0; i < list[0].len; ++i) {
if (rc)
thrd_join(thrds[i], NULL);
@@ -60,7 +60,7 @@ static int getkeys_helper(void *data)
struct params *p = (struct params *) data;
int rc = 0;
- mtx_lock(&mtx);
+ mtx_lock(p->mtx);
if (p->keys == NULL) {
for (int i = 0, j = 0; i < TABLEN; ++i)
if (p->list[p->lid].tab[i].flag)
@@ -74,14 +74,15 @@ static int getkeys_helper(void *data)
p->ret[p->pid].tab[j++] = idx;
}
}
- mtx_unlock(&mtx);
+ mtx_unlock(p->mtx);
free(p);
return rc;
}
-static struct params *pass(tablist_t *list, tablist_t *ret, char **keys, int len, int lid, int pid)
+static struct params *pass(mtx_t *mtx, tablist_t *list, tablist_t *ret, char **keys, int len, int lid, int pid)
{
struct params *p = calloc(1, sizeof(struct params));
+ p->mtx = mtx;
p->list = list;
p->ret = ret;
p->keys = keys;
diff --git a/src/lib/mdb.h b/src/lib/mdb.h
index 96a0e3e..cb0502d 100644
--- a/src/lib/mdb.h
+++ b/src/lib/mdb.h
@@ -1,8 +1,6 @@
#ifndef MDB_H
#define MDB_H
-// TODO: implement isolation in setkeys and getkeys.
-
#define TABLEN 1024
typedef struct {
diff --git a/src/lib/setkeys.c b/src/lib/setkeys.c
index 7e9ef09..f52ab48 100644
--- a/src/lib/setkeys.c
+++ b/src/lib/setkeys.c
@@ -10,27 +10,33 @@ static int setkey_helper(void *thr_data);
static int setkey(tablist_t **, int, char *);
static char **getkv(char *pair);
-tablist_t *setkey_copy;
-char *setkey_str;
+struct params {
+ mtx_t *mtx;
+ tablist_t **copy;
+ char *pair;
+ int id;
+};
+
+static struct params *pass(mtx_t *mtx, tablist_t **copy, char *pair, int id);
-mtx_t setkey_mtx;
int setkeys(tablist_t **list, int id, char **pairs, int len)
{
+ mtx_t mtx;
if (id < -1 || pairs == NULL || len <= 0)
return -1;
- if (mtx_init(&setkey_mtx, mtx_plain) != thrd_success)
+ if (mtx_init(&mtx, mtx_plain) != thrd_success)
return -2;
int rc = 0;
- setkey_copy = calloc((*list)[0].len, sizeof(tablist_t));
- copytab(setkey_copy, *list);
+ tablist_t *copy = calloc((*list)[0].len, sizeof(tablist_t));
+ copytab(copy, *list);
for (int i = 0; i < len; ++i) {
- setkey_str = pairs[i];
+ char *pair = pairs[i];
if (id == -1) {
thrd_t *thrds = calloc((*list)[0].len, sizeof(thrd_t));
- 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) {
+ for (int i = 0; i < copy[0].len; ++i)
+ thrd_create(&thrds[i], setkey_helper, pass(&mtx, &copy, pair, i));
+ for (int i = 0; i < copy[0].len; ++i) {
if (rc)
thrd_join(thrds[i], NULL);
else
@@ -39,31 +45,31 @@ int setkeys(tablist_t **list, int id, char **pairs, int len)
free(thrds);
}
else
- rc = setkey_helper(clone(id));
+ rc = setkey_helper(pass(&mtx, &copy, pair, id));
}
if (!rc) {
- if (setkey_copy[0].len > (*list)[0].len)
- *list = realloc(*list, setkey_copy[0].len * sizeof(tablist_t));
+ if (copy[0].len > (*list)[0].len)
+ *list = realloc(*list, copy[0].len * sizeof(tablist_t));
dellist(*list);
- copytab(*list, setkey_copy);
+ copytab(*list, copy);
}
- mtx_destroy(&setkey_mtx);
- dellist(setkey_copy);
- free(setkey_copy);
+ mtx_destroy(&mtx);
+ dellist(copy);
+ free(copy);
return rc;
}
static int setkey_helper(void *thr_data)
{
int rc;
- int *id = (int *) thr_data;
+ struct params *p = (struct params *) thr_data;
- mtx_lock(&setkey_mtx);
- rc = setkey(&setkey_copy, *id, setkey_str);
- mtx_unlock(&setkey_mtx);
+ mtx_lock(p->mtx);
+ rc = setkey(p->copy, p->id, p->pair);
+ mtx_unlock(p->mtx);
- free(id);
+ free(p);
return rc;
}
@@ -130,3 +136,13 @@ static char **getkv(char *pair)
strcpy(kv[1], pair + i + 1);
return kv;
}
+
+static struct params *pass(mtx_t *mtx, tablist_t **copy, char *pair, int id)
+{
+ struct params *p = calloc(1, sizeof(struct params));
+ p->mtx = mtx;
+ p->copy = copy;
+ p->pair = pair;
+ p->id = id;
+ return p;
+}
diff --git a/src/lib/utils.c b/src/lib/utils.c
index 9961c11..909c123 100644
--- a/src/lib/utils.c
+++ b/src/lib/utils.c
@@ -23,13 +23,6 @@ int hash(char *key)
return h % TABLEN;
}
-int *clone(int n)
-{
- int *c = calloc(1, sizeof(int));
- *c = n;
- return c;
-}
-
tablist_t *copytab(tablist_t *dst, tablist_t *src)
{
if (dst == NULL)
diff --git a/src/lib/utils.h b/src/lib/utils.h
index 64e2787..99a8efa 100644
--- a/src/lib/utils.h
+++ b/src/lib/utils.h
@@ -10,9 +10,6 @@ void dellist(tablist_t *list);
* and returns that mod TABLEN */
int hash(char *str);
-// clone: clones and returns a pointer to int
-int *clone(int n);
-
// copytab: copys table src into table dst
tablist_t *copytab(tablist_t *dst, tablist_t *src);