From bc22bfc0618b14b0498ead1820c7e6bc42b4c589 Mon Sep 17 00:00:00 2001 From: onefang Date: Fri, 6 Aug 2021 05:59:11 +1000 Subject: Clean up some leakage, and remove an extra level of sim data storage. --- src/sledjchisl/sledjchisl.c | 65 ++++++++++++++------------------------------- 1 file changed, 20 insertions(+), 45 deletions(-) diff --git a/src/sledjchisl/sledjchisl.c b/src/sledjchisl/sledjchisl.c index 62eb928..5d85669 100644 --- a/src/sledjchisl/sledjchisl.c +++ b/src/sledjchisl/sledjchisl.c @@ -1204,9 +1204,7 @@ simList *getSims() struct dirtree *new = dirtree_add_node(0, path, 0); int i, j; - ourSims = xmalloc(sizeof(simList)); - memset(ourSims, 0, sizeof(simList)); - + ourSims = xzalloc(sizeof(simList)); ourSims->byTab = qtreetbl(0); new->extra = (long) ourSims; dirtree_handle_callback(new, filterSims); @@ -1256,7 +1254,6 @@ simList *getSims() d("Reading .ini file %s", path); ini = qconfig_parse_file(NULL, path, '='); -ini->putstr(ini, "INI FILE", name); /* [Region] Location = "1,1" @@ -1266,15 +1263,14 @@ ini->putstr(ini, "INI FILE", name); [Network] http_listener_port = 9007 */ - simd->name = qstrunchar(ini->getstr(ini, "Region.RegionName", false), '"', '"'); - simd->UUID = qstrunchar(ini->getstr(ini, "Region.RegionUUID", false), '"', '"'); - simd->regionType = qstrunchar(ini->getstr(ini, "Region.RegionType", false), '"', '"'); + simd->name = qstrunchar(ini->getstr(ini, "Region.RegionName", true), '"', '"'); + simd->UUID = qstrunchar(ini->getstr(ini, "Region.RegionUUID", true), '"', '"'); + simd->regionType = qstrunchar(ini->getstr(ini, "Region.RegionType", true), '"', '"'); simd->sizeX = getIntFromIni(ini, "Region.SizeX"); simd->sizeY = getIntFromIni(ini, "Region.SizeY"); simd->sizeZ = getIntFromIni(ini, "Region.SizeZ"); simd->tab = name; - ini->put(ini, "SIM DATA", simd, sizeof(simData)); - ourSims->byTab->put(ourSims->byTab, name, ini, sizeof(qlisttbl_t)); + ourSims->byTab->put(ourSims->byTab, name, simd, sizeof(simData)); if ((!qfile_exist(newPath))) { @@ -1310,7 +1306,7 @@ ini->putstr(ini, "INI FILE", name); } free(cmd); } - free(ini); + ini->free(ini); free(newPath); free(path); } @@ -1358,10 +1354,8 @@ void freeSimList(simList *sims) { char *name = qmemdup(obj.name, obj.namesize); // keep the name size_t namesize = obj.namesize; // for removal argument - qlisttbl_t *ini = (qlisttbl_t *) obj.data; - if (NULL != ini) { - simData *simd = ini->get(ini, "SIM DATA", NULL, false); + simData *simd = (simData *) obj.data; if (NULL != simd) { @@ -1372,16 +1366,8 @@ void freeSimList(simList *sims) free(simd->estate); free(simd->owner); free(simd->paneID); - free(simd); } -// TODO - this leaks memory, but it's a bug in qLibc. Send the bug fix upstream. -// It either leaks, or frees twice. Pffft -// ini->clear(ini); -// ini->free(ini); -// free(ini); - ; } - sims->byTab->remove_by_obj(sims->byTab, obj.name, obj.namesize); // remove obj = sims->byTab->find_nearest(sims->byTab, name, namesize, false); // rewind one step back free(name); // clean up @@ -7859,14 +7845,12 @@ fcgiDone: if ((strcmp("number", obj1.name) != 0) && (strcmp("panes", obj1.name) != 0) && (strcmp("type", obj1.name) != 0)) { - char *sim = q1->v.s; - qlisttbl_t *ini = ourSims->byTab->get(ourSims->byTab, sim, NULL, false); + simData *simd = ourSims->byTab->get(ourSims->byTab, q1->v.s, NULL, false); - if (NULL == ini) - E("Sim %s not found in ini list!", sim); + if (NULL == simd) + E("Sim %s not found in ini list!", q1->v.s); else { - simData *simd = ini->get(ini, "SIM DATA", NULL, false); char *path = xmprintf("%s/%s.shini", scEtc, simd->tab); char *newPath = xmprintf("%s/sim%d/%s.ini", scTemp, count, simd->tab); // Coz OpenSim. char *cmd; @@ -7999,15 +7983,12 @@ fcgiDone: if ((strcmp("number", obj1.name) != 0) && (strcmp("panes", obj1.name) != 0) && (strcmp("type", obj1.name) != 0)) { - char *sim = q1->v.s; - qlisttbl_t *ini = ourSims->byTab->get(ourSims->byTab, sim, NULL, false); + simData *simd = ourSims->byTab->get(ourSims->byTab, q1->v.s, NULL, false); - if (NULL == ini) - E("Sim %s not found in ini list!", sim); + if (NULL == simd) + E("Sim %s not found in ini list!", q1->v.s); else { - simData *simd = ini->get(ini, "SIM DATA", NULL, false); - simd->window = window; simd->pane = pane; @@ -8074,15 +8055,12 @@ fcgiDone: if ((strcmp("number", obj1.name) != 0) && (strcmp("panes", obj1.name) != 0) && (strcmp("type", obj1.name) != 0)) { - char *sim = q1->v.s; - qlisttbl_t *ini = ourSims->byTab->get(ourSims->byTab, sim, NULL, false); + simData *simd = ourSims->byTab->get(ourSims->byTab, q1->v.s, NULL, false); - if (NULL == ini) - E("Sim %s not found in ini list!", sim); + if (NULL == simd) + E("Sim %s not found in ini list!", 5); else { - simData *simd = ini->get(ini, "SIM DATA", NULL, false); - // Check if only doing a single sim. int cont = FALSE; if (NULL != target) @@ -8091,7 +8069,7 @@ fcgiDone: snprintf(toybuf, sizeof(toybuf), "%s.shini", simd->tab); if ( - (strcmp(target, sim) == 0) || + (strcmp(target, q1->v.s) == 0) || (strcmp(target, simd->name) == 0) || (strcmp(target, simd->tab) == 0) || (strcmp(target, toybuf) == 0) @@ -8278,15 +8256,12 @@ fcgiDone: if ((strcmp("number", obj1.name) != 0) && (strcmp("panes", obj1.name) != 0) && (strcmp("type", obj1.name) != 0)) { - char *sim = q1->v.s; - qlisttbl_t *ini = ourSims->byTab->get(ourSims->byTab, sim, NULL, false); + simData *simd = ourSims->byTab->get(ourSims->byTab, q1->v.s, NULL, false); - if (NULL == ini) - E("Sim %s not found in ini list!", sim); + if (NULL == simd) + E("Sim %s not found in ini list!", q1->v.s); else { - simData *simd = ini->get(ini, "SIM DATA", NULL, false); - // NOTE - these sleeps are guesses, seems to work on my super desktop during testing. while (checkSimIsRunning(simd->tab)) usleep(100000); -- cgit v1.1