From ee625ee5fcc71e9d17fafd53fa17c7cd73558c9f Mon Sep 17 00:00:00 2001 From: Iain Holmes Date: Sat, 7 Oct 2000 00:58:03 +0000 Subject: Fix the locking up of the mail by only calling camel functions from the 2000-10-06 Iain Holmes * mail-summary.c: Fix the locking up of the mail by only calling camel functions from the camel thread, and ORBit functions from the GTK thread. Watch for the message-changed signal again. * component-factory.c (summary_fn, component_factory_init): Re-enabled it, cos I think it works again. * mail-display.h: Remove the pb_cache. * Makefile.am: Readd the mail-summary.[ch] files and add the evolution-services library to the link. svn path=/trunk/; revision=5777 --- mail/mail-summary.c | 189 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 146 insertions(+), 43 deletions(-) (limited to 'mail/mail-summary.c') diff --git a/mail/mail-summary.c b/mail/mail-summary.c index 619accf24e..e670057ad8 100644 --- a/mail/mail-summary.c +++ b/mail/mail-summary.c @@ -28,11 +28,11 @@ #include #include "camel.h" - +#include #include "mail.h" /* YUCK FIXME */ #include "mail-tools.h" #include "mail-ops.h" -#include + #include "mail-local-storage.h" #include @@ -41,41 +41,142 @@ typedef struct { ExecutiveSummaryComponent *component; CamelFolder *folder; - int mailread, mailunread; + int mail, unread; char *html; } MailSummary; +#define SUMMARY_IN() g_print ("IN: %s: %d\n", __FUNCTION__, __LINE__); +#define SUMMARY_OUT() g_print ("OUT: %s: %d\n", __FUNCTION__, __LINE__); + +static int queue_len = 0; + +#define MAIN_READER main_compipe[0] +#define MAIN_WRITER main_compipe[1] +#define DISPATCH_READER dispatch_compipe[0] +#define DISPATCH_WRITER dispatch_compipe[1] + +static int main_compipe[2] = {-1, -1}; +static int dispatch_compipe[2] = {-1, -1}; + +GIOChannel *summary_chan_reader = NULL; + +static void do_changed (MailSummary *summary); + +static gboolean +read_msg (GIOChannel *source, + GIOCondition condition, + gpointer user_data) +{ + MailSummary *summary; + int size; + + summary = g_new0 (MailSummary, 1); + g_io_channel_read (source, (gchar *) summary, + sizeof (MailSummary) / sizeof (gchar), &size); + + if (size != sizeof (MailSummary)) { + g_warning (_("Incomplete message written on pipe!")); + return TRUE; + } + + do_changed (summary); + g_free (summary); + + return TRUE; +} + +/* check_compipes: */ +static void +check_compipes (void) +{ + if (MAIN_READER < 0) { + if (pipe (main_compipe) < 0) { + g_warning ("Call to pipe failed"); + return; + } + + summary_chan_reader = g_io_channel_unix_new (MAIN_READER); + g_io_add_watch (summary_chan_reader, G_IO_IN, read_msg, NULL); + } + + if (DISPATCH_READER < 0) { + if (pipe (dispatch_compipe) < 0) { + g_warning ("Call to pipe failed"); + return; + } + } +} + /* Temporary functions to create the summary FIXME: Need TigerT's designs :) */ static void +do_changed (MailSummary *summary) +{ + char *ret_html, *str1; + int mail = summary->mail; + + str1 = g_strdup_printf (_("Inbox: %d/%d"), + summary->unread, mail); + + ret_html = g_strdup_printf ("
%s
", str1); + g_free (str1); + + executive_summary_component_update (summary->component, ret_html); + g_free (ret_html); + +} + +/* These two callbacks are called from the Camel thread, + which can't make any CORBA calls, or else ORBit locks up, + and likewise the thread that can call ORBit, cannot call + camel. + + So, when the callbacks are triggered, they generate a MailSummary + structure and write this onto a pipe. The ORBit calling thread + detects when something is written to the pipe and creates its own + MailSummary structure, and calls the appropriate CORBA calls. + + Same theory as mail-threads.c, but a lot less complicated + as there is only one way communication, and only one type of message +*/ +static void folder_changed_cb (CamelObject *folder, gpointer event_data, gpointer user_data) { MailSummary *summary; - char *ret_html, *str1, *str2; - int mailread, mailunread; - + int mail; + + summary = (MailSummary *) user_data; + /* Put the summary data onto a pipe */ + + mail = camel_folder_get_message_count (folder); + summary->unread = camel_folder_get_unread_message_count (folder); + summary->mail = mail; + + write (MAIN_WRITER, summary, sizeof (MailSummary)); + queue_len++; + + return; +} + +static void +message_changed_cb (CamelObject *folder, + gpointer event_data, + gpointer user_data) +{ + MailSummary *summary; + int mail; + summary = (MailSummary *)user_data; - mailread = camel_folder_get_message_count (CAMEL_FOLDER (folder)); - mailunread = camel_folder_get_unread_message_count (CAMEL_FOLDER (folder)); - - str1 = g_strdup_printf (_("There %s %d %s."), - (mailread == 1) ? _("is"): _("are"), - mailread, - (mailread == 1) ? _("message"): _("messages")); - str2 = g_strdup_printf (_("There %s %d unread %s."), - (mailunread == 1) ? _("is"): _("are"), - mailunread, - (mailunread == 1) ? _("message"): _("messages")); - - ret_html = g_strdup_printf ("
%s
%s
", str1, str2); - g_free (str1); - g_free (str2); + summary->unread = camel_folder_get_unread_message_count (folder); + summary->mail = camel_folder_get_message_count (folder); - executive_summary_component_update (summary->component, ret_html); - g_free (ret_html); + write (MAIN_WRITER, summary, sizeof (MailSummary)); + queue_len++; + + return; } char * @@ -83,43 +184,45 @@ create_summary_view (ExecutiveSummaryComponent *component, char **title, void *closure) { - char *str1, *str2, *ret_html; - int mailread, mailunread; + char *str1, *ret_html; + int mailread, unread; CamelFolder *folder; CamelException *ex; MailSummary *summary; - ex = camel_exception_new (); - folder = mail_tool_get_local_inbox (ex); - /* Strdup the title */ *title = g_strdup ("Inbox:"); + mail_tool_camel_lock_up (); + ex = camel_exception_new (); + folder = mail_tool_get_local_inbox (ex); + mailread = camel_folder_get_message_count (folder); - mailunread = camel_folder_get_unread_message_count (folder); - - str1 = g_strdup_printf (_("There %s %d %s."), - (mailread == 1) ? _("is"): _("are"), - mailread, - (mailread == 1) ? _("message"): _("messages")); - str2 = g_strdup_printf (_("There %s %d unread %s."), - (mailunread == 1) ? _("is"): _("are"), - mailunread, - (mailunread == 1) ? _("message"): _("messages")); - - ret_html = g_strdup_printf ("
%s
%s
", str1, str2); + unread = camel_folder_get_unread_message_count (folder); + mail_tool_camel_lock_down (); + + str1 = g_strdup_printf (_("Inbox:%d/%d"), + unread, mailread); + + ret_html = g_strdup_printf ("
%s
", str1); g_free (str1); - g_free (str2); summary = g_new (MailSummary, 1); summary->folder = folder; summary->html = ret_html; - summary->mailread = mailread; - summary->mailunread = mailunread; + summary->mail = mailread; + summary->unread = unread; summary->component = component; + check_compipes (); + + mail_tool_camel_lock_up (); camel_object_hook_event (folder, "folder_changed", (CamelObjectEventHookFunc) folder_changed_cb, summary); + camel_object_hook_event (folder, "message_changed", + (CamelObjectEventHookFunc) message_changed_cb, + summary); + mail_tool_camel_lock_down (); return ret_html; } -- cgit v1.2.3