]> git.street.me.uk Git - andy/viking.git/commitdiff
deadlock fix
authorAlex Foobarian <foobarian@gmail.com>
Wed, 12 Oct 2005 12:58:16 +0000 (12:58 +0000)
committerAlex Foobarian <foobarian@gmail.com>
Wed, 12 Oct 2005 12:58:16 +0000 (12:58 +0000)
src/background.c

index e83ff64567535c06f13f4e1a6902df2900b9f54a..0e19333134a25b68ba6dc5a03612a8dc96c65ffd 100644 (file)
@@ -105,7 +105,6 @@ void thread_helper ( gpointer args[6] )
 
   func ( userdata, args );
 
-  /* need MUTEX ? */
   gdk_threads_enter();
   if ( ! args[0] )
     gtk_list_store_remove ( bgstore, (GtkTreeIter *) args[5] );
@@ -157,21 +156,29 @@ static void cancel_job_with_iter ( GtkTreeIter *piter )
 
 static void bgwindow_response (GtkDialog *dialog, gint arg1 )
 {
- if ( arg1 == 1 ) /* cancel */
- {
-   GtkTreeIter iter;
-   if ( gtk_tree_selection_get_selected ( gtk_tree_view_get_selection ( GTK_TREE_VIEW(bgtreeview) ), NULL, &iter ) )
-     cancel_job_with_iter ( &iter );
-    background_thread_update();
-  }
+  /* note this function is a signal handler called back from the GTK main loop, 
+   * so GDK is already locked.  We need to release the lock before calling 
+   * thread-safe routines
+   */
+  if ( arg1 == 1 ) /* cancel */
+    {
+      GtkTreeIter iter;
+      if ( gtk_tree_selection_get_selected ( gtk_tree_view_get_selection ( GTK_TREE_VIEW(bgtreeview) ), NULL, &iter ) )
+       cancel_job_with_iter ( &iter );
+      gdk_threads_leave();
+      background_thread_update();
+      gdk_threads_enter();
+    }
   else if ( arg1 == 2 ) /* clear */
-  {
-    GtkTreeIter iter;
-    while ( gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(bgstore), &iter ) )
-      cancel_job_with_iter ( &iter );
-    bgitemcount = 0;
-    background_thread_update();
-  }
+    {
+      GtkTreeIter iter;
+      while ( gtk_tree_model_get_iter_first ( GTK_TREE_MODEL(bgstore), &iter ) )
+       cancel_job_with_iter ( &iter );
+      bgitemcount = 0;
+      gdk_threads_leave();
+      background_thread_update();
+      gdk_threads_enter();
+    }
   else /* OK */
     gtk_widget_hide ( bgwindow );
 }