#ifdef atexit cleanups calling free as the OS should do this for us, but valgrind debuggers need it.
This commit is contained in:
		@@ -61,10 +61,12 @@ static RC_STRINGLIST *rc_conf = NULL;
 | 
			
		||||
 | 
			
		||||
extern char** environ;
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_MEMORY
 | 
			
		||||
static void _free_rc_conf(void)
 | 
			
		||||
{
 | 
			
		||||
	rc_stringlist_free(rc_conf);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
char *rc_conf_value(const char *setting)
 | 
			
		||||
{
 | 
			
		||||
@@ -74,7 +76,9 @@ char *rc_conf_value(const char *setting)
 | 
			
		||||
 | 
			
		||||
	if (! rc_conf) {
 | 
			
		||||
		rc_conf = rc_config_load(RC_CONF);
 | 
			
		||||
#ifdef DEBUG_MEMORY
 | 
			
		||||
		atexit(_free_rc_conf);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		/* Support old configs */
 | 
			
		||||
		if (exists(RC_CONF_OLD)) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								src/rc/rc.c
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								src/rc/rc.c
									
									
									
									
									
								
							@@ -137,8 +137,10 @@ static void clean_failed(void)
 | 
			
		||||
static void cleanup(void)
 | 
			
		||||
{
 | 
			
		||||
	if (applet && strcmp(applet, "rc") == 0) {
 | 
			
		||||
#ifdef DEBUG_MEMORY
 | 
			
		||||
		RC_PID *p1 = LIST_FIRST(&service_pids);
 | 
			
		||||
		RC_PID *p2;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		if (hook_out)
 | 
			
		||||
			rc_plugin_run(hook_out, runlevel);
 | 
			
		||||
@@ -150,6 +152,16 @@ static void cleanup(void)
 | 
			
		||||
			free(termios_orig);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/* Clean runlevel start, stop markers */
 | 
			
		||||
		if (! rc_in_plugin && ! rc_in_logger) {
 | 
			
		||||
			rmdir(RC_STARTING);
 | 
			
		||||
			rmdir(RC_STOPPING);
 | 
			
		||||
			clean_failed();
 | 
			
		||||
 | 
			
		||||
			rc_logger_close();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_MEMORY
 | 
			
		||||
		while (p1) {
 | 
			
		||||
			p2 = LIST_NEXT(p1, entries); 
 | 
			
		||||
			free(p1);
 | 
			
		||||
@@ -162,17 +174,8 @@ static void cleanup(void)
 | 
			
		||||
		rc_stringlist_free(types_n);
 | 
			
		||||
		rc_stringlist_free(types_nua);
 | 
			
		||||
		rc_deptree_free(deptree);
 | 
			
		||||
 | 
			
		||||
		/* Clean runlevel start, stop markers */
 | 
			
		||||
		if (! rc_in_plugin && ! rc_in_logger) {
 | 
			
		||||
			rmdir(RC_STARTING);
 | 
			
		||||
			rmdir(RC_STOPPING);
 | 
			
		||||
			clean_failed();
 | 
			
		||||
 | 
			
		||||
			rc_logger_close();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		free(runlevel);
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -327,28 +327,29 @@ static void cleanup(void)
 | 
			
		||||
			start_services(restart_services);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rc_plugin_unload();
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_MEMORY
 | 
			
		||||
	rc_stringlist_free(types_b);
 | 
			
		||||
	rc_stringlist_free(types_n);
 | 
			
		||||
	rc_stringlist_free(types_nu);
 | 
			
		||||
	rc_stringlist_free(types_nua);
 | 
			
		||||
	rc_stringlist_free(types_m);
 | 
			
		||||
	rc_stringlist_free(types_mua);
 | 
			
		||||
	
 | 
			
		||||
	rc_plugin_unload();
 | 
			
		||||
	rc_deptree_free(deptree);
 | 
			
		||||
 | 
			
		||||
	rc_stringlist_free(restart_services);
 | 
			
		||||
	rc_stringlist_free(need_services);
 | 
			
		||||
	rc_stringlist_free(use_services);
 | 
			
		||||
	rc_stringlist_free(services);
 | 
			
		||||
	rc_stringlist_free(applet_list);
 | 
			
		||||
	rc_stringlist_free(tmplist);
 | 
			
		||||
	free (ibsave);
 | 
			
		||||
	free(ibsave);
 | 
			
		||||
	free(service);
 | 
			
		||||
	free(prefix);
 | 
			
		||||
	free(runlevel);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	if (*mtime_test && ! rc_in_plugin)
 | 
			
		||||
	if (*mtime_test && !rc_in_plugin)
 | 
			
		||||
		unlink(mtime_test);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -116,13 +116,14 @@ static void free_schedulelist(void)
 | 
			
		||||
	TAILQ_INIT(&schedule);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef DEBUG_MEMORY
 | 
			
		||||
static void cleanup(void)
 | 
			
		||||
{
 | 
			
		||||
	free(changeuser);
 | 
			
		||||
	free(nav);
 | 
			
		||||
 | 
			
		||||
	free_schedulelist();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static int parse_signal(const char *sig)
 | 
			
		||||
{
 | 
			
		||||
@@ -609,7 +610,9 @@ int start_stop_daemon(int argc, char **argv)
 | 
			
		||||
	unsigned int start_wait = 0;
 | 
			
		||||
 | 
			
		||||
	TAILQ_INIT(&schedule);
 | 
			
		||||
#ifdef DEBUG_MEMORY
 | 
			
		||||
	atexit(cleanup);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	signal_setup(SIGINT, handle_signal);
 | 
			
		||||
	signal_setup(SIGQUIT, handle_signal);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user