]> granicus.if.org Git - transmission/commitdiff
(gtk) #5203 transmission-gtk shouldn't use gdk_threads_enter() and gdk_threads_leave...
authorJordan Lee <jordan@transmissionbt.com>
Fri, 4 Jan 2013 06:57:39 +0000 (06:57 +0000)
committerJordan Lee <jordan@transmissionbt.com>
Fri, 4 Jan 2013 06:57:39 +0000 (06:57 +0000)
gtk/main.c
gtk/tr-core.c
gtk/tr-core.h

index f600f3e786877ab0dda33fc9a7c4f6adc7c2fc0d..e23422f8c1d6f1002d495d85a9089b608ff7b87b 100644 (file)
@@ -884,17 +884,22 @@ on_session_closed (gpointer gdata)
   return FALSE;
 }
 
+struct session_close_struct
+{
+  tr_session * session;
+  struct cbdata * cbdata;
+};
+
+/* since tr_sessionClose () is a blocking function,
+ * delegate its call to another thread here... when it's done,
+ * punt the GUI teardown back to the GTK+ thread */
 static gpointer
 session_close_threadfunc (gpointer gdata)
 {
-  /* since tr_sessionClose () is a blocking function,
-   * call it from another thread... when it's done,
-   * punt the GUI teardown back to the GTK+ thread */
-  struct cbdata * cbdata = gdata;
-  gdk_threads_enter ();
-  gtr_core_close (cbdata->core);
-  gdk_threads_add_idle (on_session_closed, gdata);
-  gdk_threads_leave ();
+  struct session_close_struct * data = gdata;
+  tr_sessionClose (data->session);
+  gdk_threads_add_idle (on_session_closed, data->cbdata);
+  g_free (data);
   return NULL;
 }
 
@@ -909,6 +914,7 @@ on_app_exit (gpointer vdata)
 {
   GtkWidget *r, *p, *b, *w, *c;
   struct cbdata *cbdata = vdata;
+  struct session_close_struct * session_close_data;
 
   /* stop the update timer */
   if (cbdata->timer)
@@ -960,7 +966,10 @@ on_app_exit (gpointer vdata)
                                  gtr_pref_int_get (TR_KEY_main_window_y));
 
   /* shut down libT */
-  g_thread_new ("shutdown-thread", session_close_threadfunc, vdata);
+  session_close_data = g_new (struct session_close_struct, 1);
+  session_close_data->cbdata = cbdata;
+  session_close_data->session = gtr_core_close (cbdata->core);
+  g_thread_new ("shutdown-thread", session_close_threadfunc, session_close_data);
 }
 
 static void
index f7e216a74dc476aca2598842527dde580eac2137..48a1d0d83f1473e87c422aea78b60092145143f4 100644 (file)
@@ -871,7 +871,7 @@ gtr_core_new (tr_session * session)
   return core;
 }
 
-void
+tr_session *
 gtr_core_close (TrCore * core)
 {
   tr_session * session = gtr_core_session (core);
@@ -880,8 +880,9 @@ gtr_core_close (TrCore * core)
     {
       core->priv->session = NULL;
       gtr_pref_save (session);
-      tr_sessionClose (session);
     }
+
+  return session;
 }
 
 /***
index c47f400c1b23eeeca8677a044b120018bcfa45fc..08edaabf50155548a4ca379177fd6445b1c51574 100644 (file)
@@ -69,7 +69,7 @@ GType          tr_core_get_type (void) G_GNUC_CONST;
 
 TrCore *       gtr_core_new (tr_session *);
 
-void           gtr_core_close (TrCore*);
+tr_session *   gtr_core_close (TrCore*);
 
 /* Return the model used without incrementing the reference count */
 GtkTreeModel * gtr_core_model (TrCore * self);