#ifdef atexit cleanups calling free as the OS should do this for us, but valgrind debuggers need it.

This commit is contained in:
Roy Marples 2008-10-06 15:02:32 +00:00
parent 4e4c4a5bf4
commit cb44b0a46c
6 changed files with 30 additions and 17 deletions

2
.gitignore vendored
View File

@ -1,3 +1,3 @@
openrc-0.1.tar.bz2 openrc-*.tar.bz2
.gdb_history .gdb_history
.gdbinit .gdbinit

2
README
View File

@ -19,6 +19,8 @@ PREFIX=/usr/local
We don't support building a static OpenRC with PAM. We don't support building a static OpenRC with PAM.
You may need to use PROGLDFLAGS=-Wl,-Bstatic on glibc instead of just -static. You may need to use PROGLDFLAGS=-Wl,-Bstatic on glibc instead of just -static.
If you debug memory under valgrind, add -DDEBUG_MEMORY to your CPPFLAGS
so that all malloc memory should be freed at exit.
You can also brand OpenRC if you so wish like so You can also brand OpenRC if you so wish like so
BRANDING=\"Gentoo/$(uname -s)\" BRANDING=\"Gentoo/$(uname -s)\"

View File

@ -61,10 +61,12 @@ static RC_STRINGLIST *rc_conf = NULL;
extern char** environ; extern char** environ;
#ifdef DEBUG_MEMORY
static void _free_rc_conf(void) static void _free_rc_conf(void)
{ {
rc_stringlist_free(rc_conf); rc_stringlist_free(rc_conf);
} }
#endif
char *rc_conf_value(const char *setting) char *rc_conf_value(const char *setting)
{ {
@ -74,7 +76,9 @@ char *rc_conf_value(const char *setting)
if (! rc_conf) { if (! rc_conf) {
rc_conf = rc_config_load(RC_CONF); rc_conf = rc_config_load(RC_CONF);
#ifdef DEBUG_MEMORY
atexit(_free_rc_conf); atexit(_free_rc_conf);
#endif
/* Support old configs */ /* Support old configs */
if (exists(RC_CONF_OLD)) { if (exists(RC_CONF_OLD)) {

View File

@ -137,8 +137,10 @@ static void clean_failed(void)
static void cleanup(void) static void cleanup(void)
{ {
if (applet && strcmp(applet, "rc") == 0) { if (applet && strcmp(applet, "rc") == 0) {
#ifdef DEBUG_MEMORY
RC_PID *p1 = LIST_FIRST(&service_pids); RC_PID *p1 = LIST_FIRST(&service_pids);
RC_PID *p2; RC_PID *p2;
#endif
if (hook_out) if (hook_out)
rc_plugin_run(hook_out, runlevel); rc_plugin_run(hook_out, runlevel);
@ -150,6 +152,16 @@ static void cleanup(void)
free(termios_orig); 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) { while (p1) {
p2 = LIST_NEXT(p1, entries); p2 = LIST_NEXT(p1, entries);
free(p1); free(p1);
@ -162,17 +174,8 @@ static void cleanup(void)
rc_stringlist_free(types_n); rc_stringlist_free(types_n);
rc_stringlist_free(types_nua); rc_stringlist_free(types_nua);
rc_deptree_free(deptree); 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); free(runlevel);
#endif
} }
} }

View File

@ -327,28 +327,29 @@ static void cleanup(void)
start_services(restart_services); start_services(restart_services);
} }
rc_plugin_unload();
#ifdef DEBUG_MEMORY
rc_stringlist_free(types_b); rc_stringlist_free(types_b);
rc_stringlist_free(types_n); rc_stringlist_free(types_n);
rc_stringlist_free(types_nu); rc_stringlist_free(types_nu);
rc_stringlist_free(types_nua); rc_stringlist_free(types_nua);
rc_stringlist_free(types_m); rc_stringlist_free(types_m);
rc_stringlist_free(types_mua); rc_stringlist_free(types_mua);
rc_plugin_unload();
rc_deptree_free(deptree); rc_deptree_free(deptree);
rc_stringlist_free(restart_services); rc_stringlist_free(restart_services);
rc_stringlist_free(need_services); rc_stringlist_free(need_services);
rc_stringlist_free(use_services); rc_stringlist_free(use_services);
rc_stringlist_free(services); rc_stringlist_free(services);
rc_stringlist_free(applet_list); rc_stringlist_free(applet_list);
rc_stringlist_free(tmplist); rc_stringlist_free(tmplist);
free (ibsave); free(ibsave);
free(service); free(service);
free(prefix); free(prefix);
free(runlevel); free(runlevel);
#endif
if (*mtime_test && ! rc_in_plugin) if (*mtime_test && !rc_in_plugin)
unlink(mtime_test); unlink(mtime_test);
} }

View File

@ -116,13 +116,14 @@ static void free_schedulelist(void)
TAILQ_INIT(&schedule); TAILQ_INIT(&schedule);
} }
#ifdef DEBUG_MEMORY
static void cleanup(void) static void cleanup(void)
{ {
free(changeuser); free(changeuser);
free(nav); free(nav);
free_schedulelist(); free_schedulelist();
} }
#endif
static int parse_signal(const char *sig) static int parse_signal(const char *sig)
{ {
@ -609,7 +610,9 @@ int start_stop_daemon(int argc, char **argv)
unsigned int start_wait = 0; unsigned int start_wait = 0;
TAILQ_INIT(&schedule); TAILQ_INIT(&schedule);
#ifdef DEBUG_MEMORY
atexit(cleanup); atexit(cleanup);
#endif
signal_setup(SIGINT, handle_signal); signal_setup(SIGINT, handle_signal);
signal_setup(SIGQUIT, handle_signal); signal_setup(SIGQUIT, handle_signal);