[anjuta] symbol-db: Fixed some more crashes



commit 2c56d4d5ef6547c03ea0d5a250b14588719b4a20
Author: Naba Kumar <naba gnome org>
Date:   Sun Feb 21 13:25:02 2010 +0200

    symbol-db: Fixed some more crashes
    
    Makes sure cancel operation is not anymore allowed (by disconnecting from it) after comand
    is finished. Takes care of another race condition where cancel would still arrive (because
    the other end hasn't got the command-finished signal) while command has finnished this
    end (and command object finalized) resulting in crash.

 plugins/symbol-db/symbol-db-iface.c |   35 +++++++++++++++++++++++++----------
 1 files changed, 25 insertions(+), 10 deletions(-)
---
diff --git a/plugins/symbol-db/symbol-db-iface.c b/plugins/symbol-db/symbol-db-iface.c
index 3dc7dea..92c30af 100644
--- a/plugins/symbol-db/symbol-db-iface.c
+++ b/plugins/symbol-db/symbol-db-iface.c
@@ -366,16 +366,6 @@ on_sdb_search_command_data_arrived (AnjutaCommand *command,
 }
 
 static void
-on_sdb_search_command_finished (SymbolDBSearchCommand *search_command,
-								guint return_code,
-								AnjutaAsyncNotify *notify)
-{
-	if (!symbol_db_search_command_get_cancelled (search_command) && notify)
-		anjuta_async_notify_notify_finished (notify);
-	g_object_unref (search_command); /* Fully done */
-}
-
-static void
 on_sdb_search_command_cancelled (GCancellable *cancellable,
 								 AnjutaCommand *command)
 {
@@ -388,9 +378,32 @@ on_sdb_search_command_cancelled (GCancellable *cancellable,
 	g_signal_handlers_disconnect_by_func (cancellable,
 										  on_sdb_search_command_cancelled,
 										  command);
+	g_object_set_data (G_OBJECT (command), "cancellable", NULL);
 	g_object_unref (cancellable);
 }
 
+static void
+on_sdb_search_command_finished (SymbolDBSearchCommand *search_command,
+								guint return_code,
+								AnjutaAsyncNotify *notify)
+{
+	GCancellable *cancel;
+
+	DEBUG_PRINT ("sdb search finished %p", search_command);
+
+	if (!symbol_db_search_command_get_cancelled (search_command) && notify)
+		anjuta_async_notify_notify_finished (notify);
+
+	cancel = g_object_get_data (G_OBJECT (search_command), "cancellable");
+	if (cancel)
+	{
+		g_signal_handlers_disconnect_by_func (cancel, on_sdb_search_command_cancelled, search_command);
+		g_object_unref (cancel);
+		g_object_set_data (G_OBJECT (search_command), "cancellable", NULL);
+	}
+	g_object_unref (search_command); /* Fully done */
+}
+
 static gint
 do_search_prj_glb_async (SymbolDBSearchCommand *search_command, guint cmd_id, 
                          GCancellable* cancel, AnjutaAsyncNotify *notify, 
@@ -424,6 +437,7 @@ do_search_prj_glb_async (SymbolDBSearchCommand *search_command, guint cmd_id,
 		g_signal_connect (G_OBJECT (cancel), "cancelled",
 		    			  G_CALLBACK (on_sdb_search_command_cancelled),
 						  search_command);
+		g_object_set_data (G_OBJECT (search_command), "cancellable", cancel);
 	}
 	
 	anjuta_command_start (ANJUTA_COMMAND (search_command));	
@@ -629,6 +643,7 @@ isymbol_manager_search_file_async (IAnjutaSymbolManager *sm, IAnjutaSymbolType m
 		g_signal_connect (G_OBJECT (cancel), "cancelled",
 						  G_CALLBACK (on_sdb_search_command_cancelled),
 						  search_command);
+		g_object_set_data (G_OBJECT (search_command), "cancellable", cancel);
 	}
 	
 	anjuta_command_start (ANJUTA_COMMAND (search_command));	



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]