diff options
author | brl <brl> | 2007-07-18 09:02:36 +0000 |
---|---|---|
committer | brl <brl> | 2007-07-18 09:02:36 +0000 |
commit | 1ee117ef43bf221c9cc55e94a85c47aadf176f21 (patch) | |
tree | 26f9502b99a9b246522da8bd205333a289ff9af8 | |
parent | 2ae15642de918f17a683329c517db21a1e5674a7 (diff) | |
download | ratpoison-1ee117ef43bf221c9cc55e94a85c47aadf176f21.zip |
free more stuff at termination time to make valgrind output better readable
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | src/actions.c | 38 | ||||
-rw-r--r-- | src/actions.h | 1 | ||||
-rw-r--r-- | src/main.c | 4 | ||||
-rw-r--r-- | src/window.c | 18 |
5 files changed, 68 insertions, 2 deletions
@@ -1,3 +1,12 @@ +2007-07-04 Bernhard R. Link <brlink@debian.org> + + * src/main.c (clean_up): call free_user_commands, free_groups only + after free_window_stuff + * src/window.c (free_window_stuff): remove windows from group lists + * src/action.h (free_user_commands): new prototype + * src/action.c (set_var_free,user_command_free,free_user_commands): + new functions + 2007-05-19 Bernhard R. Link <brlink@debian.org> * src/manage.c (get_wmname): free buffer to close memory hole diff --git a/src/actions.c b/src/actions.c index c1c8b4f..0de31ed 100644 --- a/src/actions.c +++ b/src/actions.c @@ -96,6 +96,15 @@ add_set_var (char *name, cmdret * (*fn)(struct cmdarg **), int nargs, ...) } static void +set_var_free (struct set_var *var) +{ + if (var == NULL) + return; + free(var->args); + free(var); +} + +static void init_set_vars(void) { add_set_var ("resizeunit", set_resizeunit, 1, "", arg_NUMBER); @@ -157,6 +166,16 @@ add_command (char *name, cmdret * (*fn)(int, struct cmdarg **), int nargs, int i list_add (&cmd->node, &user_commands); } +static void +user_command_free(struct user_command *cmd) +{ + if (cmd == NULL ) + return; + + free(cmd->args); + free(cmd); +} + void init_user_commands(void) { @@ -840,6 +859,25 @@ free_aliases (void) free (alias_list); } +void +free_user_commands (void) +{ + struct user_command *cur; + struct set_var *var; + struct list_head *tmp, *iter; + + list_for_each_safe_entry (cur, iter, tmp, &user_commands, node) + { + list_del (&cur->node); + user_command_free (cur); + } + list_for_each_safe_entry (var, iter, tmp, &set_vars, node) + { + list_del (&var->node); + set_var_free (var); + } +} + /* return a KeySym from a string that contains either a hex value or an X keysym description */ static int string_to_keysym (char *str) diff --git a/src/actions.h b/src/actions.h index 84a1b0f..b212087 100644 --- a/src/actions.h +++ b/src/actions.h @@ -222,6 +222,7 @@ void initialize_default_keybindings (void); cmdret *cmdret_new (int success, char *fmt, ...); void cmdret_free (cmdret *ret); void keymap_free (rp_keymap *map); +void free_user_commands (void); void free_aliases (void); void free_keymaps (void); char *wingravity_to_string (int g); @@ -770,10 +770,10 @@ clean_up (void) free_keymaps (); free_aliases (); + free_user_commands (); free_bar (); - free_groups (); - free_window_stuff (); + free_groups (); for (i=0; i<num_screens; i++) { diff --git a/src/window.c b/src/window.c index 1ae5201..fe7bc1e 100644 --- a/src/window.c +++ b/src/window.c @@ -771,6 +771,24 @@ init_window_stuff (void) void free_window_stuff (void) { + rp_window *cur; + struct list_head *tmp, *iter; + + list_for_each_safe_entry (cur, iter, tmp, &rp_unmapped_window, node) + { + list_del (&cur->node); + groups_del_window (cur); + free_window (cur); + } + + list_for_each_safe_entry (cur, iter, tmp, &rp_mapped_window, node) + { + list_del (&cur->node); + groups_unmap_window (cur); + groups_del_window (cur); + free_window (cur); + } + numset_free (rp_window_numset); } |