# HG changeset patch # User Myhailo Danylenko # Date 1360515695 -7200 # Node ID 5052c1200b680090c6a8566a04aad5f6102b466e # Parent ca6ef5ecb3ceb80595688430aa8cd9ab8a767f14 Proper resource freeing * all destruction work is done by notify callback * channel is unreffed right away, so only ref is in watch source * release everything by deleting watch sources diff -r ca6ef5ecb3ce -r 5052c1200b68 cmd.c --- a/cmd.c Mon Aug 20 22:39:00 2012 +0300 +++ b/cmd.c Sun Feb 10 19:01:35 2013 +0200 @@ -119,7 +119,7 @@ } if (chstat == G_IO_STATUS_ERROR || chstat == G_IO_STATUS_EOF) { - cb->source = 0; + return FALSE; // XXX } @@ -195,13 +195,13 @@ scr_log_print (LPRINT_LOGNORM, "cmd: Character conversion error: %s", error->message); g_error_free (error); - cb->source = 0; + return FALSE; } } } else if (condition & (G_IO_ERR|G_IO_NVAL|G_IO_HUP)) { - cb->source = 0; + return FALSE; // XXX } @@ -214,10 +214,6 @@ cmd_channels = g_slist_remove (cmd_channels, data); - if (cb->source) - g_source_remove (cb->source); - if (cb->channel) - g_io_channel_unref (cb->channel); if (cb -> subject) g_free (cb -> subject); g_free (cb->jid); @@ -317,10 +313,14 @@ cb -> input = g_string_new (NULL); cb -> seq = 0; cb -> channel = channel; + + cmd_channels = g_slist_append (cmd_channels, cb); + cb -> source = g_io_add_watch_full (channel, 0, G_IO_IN|G_IO_ERR|G_IO_HUP|G_IO_NVAL, cmd_reader, (gpointer) cb, cmd_destroy_data); - cmd_channels = g_slist_append (cmd_channels, cb); + g_io_channel_unref ( channel ); + } } } @@ -345,17 +345,12 @@ cmd_del (mcmd_cmid); #endif - for (sel = cmd_channels; sel; sel = sel->next) { + for (sel = cmd_channels; sel; ) { cmd_cb_t *cb = (cmd_cb_t *) sel->data; + sel = sel -> next; if (cb->source) g_source_remove (cb->source); - if (cb->channel) - g_io_channel_unref (cb->channel); - g_free (cb->jid); - g_slice_free (cmd_cb_t, cb); } - - g_slist_free (cmd_channels); } /* vim: se ts=4 sw=4: */