Reverted again the gdk_threads_enter/leave sentences:
[modest] / src / modest-mail-operation.c
index c3fa967..f88ff79 100644 (file)
@@ -70,7 +70,8 @@ static void     get_msg_status_cb (GObject *obj,
                                   TnyStatus *status,  
                                   gpointer user_data);
 
-static void     modest_mail_operation_notify_end (ModestMailOperation *self);
+static void     modest_mail_operation_notify_end (ModestMailOperation *self,
+                                                 gboolean need_lock);
 
 static gboolean did_a_cancel = FALSE;
 
@@ -373,7 +374,7 @@ modest_mail_operation_cancel (ModestMailOperation *self)
        /* This emits progress-changed on which the mail operation queue is
         * listening, so the mail operation is correctly removed from the
         * queue without further explicit calls. */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, FALSE);
        
        return TRUE;
 }
@@ -522,7 +523,7 @@ modest_mail_operation_send_mail (ModestMailOperation *self,
 
        /* TODO: do this in the handler of the "msg-sent"
           signal.Notify about operation end */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, FALSE);
 }
 
 void
@@ -657,7 +658,7 @@ end:
        if (folder)
                g_object_unref (G_OBJECT(folder));
 
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, FALSE);
 }
 
 typedef struct 
@@ -794,6 +795,8 @@ recurse_folders (TnyFolderStore *store, TnyFolderStoreQuery *query, TnyList *all
 static gboolean
 idle_notify_progress (gpointer data)
 {
+       gdk_threads_enter ();
+
        ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data);
        ModestMailOperationState *state;
 
@@ -801,6 +804,8 @@ idle_notify_progress (gpointer data)
        g_signal_emit (G_OBJECT (mail_op), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
        g_slice_free (ModestMailOperationState, state);
        
+       gdk_threads_leave ();
+
        return TRUE;
 }
 
@@ -812,6 +817,8 @@ idle_notify_progress (gpointer data)
 static gboolean
 idle_notify_progress_once (gpointer data)
 {
+       gdk_threads_enter ();
+
        ModestPair *pair;
 
        pair = (ModestPair *) data;
@@ -822,6 +829,8 @@ idle_notify_progress_once (gpointer data)
        g_slice_free (ModestMailOperationState, (ModestMailOperationState*)pair->second);
        g_object_unref (pair->first);
 
+       gdk_threads_leave ();
+
        return FALSE;
 }
 
@@ -830,14 +839,15 @@ idle_notify_progress_once (gpointer data)
  * loop. We call it inside an idle call to achieve that
  */
 static gboolean
-notify_update_account_queue (gpointer data)
+idle_notify_update_account_queue (gpointer data)
 {
        ModestMailOperation *mail_op = MODEST_MAIL_OPERATION (data);
        ModestMailOperationPrivate *priv = NULL;
 
        priv = MODEST_MAIL_OPERATION_GET_PRIVATE(mail_op);
-       
-       modest_mail_operation_notify_end (mail_op);
+
+       /* Do not need to block, the notify end will do it for us */    
+       modest_mail_operation_notify_end (mail_op, TRUE);
        g_object_unref (mail_op);
 
        return FALSE;
@@ -867,6 +877,8 @@ compare_headers_by_date (gconstpointer a,
 static gboolean 
 set_last_updated_idle (gpointer data)
 {
+       gdk_threads_enter ();
+
        /* It does not matter if the time is not exactly the same than
           the time when this idle was called, it's just an
           approximation and it won't be very different */
@@ -876,6 +888,8 @@ set_last_updated_idle (gpointer data)
                                    time(NULL), 
                                    TRUE);
 
+       gdk_threads_leave ();
+
        return FALSE;
 }
 
@@ -1089,12 +1103,16 @@ update_account_thread (gpointer thr_user_data)
        /* Notify about operation end. Note that the info could be
           freed before this idle happens, but the mail operation will
           be still alive */
-       g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
+       g_idle_add (idle_notify_update_account_queue, g_object_ref (info->mail_op));
 
-       if (info->callback) 
+       if (info->callback) {
+               /* This thread is not in the main lock */
+               gdk_threads_enter ();
                info->callback (info->mail_op, 
                                (new_headers) ? new_headers->len : 0, 
                                info->user_data);
+               gdk_threads_leave ();
+       }
        
        /* Frees */
        g_object_unref (query);
@@ -1207,7 +1225,7 @@ modest_mail_operation_update_account (ModestMailOperation *self,
        priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
        if (callback) 
                callback (self, 0, user_data);
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, FALSE);
        return FALSE;
 }
 
@@ -1251,7 +1269,7 @@ modest_mail_operation_create_folder (ModestMailOperation *self,
        }
 
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, FALSE);
 
        return new_folder;
 }
@@ -1306,7 +1324,7 @@ modest_mail_operation_remove_folder (ModestMailOperation *self,
 
  end:
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, FALSE);
 }
 
 static void
@@ -1340,7 +1358,8 @@ static void
 transfer_folder_cb (TnyFolder *folder, 
                    TnyFolderStore *into, 
                    gboolean cancelled, 
-                   TnyFolder *new_folder, GError **err, 
+                   TnyFolder *new_folder, 
+                   GError **err, 
                    gpointer user_data)
 {
        ModestMailOperation *self = NULL;
@@ -1368,11 +1387,9 @@ transfer_folder_cb (TnyFolder *folder,
        /* Free */
        g_object_unref (folder);
        g_object_unref (into);
-       if (new_folder != NULL)
-               g_object_unref (new_folder);
 
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, TRUE);
 }
 
 void
@@ -1411,7 +1428,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
                             _("mail_in_ui_folder_move_target_error"));
 
                /* Notify the queue */
-               modest_mail_operation_notify_end (self);
+               modest_mail_operation_notify_end (self, FALSE);
        } else if (parent_rules & MODEST_FOLDER_RULES_FOLDER_NON_WRITEABLE) {
                /* Set status failed and set an error */
                priv->status = MODEST_MAIL_OPERATION_STATUS_FAILED;
@@ -1420,7 +1437,7 @@ modest_mail_operation_xfer_folder (ModestMailOperation *self,
                             _("FIXME: parent folder does not accept new folders"));
 
                /* Notify the queue */
-               modest_mail_operation_notify_end (self);
+               modest_mail_operation_notify_end (self, FALSE);
        } else {
                /* Pick references for async calls */
                g_object_ref (folder);
@@ -1464,7 +1481,7 @@ modest_mail_operation_rename_folder (ModestMailOperation *self,
                             _("FIXME: unable to rename"));
 
                /* Notify about operation end */
-               modest_mail_operation_notify_end (self);
+               modest_mail_operation_notify_end (self, FALSE);
        } else {
                /* Rename. Camel handles folder subscription/unsubscription */
                TnyFolderStore *into;
@@ -1523,7 +1540,7 @@ void modest_mail_operation_get_msg (ModestMailOperation *self,
                             _("Error trying to get a message. No folder found for header"));
 
                /* Notify the queue */
-               modest_mail_operation_notify_end (self);
+               modest_mail_operation_notify_end (self, FALSE);
        }
 }
 
@@ -1563,7 +1580,11 @@ get_msg_cb (TnyFolder *folder,
 
        /* If user defined callback function was defined, call it */
        if (helper->user_callback) {
+               /* This callback is called into an iddle by tinymail,
+                  and idles are not in the main lock */
+               gdk_threads_enter ();
                helper->user_callback (self, helper->header, msg, helper->user_data);
+               gdk_threads_leave ();
        }
 
  out:
@@ -1572,7 +1593,7 @@ get_msg_cb (TnyFolder *folder,
        g_slice_free (GetMsgAsyncHelper, helper);
                
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self);        
+       modest_mail_operation_notify_end (self, TRUE);
 }
 
 static void     
@@ -1636,8 +1657,11 @@ notify_get_msgs_full (gpointer data)
 
        info = (NotifyGetMsgsInfo *) data;      
 
-       /* Call the user callback */
+       /* Call the user callback. Idles are not in the main lock, so
+          lock it */
+       gdk_threads_enter ();
        info->user_callback (info->mail_op, info->header, info->msg, info->user_data);
+       gdk_threads_leave ();
 
        g_slice_free (NotifyGetMsgsInfo, info);
 
@@ -1655,8 +1679,11 @@ get_msgs_full_destroyer (gpointer data)
 
        info = (GetFullMsgsInfo *) data;
 
-       if (info->notify)
+       if (info->notify) {
+               gdk_threads_enter ();   
                info->notify (info->user_data);
+               gdk_threads_leave ();
+       }
 
        /* free */
        g_object_unref (info->headers);
@@ -1733,7 +1760,7 @@ get_msgs_full_thread (gpointer thr_user_data)
                priv->status = MODEST_MAIL_OPERATION_STATUS_SUCCESS;
 
        /* Notify about operation end */
-       g_idle_add (notify_update_account_queue, g_object_ref (info->mail_op));
+       g_idle_add (idle_notify_update_account_queue, g_object_ref (info->mail_op));
 
        /* Free thread resources. Will be called after all previous idles */
        g_idle_add_full (G_PRIORITY_DEFAULT_IDLE + 1, get_msgs_full_destroyer, info, NULL);
@@ -1822,7 +1849,7 @@ modest_mail_operation_get_msgs_full (ModestMailOperation *self,
                             MODEST_MAIL_OPERATION_ERROR_MESSAGE_SIZE_LIMIT,
                             _("emev_ni_ui_imap_msg_size_exceed_error"));
                /* Remove from queue and free resources */
-               modest_mail_operation_notify_end (self);
+               modest_mail_operation_notify_end (self, FALSE);
                if (notify)
                        notify (user_data);
        }
@@ -1896,7 +1923,7 @@ modest_mail_operation_remove_msg (ModestMailOperation *self,
        g_object_unref (G_OBJECT (folder));
 
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, FALSE);
 }
 
 static void
@@ -1960,7 +1987,9 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer
 
        /* If user defined callback function was defined, call it */
        if (helper->user_callback) {
+               gdk_threads_enter ();
                helper->user_callback (priv->source, helper->user_data);
+               gdk_threads_leave ();
        }
 
        /* Free */
@@ -1971,7 +2000,7 @@ transfer_msgs_cb (TnyFolder *folder, gboolean cancelled, GError **err, gpointer
        g_object_unref (folder);
 
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, TRUE);
 }
 
 void
@@ -2007,7 +2036,7 @@ modest_mail_operation_xfer_msgs (ModestMailOperation *self,
                             MODEST_MAIL_OPERATION_ERROR_FOLDER_RULES,
                             _("FIXME: folder does not accept msgs"));
                /* Notify the queue */
-               modest_mail_operation_notify_end (self);
+               modest_mail_operation_notify_end (self, FALSE);
                return;
        }
 
@@ -2073,8 +2102,11 @@ on_refresh_folder (TnyFolder   *folder,
 
  out:
        /* Call user defined callback, if it exists */
-       if (helper->user_callback)
+       if (helper->user_callback) {
+               gdk_threads_enter ();
                helper->user_callback (priv->source, folder, helper->user_data);
+               gdk_threads_leave ();
+       }
 
        /* Free */
        g_object_unref (helper->mail_op);
@@ -2082,7 +2114,7 @@ on_refresh_folder (TnyFolder   *folder,
        g_object_unref (folder);
 
        /* Notify about operation end */
-       modest_mail_operation_notify_end (self);
+       modest_mail_operation_notify_end (self, TRUE);
 }
 
 static void
@@ -2156,7 +2188,8 @@ modest_mail_operation_refresh_folder  (ModestMailOperation *self,
  * callback).
  */
 static void
-modest_mail_operation_notify_end (ModestMailOperation *self)
+modest_mail_operation_notify_end (ModestMailOperation *self,
+                                 gboolean need_lock)
 {
        ModestMailOperationState *state;
        ModestMailOperationPrivate *priv = NULL;
@@ -2172,14 +2205,18 @@ modest_mail_operation_notify_end (ModestMailOperation *self)
        
        /* Set the account back to not busy */
        if (priv->account_name) {
-               modest_account_mgr_set_account_busy(modest_runtime_get_account_mgr(), priv->account_name,
-                                                                                                                                                               FALSE);
+               modest_account_mgr_set_account_busy (modest_runtime_get_account_mgr(), 
+                                                    priv->account_name, FALSE);
                g_free(priv->account_name);
                priv->account_name = NULL;
        }
        
        /* Notify the observers about the mail opertation end */
        state = modest_mail_operation_clone_state (self);
+       if (need_lock)
+               gdk_threads_enter ();
        g_signal_emit (G_OBJECT (self), signals[PROGRESS_CHANGED_SIGNAL], 0, state, NULL);
+       if (need_lock)
+               gdk_threads_leave ();
        g_slice_free (ModestMailOperationState, state);
 }