From: Sergio Villar Senin Date: Wed, 27 Jun 2007 08:58:07 +0000 (+0000) Subject: * Fixes NB#61225 the application no longer hangs due to threading locks X-Git-Tag: git_migration_finished~3083 X-Git-Url: http://git.maemo.org/git/?p=modest;a=commitdiff_plain;h=3ce5e7a70898233ed4a5f810c31903f59b4a1d08 * Fixes NB#61225 the application no longer hangs due to threading locks * Modified modest_mail_operation_notify_end, now it receives a second argument that specifies if the signal emission should be blocked or NOT, we need to do this if we're calling it from a different thread * Removed an invalid double-lock in the mail operations * Added an empty error handler for the rename operation, no specs for the error message? pmo-trunk-r2452 --- diff --git a/src/maemo/modest-platform.c b/src/maemo/modest-platform.c index 8b99804..920f3fb 100644 --- a/src/maemo/modest-platform.c +++ b/src/maemo/modest-platform.c @@ -707,6 +707,7 @@ launch_sort_headers_dialog (GtkWindow *parent_window, hildon_sort_dialog_set_sort_key (dialog, current_sort_keyid); } } + result = gtk_dialog_run (GTK_DIALOG (dialog)); if (result == GTK_RESPONSE_OK) { sort_key = hildon_sort_dialog_get_sort_key (dialog); @@ -787,6 +788,7 @@ modest_platform_run_folder_name_dialog (GtkWindow *parent_window, gtk_widget_show_all (GTK_WIDGET(GTK_DIALOG(dialog)->vbox)); + gtk_window_set_transient_for (GTK_WINDOW (dialog), parent_window); result = gtk_dialog_run (GTK_DIALOG(dialog)); if (result == GTK_RESPONSE_ACCEPT) *folder_name = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry))); diff --git a/src/modest-mail-operation.c b/src/modest-mail-operation.c index 0564f08..77e42d6 100644 --- a/src/modest-mail-operation.c +++ b/src/modest-mail-operation.c @@ -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 @@ -840,17 +841,14 @@ idle_notify_progress_once (gpointer data) static gboolean idle_notify_update_account_queue (gpointer data) { - gdk_threads_enter (); - 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); - g_object_unref (mail_op); - gdk_threads_leave (); + /* 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; } @@ -1227,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; } @@ -1271,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; } @@ -1326,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 @@ -1393,7 +1391,7 @@ transfer_folder_cb (TnyFolder *folder, g_object_unref (new_folder); /* Notify about operation end */ - modest_mail_operation_notify_end (self); + modest_mail_operation_notify_end (self, TRUE); } void @@ -1432,7 +1430,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; @@ -1441,7 +1439,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); @@ -1485,7 +1483,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; @@ -1544,7 +1542,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); } } @@ -1597,7 +1595,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 @@ -1657,8 +1655,6 @@ typedef struct { static gboolean notify_get_msgs_full (gpointer data) { - gdk_threads_enter (); - NotifyGetMsgsInfo *info; info = (NotifyGetMsgsInfo *) data; @@ -1671,8 +1667,6 @@ notify_get_msgs_full (gpointer data) g_slice_free (NotifyGetMsgsInfo, info); - gdk_threads_leave (); - return FALSE; } @@ -1683,21 +1677,20 @@ notify_get_msgs_full (gpointer data) static gboolean get_msgs_full_destroyer (gpointer data) { - gdk_threads_enter (); - GetFullMsgsInfo *info; 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); g_slice_free (GetFullMsgsInfo, info); - gdk_threads_leave (); - return FALSE; } @@ -1858,7 +1851,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); } @@ -1932,7 +1925,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 @@ -2009,7 +2002,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 @@ -2045,7 +2038,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; } @@ -2112,9 +2105,9 @@ on_refresh_folder (TnyFolder *folder, out: /* Call user defined callback, if it exists */ if (helper->user_callback) { -/* gdk_threads_enter (); */ + gdk_threads_enter (); helper->user_callback (priv->source, folder, helper->user_data); -/* gdk_threads_leave (); */ + gdk_threads_leave (); } /* Free */ @@ -2123,7 +2116,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 @@ -2197,7 +2190,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; @@ -2221,6 +2215,10 @@ modest_mail_operation_notify_end (ModestMailOperation *self) /* 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); } diff --git a/src/modest-ui-actions.c b/src/modest-ui-actions.c index 527ab4d..0e48aa6 100644 --- a/src/modest-ui-actions.c +++ b/src/modest-ui-actions.c @@ -1888,6 +1888,18 @@ modest_ui_actions_on_new_folder (GtkAction *action, ModestMainWindow *main_windo } } +static void +modest_ui_actions_rename_folder_error_handler (ModestMailOperation *mail_op, + gpointer user_data) +{ + GObject *win = modest_mail_operation_get_source (mail_op); + + /* TODO: what should we do in case of this error ? */ + g_warning ("Invalid folder name"); + + g_object_unref (win); +} + void modest_ui_actions_on_rename_folder (GtkAction *action, ModestMainWindow *main_window) @@ -1923,7 +1935,13 @@ modest_ui_actions_on_rename_folder (GtkAction *action, if (response == GTK_RESPONSE_ACCEPT && strlen (folder_name) > 0) { ModestMailOperation *mail_op; - mail_op = modest_mail_operation_new (MODEST_MAIL_OPERATION_TYPE_INFO, G_OBJECT(main_window)); + mail_op = + modest_mail_operation_new_with_error_handling (MODEST_MAIL_OPERATION_TYPE_INFO, + G_OBJECT(main_window), + modest_ui_actions_rename_folder_error_handler, + NULL); + + modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), mail_op);