From 159db83c621c8e2443dd70d138f16ff2668c2185 Mon Sep 17 00:00:00 2001 From: mmichalek Date: Fri, 13 Nov 2015 16:26:18 -0500 Subject: [PATCH 1/2] Memory cleanups. --- symmetric-client-clib/inc/db/sqlite/SqliteSqlTemplate.h | 1 - .../src/db/platform/sqlite/SqlitePlatform.c | 6 +++--- .../src/db/platform/sqlite/SqliteSqlTemplate.c | 2 +- symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c | 2 ++ 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/symmetric-client-clib/inc/db/sqlite/SqliteSqlTemplate.h b/symmetric-client-clib/inc/db/sqlite/SqliteSqlTemplate.h index 0f25616b65..aa0ef0b634 100644 --- a/symmetric-client-clib/inc/db/sqlite/SqliteSqlTemplate.h +++ b/symmetric-client-clib/inc/db/sqlite/SqliteSqlTemplate.h @@ -33,7 +33,6 @@ typedef struct SymSqliteSqlTemplate { SymSqlTemplate super; sqlite3 *db; - void (*destroy)(struct SymSqliteSqlTemplate *this); } SymSqliteSqlTemplate; SymSqliteSqlTemplate * SymSqliteSqlTemplate_new(SymSqliteSqlTemplate *this, sqlite3 *db); diff --git a/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c b/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c index bd0ee1b3ef..7ac3b4e8d1 100644 --- a/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c +++ b/symmetric-client-clib/src/db/platform/sqlite/SqlitePlatform.c @@ -48,11 +48,11 @@ SymSqliteSqlTemplate * SymSqlitePlatform_getSqlTemplate(SymSqlitePlatform *this) void SymSqlitePlatform_destroy(SymDatabasePlatform *super) { SymLog_info("Closing SQLite database"); -// SymSqlitePlatform *this = (SymSqlitePlatform *) super; + SymSqlitePlatform *this = (SymSqlitePlatform *) super; // sqlite3_close(this->db); -// this->sqlTemplate->destroy(this->sqlTemplate); + this->sqlTemplate->destroy(this->sqlTemplate); // free(super->ddlReader); -// free(super); + free(this); } SymSqlitePlatform * SymSqlitePlatform_new(SymSqlitePlatform *this, SymProperties *properties) { diff --git a/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c b/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c index 94d8edcdd7..a5d80fae7d 100644 --- a/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c +++ b/symmetric-client-clib/src/db/platform/sqlite/SqliteSqlTemplate.c @@ -207,6 +207,6 @@ SymSqliteSqlTemplate * SymSqliteSqlTemplate_new(SymSqliteSqlTemplate *this, sqli super->queryWithUserData = (void *) &SymSqliteSqlTemplate_queryWithUserData; super->update = (void *) &SymSqliteSqlTemplate_update; super->startSqlTransaction = (void *) &SymSqliteSqlTemplate_startSqlTransaction; - this->destroy = (void *) &SymSqliteSqlTemplate_destroy; + super->destroy = (void *) &SymSqliteSqlTemplate_destroy; return this; } diff --git a/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c b/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c index 509cc3cb5c..7ba535c7aa 100644 --- a/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c +++ b/symmetric-client-clib/src/io/writer/DefaultDatabaseWriter.c @@ -280,6 +280,8 @@ void SymDefaultDatabaseWriter_endBatch(SymDefaultDatabaseWriter *this, SymBatch void SymDefaultDatabaseWriter_close(SymDefaultDatabaseWriter *this) { this->sqlTransaction->close(this->sqlTransaction); + this->sqlTransaction->destroy(this->sqlTransaction); + this->sqlTransaction = NULL; } void SymDefaultDatabaseWriter_destroy(SymDefaultDatabaseWriter *this) { From 42ecf2a14cccc85fd540d614bda3788ba95423ff Mon Sep 17 00:00:00 2001 From: mmichalek Date: Fri, 13 Nov 2015 17:31:10 -0500 Subject: [PATCH 2/2] Memory cleanups. --- symmetric-client-clib/src/core/JobManager.c | 11 ++- .../src/model/TriggerHistory.c | 17 ++++ .../src/service/TriggerRouterService.c | 86 ++++++++++--------- 3 files changed, 69 insertions(+), 45 deletions(-) diff --git a/symmetric-client-clib/src/core/JobManager.c b/symmetric-client-clib/src/core/JobManager.c index 1c796e95f5..f2ef1d788e 100644 --- a/symmetric-client-clib/src/core/JobManager.c +++ b/symmetric-client-clib/src/core/JobManager.c @@ -42,7 +42,6 @@ unsigned short SymJobManager_shouldRun(SymJobManager *this, char* startJobProper void SymJobManager_invoke(SymJobManager *this) { if (SymJobManager_shouldRun(this, SYM_PARAMETER_START_SYNCTRIGGERS_JOB, SYM_PARAMETER_SYNCTRIGGERS_PERIOD_MS, this->lastSyncTriggersTime)) { - SymLog_info("SYNC TRIGGERS ============================)"); this->engine->syncTriggers(this->engine); time(&this->lastSyncTriggersTime); @@ -64,11 +63,13 @@ void SymJobManager_invoke(SymJobManager *this) { } } time(&this->lastPushTime); + pushStatus->destroy(pushStatus); } if (SymJobManager_shouldRun(this, SYM_PARAMETER_START_PULL_JOB, SYM_PARAMETER_PULL_PERIOD_MS, this->lastPullTime)) { SymLog_info("PULL ============================)"); - this->engine->pull(this->engine); + SymRemoteNodeStatuses *statuses = this->engine->pull(this->engine); time(&this->lastPullTime); + statuses->destroy(statuses); } if (SymJobManager_shouldRun(this, SYM_PARAMETER_START_PURGE_JOB, SYM_PARAMETER_PURGE_PERIOD_MS, this->lastPurgeTime)) { SymLog_info("PURGE ============================)"); @@ -77,13 +78,15 @@ void SymJobManager_invoke(SymJobManager *this) { } if (SymJobManager_shouldRun(this, SYM_PARAMETER_START_OFFLINE_PUSH_JOB, SYM_PARAMETER_OFFLINE_PUSH_PERIOD_MS, this->lastOfflinePushTime)) { SymLog_info("OFFLINE PUSH ============================)"); - this->engine->offlinePushService->pushData(this->engine->offlinePushService); + SymRemoteNodeStatuses *statuses = this->engine->offlinePushService->pushData(this->engine->offlinePushService); time(&this->lastOfflinePushTime); + statuses->destroy(statuses); } if (SymJobManager_shouldRun(this, SYM_PARAMETER_START_OFFLINE_PULL_JOB, SYM_PARAMETER_OFFLINE_PULL_PERIOD_MS, this->lastOfflinePullTime)) { SymLog_info("OFFLINE PULL ============================)"); - this->engine->offlinePullService->pullData(this->engine->offlinePullService); + SymRemoteNodeStatuses *statuses = this->engine->offlinePullService->pullData(this->engine->offlinePullService); time(&this->lastOfflinePullTime); + statuses->destroy(statuses); } } diff --git a/symmetric-client-clib/src/model/TriggerHistory.c b/symmetric-client-clib/src/model/TriggerHistory.c index e82054e36e..358b4a4a67 100644 --- a/symmetric-client-clib/src/model/TriggerHistory.c +++ b/symmetric-client-clib/src/model/TriggerHistory.c @@ -62,6 +62,23 @@ char * SymTriggerHistory_getTriggerNameForDmlType(SymTriggerHistory *this, SymDa } void SymTriggerHistory_destroy(SymTriggerHistory *this) { + if (this->nameForInsertTrigger) { + free(this->nameForInsertTrigger); + } + if (this->nameForUpdateTrigger) { + free(this->nameForUpdateTrigger); + } + if (this->nameForDeleteTrigger) { + free(this->nameForDeleteTrigger); + } + if (this->columnNames) { + free(this->columnNames); + this->columnNames = NULL; + } + if (this->pkColumnNames) { + free(this->pkColumnNames); + this->pkColumnNames = NULL; + } if (this->createTime) { this->createTime->destroy(this->createTime); } diff --git a/symmetric-client-clib/src/service/TriggerRouterService.c b/symmetric-client-clib/src/service/TriggerRouterService.c index 2528ec7458..d84e2febda 100644 --- a/symmetric-client-clib/src/service/TriggerRouterService.c +++ b/symmetric-client-clib/src/service/TriggerRouterService.c @@ -212,6 +212,10 @@ SymList * SymTriggerRouterService_getActiveTriggerHistories(SymTriggerRouterServ SymList *histories = sqlTemplate->query(sqlTemplate, sb->str, NULL, NULL, &error, (void *) SymTriggerRouterService_triggerHistoryMapper); sb->destroy(sb); + if (this->historyMap->size > 0) { + this->historyMap->resetAll(this->historyMap, (void *)SymTriggerHistory_destroy); + } + SymIterator *iter = histories->iterator(histories); while (iter->hasNext(iter)) { SymTriggerHistory *triggerHistory = (SymTriggerHistory *) iter->next(iter); @@ -516,46 +520,46 @@ void SymTriggerRouterService_destroyTriggerRouters(SymTriggerRouterService *this // freedRouters and Triggers because there are multiple pointers to the same // memory location within these objects and we can't free the same pointer // twice. -// SymList *freedRouters = SymList_new(NULL); -// SymList *freedTriggers = SymList_new(NULL); -// -// int i; -// for (i = 0; i < triggerRouters->size; i++) { -// SymTriggerRouter *triggerRouter = triggerRouters->get(triggerRouters, i); -// unsigned short shouldFreeRouter = 1; -// int j =0; -// for (j =0; j < freedRouters->size; j++) { -// if (freedRouters->get(freedRouters, j) == triggerRouter->router) { -// shouldFreeRouter = 0; -// break; //already freed. -// } -// } -// -// if (shouldFreeRouter && triggerRouter->router) { -// free(triggerRouter->router->routerId); -// triggerRouter->router->destroy(triggerRouter->router); -// freedRouters->add(freedRouters, triggerRouter->router); -// triggerRouter->router = NULL; -// } -// unsigned short shouldFreeTrigger = 1; -// -// for (j =0; j < freedTriggers->size; j++) { -// if (freedTriggers->get(freedTriggers, j) == triggerRouter->trigger) { -// shouldFreeTrigger = 0; -// break; //already freed. -// } -// } -// -// if (shouldFreeTrigger && triggerRouter->trigger) { -// triggerRouter->trigger->destroy(triggerRouter->trigger); -// freedTriggers->add(freedRouters, triggerRouter->trigger); -// triggerRouter->trigger = NULL; -// } -// } -// -// triggerRouters->destroyAll(triggerRouters, (void *)SymTriggerRouter_destroy); -// freedRouters->destroy(freedRouters); -// freedTriggers->destroy(freedTriggers); + SymList *freedRouters = SymList_new(NULL); + SymList *freedTriggers = SymList_new(NULL); + + int i; + for (i = 0; i < triggerRouters->size; i++) { + SymTriggerRouter *triggerRouter = triggerRouters->get(triggerRouters, i); + unsigned short shouldFreeRouter = 1; + int j =0; + for (j =0; j < freedRouters->size; j++) { + if (freedRouters->get(freedRouters, j) == triggerRouter->router) { + shouldFreeRouter = 0; + break; //already freed. + } + } + + if (shouldFreeRouter && triggerRouter->router) { + free(triggerRouter->router->routerId); + triggerRouter->router->destroy(triggerRouter->router); + freedRouters->add(freedRouters, triggerRouter->router); + triggerRouter->router = NULL; + } + unsigned short shouldFreeTrigger = 1; + + for (j =0; j < freedTriggers->size; j++) { + if (freedTriggers->get(freedTriggers, j) == triggerRouter->trigger) { + shouldFreeTrigger = 0; + break; //already freed. + } + } + + if (shouldFreeTrigger && triggerRouter->trigger) { + triggerRouter->trigger->destroy(triggerRouter->trigger); + freedTriggers->add(freedRouters, triggerRouter->trigger); + triggerRouter->trigger = NULL; + } + } + + triggerRouters->destroyAll(triggerRouters, (void *)SymTriggerRouter_destroy); + freedRouters->destroy(freedRouters); + freedTriggers->destroy(freedTriggers); } SymList * SymTriggerRouterService_getTriggersToSync(SymTriggerRouterService *this) { @@ -929,7 +933,7 @@ void SymTriggerRouterService_syncTriggers(SymTriggerRouterService *this, unsigne symmetricTableTriggers->destroy(symmetricTableTriggers); // shallow destroy here because these objects are also in 'triggers'. triggers->destroyAll(triggers, (void *)SymTrigger_destroy); - // activeTriggerHistories is cached - don't destroy. + activeTriggerHistories->destroy(activeTriggerHistories); // shallow destroy, these trigger histories are used in the cache. } }