Proper resource freeing
authorMyhailo Danylenko <isbear@ukrpost.net>
Sun, 10 Feb 2013 19:01:35 +0200
changeset 33 5052c1200b68
parent 32 ca6ef5ecb3ce
child 34 5b818c7467ad
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
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: */