cepheid

An Aurora 4X clone
Log | Files | Refs | README

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:
Mdb/db.c | 58++++++++++++++++++++++++++++++++++++++++++++++------------
Mdb/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 */