summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbrl <brl>2007-07-18 09:02:36 +0000
committerbrl <brl>2007-07-18 09:02:36 +0000
commit1ee117ef43bf221c9cc55e94a85c47aadf176f21 (patch)
tree26f9502b99a9b246522da8bd205333a289ff9af8
parent2ae15642de918f17a683329c517db21a1e5674a7 (diff)
downloadratpoison-1ee117ef43bf221c9cc55e94a85c47aadf176f21.zip
free more stuff at termination time to make valgrind output better readable
-rw-r--r--ChangeLog9
-rw-r--r--src/actions.c38
-rw-r--r--src/actions.h1
-rw-r--r--src/main.c4
-rw-r--r--src/window.c18
5 files changed, 68 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 0788560..38c8195 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);
diff --git a/src/main.c b/src/main.c
index 2b272b0..7c7b468 100644
--- a/src/main.c
+++ b/src/main.c
@@ -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);
}