diff options
author | bpc2003 <wpesfriendnva@gmail.com> | 2025-04-24 10:18:03 -0400 |
---|---|---|
committer | bpc2003 <wpesfriendnva@gmail.com> | 2025-04-24 10:18:03 -0400 |
commit | 5b0d930e9e2605add559a70591573ffaa2fd8404 (patch) | |
tree | 6d227666ae79a2100410e881aafc07c04d329655 | |
parent | 49a24bf62efc8d46e813d769dac2c36c413c21e8 (diff) |
Implemented Isolation int setkeys and getkeys
-rw-r--r-- | src/lib/delkeys.c | 2 | ||||
-rw-r--r-- | src/lib/getkeys.c | 17 | ||||
-rw-r--r-- | src/lib/mdb.h | 2 | ||||
-rw-r--r-- | src/lib/setkeys.c | 60 | ||||
-rw-r--r-- | src/lib/utils.c | 7 | ||||
-rw-r--r-- | src/lib/utils.h | 3 |
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, ©, 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, ©, 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); |