# HG changeset patch # User desowin@gmail.com # Date 1251606852 0 # Node ID de2ac0952487efd131c2bfbcf7ece3e178330cd2 # Parent f075af99d9b5677b89c78982889aee83355c2ddd Remove IO watches at shutdown in gntmain.c Closes #9872. Patch from Tomasz "desowin" Mon. committer: Paul Aurich diff -r f075af99d9b5 -r de2ac0952487 COPYRIGHT --- a/COPYRIGHT Sun Aug 30 04:31:26 2009 +0000 +++ b/COPYRIGHT Sun Aug 30 04:34:12 2009 +0000 @@ -307,6 +307,7 @@ Arkadiusz Miskiewicz David Mohr Andrew Molloy +Tomasz Mon Michael Monreal Laurent Montaron Marco Monteiro diff -r f075af99d9b5 -r de2ac0952487 ChangeLog --- a/ChangeLog Sun Aug 30 04:31:26 2009 +0000 +++ b/ChangeLog Sun Aug 30 04:34:12 2009 +0000 @@ -17,6 +17,7 @@ Finch: * Properly detect libpanel on OpenBSD. (Brad Smith) + * Remove IO watches in gnt_quit. (Tomasz Mon) Pidgin: * Fix the auto-personize functionality in the Buddy List. diff -r f075af99d9b5 -r de2ac0952487 finch/libgnt/gntmain.c --- a/finch/libgnt/gntmain.c Sun Aug 30 04:31:26 2009 +0000 +++ b/finch/libgnt/gntmain.c Sun Aug 30 04:34:12 2009 +0000 @@ -69,7 +69,8 @@ */ static GIOChannel *channel = NULL; -static int channel_read_callback; +static guint channel_read_callback = 0; +static guint channel_error_callback = 0; static gboolean ascii_only; static gboolean mouse_enabled; @@ -314,11 +315,11 @@ channel_read_callback = result = g_io_add_watch_full(channel, G_PRIORITY_HIGH, (G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI), io_invoke, NULL, NULL); - - g_io_add_watch_full(channel, G_PRIORITY_HIGH, + + channel_error_callback = g_io_add_watch_full(channel, G_PRIORITY_HIGH, (G_IO_NVAL), io_invoke_error, GINT_TO_POINTER(result), NULL); - + g_io_channel_unref(channel); /* Apparently this caused crashes for some people. But irssi does this, so I am going to assume the crashes were caused by some other stuff. */ @@ -583,6 +584,13 @@ void gnt_quit() { + /* Prevent io_invoke() from being called after wm is destroyed */ + g_source_remove(channel_error_callback); + g_source_remove(channel_read_callback); + + channel_error_callback = 0; + channel_read_callback = 0; + g_object_unref(G_OBJECT(wm)); wm = NULL;