changeset 146:7278c9766e26

free old configs when last reference goes away
author carl
date Sun, 15 Oct 2006 17:21:07 -0700
parents 9b9bab1d3c21
children 812c80305f26
files src/context.cpp src/dnsbl.cpp
diffstat 2 files changed, 11 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/src/context.cpp	Sun Oct 15 12:41:46 2006 -0700
+++ b/src/context.cpp	Sun Oct 15 17:21:07 2006 -0700
@@ -395,6 +395,11 @@
 
 
 CONFIG::~CONFIG() {
+	if (debug_syslog) {
+		char buf[maxlen];
+		snprintf(buf, sizeof(buf), "freeing memory for old configuration generation %d", generation);
+		my_syslog(buf);
+	}
 	for (context_list::iterator i=contexts.begin(); i!=contexts.end(); i++) {
 		CONTEXT *c = *i;
 		delete c;
--- a/src/dnsbl.cpp	Sun Oct 15 12:41:46 2006 -0700
+++ b/src/dnsbl.cpp	Sun Oct 15 17:21:07 2006 -0700
@@ -261,7 +261,9 @@
 	return_fd();
 	pthread_mutex_lock(&config_mutex);
 		pc->reference_count--;
+		bool last = (!pc->reference_count) && (pc != config);
 	pthread_mutex_unlock(&config_mutex);
+	if (last) delete pc;  // free this config, since we were the last reference to it
 	reset(true);
 }
 
@@ -1160,15 +1162,13 @@
 
 ////////////////////////////////////////////////
 //	thread to watch the old config files for changes
-//	and reload when needed. we also cleanup old
-//	configs whose reference count has gone to zero.
+//	and reload when needed.
 //	we also clear the SMTP AUTH recipient counts hourly
 //
 void* config_loader(void *arg);
 void* config_loader(void *arg) {
 	int loop = 0;
 	typedef set<CONFIG *> configp_set;
-	configp_set old_configs;
 	while (loader_run) {
 		sleep(180);  // look for modifications every 3 minutes
 		if (!loader_run) break;
@@ -1198,10 +1198,11 @@
 			if (newc) {
 				// replace the global config pointer
 				pthread_mutex_lock(&config_mutex);
-					CONFIG *old = config;
+					CONFIG *pc = config;
+					bool last = pc && (!pc->reference_count);
 					config = newc;
 				pthread_mutex_unlock(&config_mutex);
-				if (old) old_configs.insert(old);
+				if (last) delete pc;  // there were no references to this config
 			}
 			else {
 				// failed to load new config
@@ -1211,20 +1212,6 @@
 				dc.load_time = time(NULL);
 			}
 		}
-		// now look for old configs with zero ref counts
-		for (configp_set::iterator i=old_configs.begin(); i!=old_configs.end(); ) {
-			CONFIG *old = *i;
-			if (!old->reference_count) {
-				if (debug_syslog) {
-					char buf[maxlen];
-					snprintf(buf, sizeof(buf), "freeing memory for old configuration generation %d", old->generation);
-					my_syslog(buf);
-				}
-				delete old; // destructor does all the work
-				old_configs.erase(i++);
-			}
-			else i++;
-		}
 	}
 	return NULL;
 }