From 49a24bf62efc8d46e813d769dac2c36c413c21e8 Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Wed, 23 Apr 2025 14:04:31 -0400 Subject: Implemented Isolation in delkeys --- README.md | 2 +- src/lib/delkeys.c | 59 +++++++++++++++++++++++++++++++++++-------------------- src/lib/mdb.h | 2 ++ 3 files changed, 41 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 3965481..8224360 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ Examples: There are six functions and two types in mdb.h #### Types: - tabidx_t: represents a single key-value pair in an object. -- tablist_t: represents a single object. +- tablist_t: represents a single document. #### Functions: - readdb: takes a filename and returns a tablist array\ if the file doesn't exist it will return an empty tablist array\ diff --git a/src/lib/delkeys.c b/src/lib/delkeys.c index b1ee83a..36a5174 100644 --- a/src/lib/delkeys.c +++ b/src/lib/delkeys.c @@ -7,30 +7,33 @@ static int delkey_helper(void *thr_data); static int delkey(tablist_t *, int, char *); +static struct params *pass(mtx_t *mtx, tablist_t *list, char **keys, int len, int id); -tablist_t *delkey_copy; -char **delkeys_keys; -int keys_len; -mtx_t delkey_mtx; +struct params { + mtx_t *mtx; + tablist_t *copy; + char **keys; + int len; + int id; +}; int delkeys(tablist_t *list, int id, char **keys, int len) { + mtx_t mtx; if (id < -1 || len < 0) return -1; - if (mtx_init(&delkey_mtx, mtx_plain) != thrd_success) + if (mtx_init(&mtx, mtx_plain) != thrd_success) return -2; int rc = 0; - delkey_copy = calloc(list[0].len, sizeof(tablist_t)); + tablist_t *delkey_copy = calloc(list[0].len, sizeof(tablist_t)); copytab(delkey_copy, list); - delkeys_keys = keys; - keys_len = len; if (id == -1) { thrd_t *thrds = calloc(list[0].len, sizeof(thrd_t)); for (int i = 0; i < delkey_copy[0].len; ++i) - thrd_create(&thrds[i], delkey_helper, clone(i)); + thrd_create(&thrds[i], delkey_helper, pass(&mtx, delkey_copy, keys, len, i)); for (int i = 0; i < delkey_copy[0].len; ++i) { if (rc) thrd_join(thrds[i], NULL); @@ -39,14 +42,14 @@ int delkeys(tablist_t *list, int id, char **keys, int len) } free(thrds); } else - rc = delkey_helper(clone(id)); + rc = delkey_helper(pass(&mtx, delkey_copy, keys, len, id)); if (!rc) { dellist(list); memmove(list, delkey_copy, delkey_copy[0].len * sizeof(tablist_t)); } else dellist(delkey_copy); - mtx_destroy(&delkey_mtx); + mtx_destroy(&mtx); free(delkey_copy); return rc; } @@ -54,24 +57,27 @@ int delkeys(tablist_t *list, int id, char **keys, int len) static int delkey_helper(void *thr_data) { int rc = 0; - int *id = (int *) thr_data; + struct params *p = (struct params *) thr_data; - mtx_lock(&delkey_mtx); - if (keys_len > 0 && delkeys_keys != NULL) - for (int i = 0; i < keys_len; ++i) { - if (delkeys_keys[i] == NULL) + mtx_lock(p->mtx); + if (p->len > 0 && p->keys != NULL) + for (int i = 0; i < p->len; ++i) { + if (p->keys[i] == NULL) { + mtx_unlock(p->mtx); + free(p); return -3; - rc = delkey(delkey_copy, *id, delkeys_keys[i]); + } + rc = delkey(p->copy, p->id, p->keys[i]); } else { - tablist_t *indexes = getkeys(delkey_copy, *id, NULL, 0); + tablist_t *indexes = getkeys(p->copy, p->id, NULL, 0); for (int i = 0; indexes[0].tab[i].flag; ++i) - rc = delkey(delkey_copy, *id, indexes[0].tab[i].key); + rc = delkey(p->copy, p->id, indexes[0].tab[i].key); free(indexes); } - mtx_unlock(&delkey_mtx); + mtx_unlock(p->mtx); - free(id); + free(p); return rc; } @@ -93,3 +99,14 @@ static int delkey(tablist_t *list, int id, char *key) list[id].tab[idx].flag = 0; return 0; } + +static struct params *pass(mtx_t *mtx, tablist_t *list, char **keys, int len, int id) +{ + struct params *p = calloc(1, sizeof(struct params)); + p->mtx = mtx; + p->copy = list; + p->keys = keys; + p->len = len; + p->id = id; + return p; +} diff --git a/src/lib/mdb.h b/src/lib/mdb.h index cb0502d..96a0e3e 100644 --- a/src/lib/mdb.h +++ b/src/lib/mdb.h @@ -1,6 +1,8 @@ #ifndef MDB_H #define MDB_H +// TODO: implement isolation in setkeys and getkeys. + #define TABLEN 1024 typedef struct { -- cgit v1.2.3