commit 4e13c1aba558091c403c94df05c70f21ea219d2c
parent 58cfc5b7bb192a8d188a8ec90d8a6f926eac9479
Author: hhvn <dev@hhvn.uk>
Date: Tue, 15 Nov 2022 17:20:52 +0000
Dynamically resize number of tracked groups in DB
Diffstat:
M | db/db.c | | | 58 | ++++++++++++++++++++++++++++++++++++++++++++++------------ |
M | db/db.h | | | 2 | -- |
2 files changed, 46 insertions(+), 14 deletions(-)
diff --git a/db/db.c b/db/db.c
@@ -16,7 +16,9 @@ typedef struct Pair Pair;
struct DB {
DB *prev;
char *dir;
- struct Group *tracked[MAXGROUPS];
+ struct Group **tracked;
+ size_t tl;
+ size_t ti;
DB *next;
};
@@ -102,7 +104,8 @@ dbdeclare(char *dir) {
if (!db) return -1;
db->dir = strdup(dir);
if (!db->dir) return -1;
- memset(db->tracked, 0, sizeof(db->tracked));
+ db->tracked = calloc(db->tl = 10, sizeof(struct Group *));
+ db->ti = 0;
if (!dbs) {
db->prev = db->next = NULL;
@@ -140,14 +143,45 @@ getdbfor(char *path) {
* Tracking loaded groups
*/
static int
+getnulltracked(DB *db) {
+ int ret = -1;
+ int ta, i;
+ void *r;
+
+ for (ta = i = 0; i < db->tl; i++) {
+ if (!db->tracked[i]) {
+ if (ret == -1)
+ ret = i;
+ else
+ ta++;
+ }
+ }
+
+ if ((db->ti == db->tl - 1 || ta < 5) && ta < 10) {
+ r = realloc(db->tracked, (db->tl + 10) * sizeof(struct Group *));
+ if (r) {
+ db->tl += 10;
+ db->tracked = r;
+ memset(db->tracked + db->tl - 10, 0, sizeof(struct Group *) * 10);
+ }
+ }
+
+ if (ret == -1) {
+ for (i = db->ti; i < db->tl; i++)
+ if (!db->tracked[i])
+ ret = i;
+ }
+
+ return ret;
+}
+
+static int
track(Group *group) {
int i;
if (!group) return -1;
- for (i = 0; i < MAXGROUPS; i++) {
- if (!group->db->tracked[i]) {
- group->db->tracked[i] = group;
- return 0;
- }
+ if ((i = getnulltracked(group->db))) {
+ group->db->tracked[i] = group;
+ return 0;
}
return -1;
}
@@ -156,7 +190,7 @@ static int
untrack(Group *group) {
int i;
if (!group) return -1;
- for (i = 0; i < MAXGROUPS; i++) {
+ for (i = 0; i < group->db->ti; i++) {
if (group->db->tracked[i] == group) {
group->db->tracked[i] = NULL;
return 0;
@@ -172,7 +206,7 @@ gettracked(char *dir, char *group) {
if (!(db = getdbfor(dir)))
return NULL;
- for (i = 0; i < MAXGROUPS; i++)
+ for (i = 0; i < db->ti; i++)
if (db->tracked[i] &&
strcmp(dir, db->tracked[i]->dir) == 0 &&
strcmp(group, db->tracked[i]->name) == 0)
@@ -678,7 +712,7 @@ dbwrite(char *db) {
return -1;
}
- for (i = 0, ret = 0; i < MAXGROUPS; i++)
+ for (i = 0, ret = 0; i < p->tl; i++)
if (p->tracked[i])
if (dbwritegroup_p(p->tracked[i]) == -1)
ret = -1;
@@ -696,7 +730,7 @@ dbfree(char *db) {
if (!(p = getdb(db)))
return;
- for (i = 0; i < MAXGROUPS; i++)
+ for (i = 0; i < p->tl; i++)
if (p->tracked[i])
dbfreegroup_p(p->tracked[i]);
if (p == dbs)
@@ -744,7 +778,7 @@ dbcleanup(void) {
prev = dbs;
if (prev) p = prev->next;
while (prev) {
- for (i = 0; i < MAXGROUPS; i++)
+ for (i = 0; i < prev->tl; i++)
if (prev->tracked[i])
dbfreegroup_p(prev->tracked[i]);
free(prev->dir);
diff --git a/db/db.h b/db/db.h
@@ -1,7 +1,5 @@
#include <stddef.h>
-#define MAXGROUPS 256 /* groups in a DB */
-
/* -----
* Declaration
*/