diff options
-rw-r--r-- | mail/ChangeLog | 14 | ||||
-rw-r--r-- | mail/mail-mt.c | 74 |
2 files changed, 61 insertions, 27 deletions
diff --git a/mail/ChangeLog b/mail/ChangeLog index 728e4adf5f..5a2a0e4cfe 100644 --- a/mail/ChangeLog +++ b/mail/ChangeLog @@ -1,3 +1,17 @@ +2005-12-13 Tor Lillqvist <tml@novell.com> + + * mail-mt.c: Add copyright blurb. Include just <gtk/gtk.h> and not + a handful of individual gtk headers. Harmonize #include order and + syntax. Use pthread_equal() to compare pthread_t values. Use + separate flag field to indicate whether a pthread_t field is valid + or not. Use e_util_pthread_id() in debugging output. + + (em_channel_setup): Call g_io_channel_win32_new_socket() on Win32 + instead of g_io_channel_unix_new(). This avoids the occasional + "giowin32.c:1661: 12 is both a file descriptor and a socket, file + descriptor interpretation assumed." style warnings, which indicate + a real problem in this case. + 2005-12-12 Karsten Bräckelmann <guenther@rudersport.de> * em-folder-view.c: Mail Context Menu re-ordered correctly, diff --git a/mail/mail-mt.c b/mail/mail-mt.c index c21d3008b1..18d9b1eabf 100644 --- a/mail/mail-mt.c +++ b/mail/mail-mt.c @@ -1,6 +1,22 @@ -#ifdef HAVE_CONFIG_H +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this program; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + * + */ + #include <config.h> -#endif #include <stdio.h> #include <string.h> @@ -10,22 +26,20 @@ #include <glib.h> -#include <gtk/gtkmain.h> -#include <gtk/gtkwidget.h> -#include <gtk/gtkdialog.h> -#include <gtk/gtkstock.h> -#include <gtk/gtkmessagedialog.h> +#include <gtk/gtk.h> #include <libgnome/gnome-i18n.h> -#include <misc/e-gui-utils.h> -#include "libedataserver/e-msgport.h" +#include <libedataserver/e-msgport.h> +#include <libedataserver/e-util.h> + +#include <camel/camel-url.h> +#include <camel/camel-operation.h> + +#include "misc/e-gui-utils.h" #include "e-util/e-error.h" +#include "e-util/e-icon-factory.h" #include "e-activity-handler.h" -#include <e-util/e-icon-factory.h> - -#include "camel/camel-url.h" -#include "camel/camel-operation.h" #include "mail-config.h" #include "mail-component.h" @@ -41,8 +55,8 @@ static void set_stop(int sensitive); static void mail_operation_status(struct _CamelOperation *op, const char *what, int pc, void *data); #ifdef LOG_LOCKS -#define MAIL_MT_LOCK(x) (log_locks?fprintf(log, "%ld: lock " # x "\n", pthread_self()):0, pthread_mutex_lock(&x)) -#define MAIL_MT_UNLOCK(x) (log_locks?fprintf(log, "%ld: unlock " # x "\n", pthread_self()): 0, pthread_mutex_unlock(&x)) +#define MAIL_MT_LOCK(x) (log_locks?fprintf(log, "%" G_GINT64_MODIFIER "x: lock " # x "\n", e_util_pthread_id(pthread_self())):0, pthread_mutex_lock(&x)) +#define MAIL_MT_UNLOCK(x) (log_locks?fprintf(log, "%" G_GINT64_MODIFIER "x: unlock " # x "\n", e_util_pthread_id(pthread_self())): 0, pthread_mutex_unlock(&x)) #else #define MAIL_MT_LOCK(x) pthread_mutex_lock(&x) #define MAIL_MT_UNLOCK(x) pthread_mutex_unlock(&x) @@ -98,8 +112,8 @@ void *mail_msg_new(mail_msg_op_t *ops, EMsgPort *reply_port, size_t size) fprintf(log, "Logging async operations\n"); if (log_locks) { - fprintf(log, "Logging lock operations, mail_gui_thread = %ld\n\n", mail_gui_thread); - fprintf(log, "%ld: lock mail_msg_lock\n", pthread_self()); + fprintf(log, "Logging lock operations, mail_gui_thread = %" G_GINT64_MODIFIER "x\n\n", e_util_pthread_id(mail_gui_thread)); + fprintf(log, "%" G_GINT64_MODIFIER "x: lock mail_msg_lock\n", e_util_pthread_id(pthread_self())); } } else { g_warning ("Could not open log file: %s", strerror(errno)); @@ -294,7 +308,7 @@ void mail_msg_cancel(unsigned int msgid) void mail_msg_wait(unsigned int msgid) { struct _mail_msg *m; - int ismain = pthread_self() == mail_gui_thread; + int ismain = pthread_equal(pthread_self(), mail_gui_thread); if (ismain) { MAIL_MT_LOCK(mail_msg_lock); @@ -333,7 +347,7 @@ int mail_msg_active(unsigned int msgid) void mail_msg_wait_all(void) { - int ismain = pthread_self() == mail_gui_thread; + int ismain = pthread_equal(pthread_self(), mail_gui_thread); if (ismain) { MAIL_MT_LOCK(mail_msg_lock); @@ -537,7 +551,7 @@ mail_msg_received(EThread *e, EMsg *msg, void *data) #ifdef LOG_OPS if (log_ops) - fprintf(log, "%p: Received at thread %ld: '%s'\n", m, pthread_self(), text); + fprintf(log, "%p: Received at thread %" G_GINT64_MODIFIER "x: '%s'\n", m, e_util_pthread_id(pthread_self()), text); #endif d(printf("message received at thread\n")); @@ -548,7 +562,7 @@ mail_msg_received(EThread *e, EMsg *msg, void *data) #ifdef LOG_OPS else if (log_ops) - fprintf(log, "%p: Received at thread %ld\n", m, pthread_self()); + fprintf(log, "%p: Received at thread %" G_GINT64_MODIFIER "x\n", m, e_util_pthread_id(pthread_self())); #endif if (m->ops->receive_msg) { @@ -589,7 +603,11 @@ em_channel_setup(EMsgPort **port, GIOChannel **channel, GIOFunc func) guint id; *port = e_msgport_new(); +#ifndef G_OS_WIN32 *channel = g_io_channel_unix_new(e_msgport_fd(*port)); +#else + *channel = g_io_channel_win32_new_socket(e_msgport_fd(*port)); +#endif source = g_io_create_watch(*channel, G_IO_IN); g_source_set_callback(source, (GSourceFunc)func, *port, NULL); g_source_set_can_recurse(source, FALSE); @@ -640,6 +658,7 @@ struct _proxy_msg { mail_async_event_t type; pthread_t thread; + int have_thread; MailAsyncFunc func; void *o; @@ -653,8 +672,9 @@ do_async_event(struct _mail_msg *mm) struct _proxy_msg *m = (struct _proxy_msg *)mm; m->thread = pthread_self(); + m->have_thread = TRUE; m->func(m->o, m->event_data, m->data); - m->thread = ~0; + m->have_thread = FALSE; g_mutex_lock(m->ea->lock); m->ea->tasks = g_slist_remove(m->ea->tasks, m); @@ -691,7 +711,7 @@ int mail_async_event_emit(MailAsyncEvent *ea, mail_async_event_t type, MailAsync { struct _proxy_msg *m; int id; - int ismain = pthread_self() == mail_gui_thread; + int ismain = pthread_equal(pthread_self(), mail_gui_thread); /* we dont have a reply port for this, we dont care when/if it gets executed, just queue it */ m = mail_msg_new(&async_event_op, NULL, sizeof(*m)); @@ -701,7 +721,7 @@ int mail_async_event_emit(MailAsyncEvent *ea, mail_async_event_t type, MailAsync m->data = data; m->ea = ea; m->type = type; - m->thread = ~0; + m->have_thread = FALSE; id = m->msg.seq; g_mutex_lock(ea->lock); @@ -731,7 +751,7 @@ int mail_async_event_destroy(MailAsyncEvent *ea) while (ea->tasks) { m = ea->tasks->data; id = m->msg.seq; - if (m->thread == thread) { + if (m->have_thread && pthread_equal(m->thread, thread)) { g_warning("Destroying async event from inside an event, returning EDEADLK"); g_mutex_unlock(ea->lock); errno = EDEADLK; @@ -825,7 +845,7 @@ void *mail_call_main(mail_call_t type, MailMainFunc func, ...) void *ret; va_list ap; EMsgPort *reply = NULL; - int ismain = pthread_self() == mail_gui_thread; + int ismain = pthread_equal(pthread_self(), mail_gui_thread); va_start(ap, func); @@ -915,7 +935,7 @@ static void do_op_status(struct _mail_msg *mm) char *out, *p, *o, c; int pc; - g_assert (mail_gui_thread == pthread_self ()); + g_assert (pthread_equal(mail_gui_thread, pthread_self ())); MAIL_MT_LOCK (mail_msg_lock); |