From 5b0d930e9e2605add559a70591573ffaa2fd8404 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Thu, 24 Apr 2025 10:18:03 -0400 Subject: Implemented Isolation int setkeys and getkeys --- src/lib/getkeys.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'src/lib/getkeys.c') 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; -- cgit v1.2.3