evolution-exchange r1557 - in trunk: . mail
- From: mcrha svn gnome org
- To: svn-commits-list gnome org
- Subject: evolution-exchange r1557 - in trunk: . mail
- Date: Thu, 7 Feb 2008 12:23:44 +0000 (GMT)
Author: mcrha
Date: Thu Feb 7 12:23:43 2008
New Revision: 1557
URL: http://svn.gnome.org/viewvc/evolution-exchange?rev=1557&view=rev
Log:
2008-02-07 Milan Crha <mcrha redhat com>
** Fix for bug #420503
* mail/mail-stub-exchange.c: (process_flags):
Use copies of URLs, because we unlock owner so it can be freed.
** Patch from Srinivasa Ragavan and Bharath Acharya:
* mail/mail-stub-exchange.c: (message_remove_at_index),
(change_message):
Better locks using; the changed_messages array should be unique.
Modified:
trunk/ChangeLog
trunk/mail/mail-stub-exchange.c
Modified: trunk/mail/mail-stub-exchange.c
==============================================================================
--- trunk/mail/mail-stub-exchange.c (original)
+++ trunk/mail/mail-stub-exchange.c Thu Feb 7 12:23:43 2008
@@ -353,6 +353,7 @@
MailStubExchangeMessage *mmsg;
mmsg = mfld->messages->pdata[index];
+ d(printf("Deleting mmsg %p\n", mmsg));
g_static_rec_mutex_lock (&g_changed_msgs_mutex);
g_ptr_array_remove_index (mfld->messages, index);
g_hash_table_remove (mfld->messages_by_uid, mmsg->uid);
@@ -367,14 +368,16 @@
if (mmsg->change_mask || mmsg->tag_updates) {
int i;
+ g_static_rec_mutex_lock (&g_changed_msgs_mutex);
+
for (i = 0; i < mfld->changed_messages->len; i++) {
if (mfld->changed_messages->pdata[i] == (gpointer)mmsg) {
- g_static_rec_mutex_lock (&g_changed_msgs_mutex);
g_ptr_array_remove_index_fast (mfld->changed_messages, i);
- g_static_rec_mutex_unlock (&g_changed_msgs_mutex);
break;
}
}
+ g_static_rec_mutex_unlock (&g_changed_msgs_mutex);
+
g_datalist_clear (&mmsg->tag_updates);
}
@@ -1829,7 +1832,7 @@
for (i = 0; i < mfld->changed_messages->len; i++) {
mmsg = mfld->changed_messages->pdata[i];
-
+ d(printf("Process flags %p\n", mmsg));
if (!mmsg->href) {
d(g_print ("%s:%s:%d: mfld = [%s], type=[%d]\n", __FILE__, __GNUC_PRETTY_FUNCTION__,
__LINE__, mfld->name, mfld->type));
@@ -1839,12 +1842,12 @@
if (mmsg->change_flags & MAIL_STUB_MESSAGE_SEEN) {
if (!seen)
seen = g_ptr_array_new ();
- g_ptr_array_add (seen, strrchr (mmsg->href, '/') + 1);
+ g_ptr_array_add (seen, g_strdup (strrchr (mmsg->href, '/') + 1));
mmsg->flags |= MAIL_STUB_MESSAGE_SEEN;
} else {
if (!unseen)
unseen = g_ptr_array_new ();
- g_ptr_array_add (unseen, strrchr (mmsg->href, '/') + 1);
+ g_ptr_array_add (unseen, g_strdup (strrchr (mmsg->href, '/') + 1));
mmsg->flags &= ~MAIL_STUB_MESSAGE_SEEN;
}
mmsg->change_mask &= ~MAIL_STUB_MESSAGE_SEEN;
@@ -1872,10 +1875,12 @@
if (seen || unseen) {
if (seen) {
mark_read (mfld->folder, seen, TRUE);
+ g_ptr_array_foreach (seen, (GFunc)g_free, NULL);
g_ptr_array_free (seen, TRUE);
}
if (unseen) {
mark_read (mfld->folder, unseen, FALSE);
+ g_ptr_array_foreach (unseen, (GFunc)g_free, NULL);
g_ptr_array_free (unseen, TRUE);
}
@@ -1972,8 +1977,21 @@
change_message (MailStubExchange *mse, MailStubExchangeFolder *mfld,
MailStubExchangeMessage *mmsg)
{
- change_pending (mfld);
- g_ptr_array_add (mfld->changed_messages, mmsg);
+ int i;
+
+ g_static_rec_mutex_lock (&g_changed_msgs_mutex);
+
+ for (i=0; i<mfld->changed_messages->len; i++) {
+ if (mfld->changed_messages->pdata[i] == mmsg)
+ break;
+ }
+
+ if (i == mfld->changed_messages->len) {
+ change_pending (mfld);
+ g_ptr_array_add (mfld->changed_messages, mmsg);
+ }
+ g_static_rec_mutex_unlock (&g_changed_msgs_mutex);
+
if (mfld->flag_timeout)
g_source_remove (mfld->flag_timeout);
mfld->flag_timeout = g_timeout_add (1000, process_flags, mfld);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]