File eds-cpu-g_timeout-hibernate.patch of Package evolution-data-server-2.6
--- addressbook/backends/groupwise/e-book-backend-groupwise.c.orig 2007-04-20 00:04:14.000000000 +0530
+++ addressbook/backends/groupwise/e-book-backend-groupwise.c 2007-04-20 00:13:13.000000000 +0530
@@ -73,8 +73,7 @@ struct _EBookBackendGroupwisePrivate {
int mode;
int cache_timeout;
EBookBackendSummary *summary;
- GMutex *update_cache_mutex;
- GMutex *update_mutex;
+ int update_atom;
DB *file_db;
DB_ENV *env;
/* for future use */
@@ -91,6 +90,8 @@ static struct {
#define ELEMENT_TYPE_COMPLEX 0x02 /* fields which require explicit functions to set values into EContact and EGwItem */
#define SUMMARY_FLUSH_TIMEOUT 5000
+#define d(x)
+
gboolean enable_debug = FALSE;
static void populate_emails (EContact *contact, gpointer data);
@@ -2785,7 +2786,10 @@ update_cache (EBookBackendGroupwise *ebg
if (!ebgw)
return FALSE;
- g_mutex_lock (ebgw->priv->update_cache_mutex);
+ if (!g_atomic_int_compare_and_exchange (&ebgw->priv->update_atom, 0, 1)) {
+ d(g_print("%s:%s:%d: An updater thread is running already\n", __FILE__, __PRETTY_FUNCTION__, __LINE__));
+ return TRUE; /* As another thread is already running, we return a TRUE as a sign of "not a failure" */
+ }
if (enable_debug) {
g_get_current_time(&start);
@@ -2825,7 +2829,7 @@ update_cache (EBookBackendGroupwise *ebg
bonobo_object_unref (book_view);
if (enable_debug)
printf("No connection with the server \n");
- g_mutex_unlock (ebgw->priv->update_cache_mutex);
+ g_atomic_int_compare_and_exchange (&ebgw->priv->update_atom, 1, 0);
return FALSE;
}
@@ -2880,7 +2884,7 @@ update_cache (EBookBackendGroupwise *ebg
printf("updating the cache for %s complated in %ld.%03ld seconds for %d contacts\n",
ebgw->priv->book_name, diff / 1000, diff % 1000, contact_num);
}
- g_mutex_unlock (ebgw->priv->update_cache_mutex);
+ g_atomic_int_compare_and_exchange (&ebgw->priv->update_atom, 1, 0);
return FALSE;
}
@@ -2897,14 +2901,18 @@ update_address_book_deltas (EBookBackend
EDataBookView *book_view;
GroupwiseBackendSearchClosure *closure;
EGwItem *item;
+ EBookBackendGroupwisePrivate *priv;
if (!ebgw)
return FALSE;
- EBookBackendGroupwisePrivate *priv = ebgw->priv;
-
- g_mutex_lock (priv->update_mutex);
+ priv = ebgw->priv;
+ if (!g_atomic_int_compare_and_exchange (&priv->update_atom, 0, 1)) {
+ d(g_print("%s:%s:%d: An updater thread is running already\n", __FILE__, __PRETTY_FUNCTION__, __LINE__));
+ return TRUE; /* As another thread is already running, we return a TRUE as a sign of "not a failure" */
+ }
+
if (enable_debug)
printf("\nupdating GroupWise system address book cache \n");
@@ -2917,7 +2925,7 @@ update_address_book_deltas (EBookBackend
if (status != E_GW_CONNECTION_STATUS_OK) {
if (enable_debug)
printf("No connection with the server \n");
- g_mutex_unlock (priv->update_mutex);
+ g_atomic_int_compare_and_exchange (&priv->update_atom, 1, 0);
return FALSE;
}
@@ -2930,7 +2938,7 @@ update_address_book_deltas (EBookBackend
add_sequence_to_cache (priv->file_db, server_first_sequence,
server_last_sequence, server_last_po_rebuild_time);
ebgw->priv->file_db->sync (ebgw->priv->file_db, 0);
- g_mutex_unlock (priv->update_mutex);
+ g_atomic_int_compare_and_exchange (&priv->update_atom, 1, 0);
return TRUE;
}
@@ -2947,7 +2955,7 @@ update_address_book_deltas (EBookBackend
add_sequence_to_cache (priv->file_db, server_first_sequence,
server_last_sequence, server_last_po_rebuild_time);
ebgw->priv->file_db->sync (ebgw->priv->file_db, 0);
- g_mutex_unlock (priv->update_mutex);
+ g_atomic_int_compare_and_exchange (&priv->update_atom, 1, 0);
return TRUE;
}
@@ -3002,7 +3010,7 @@ update_address_book_deltas (EBookBackend
printf("sequence differs but no changes found !!!\n");
add_sequence_to_cache (priv->file_db, server_first_sequence,
server_last_sequence, server_last_po_rebuild_time);
- g_mutex_unlock (priv->update_mutex);
+ g_atomic_int_compare_and_exchange (&priv->update_atom, 1, 0);
return TRUE;
}
sync_required = TRUE;
@@ -3128,7 +3136,7 @@ update_address_book_deltas (EBookBackend
printf("updating GroupWise system address book cache took %ld.%03ld seconds for %d changes\n",
diff / 1000, diff % 1000, contact_num);
}
- g_mutex_unlock(priv->update_mutex);
+ g_atomic_int_compare_and_exchange (&priv->update_atom, 1, 0);
return TRUE;
}
@@ -3756,11 +3764,6 @@ e_book_backend_groupwise_dispose (GObjec
g_source_remove (bgw->priv->cache_timeout);
bgw->priv->cache_timeout = 0;
}
- if (bgw->priv->update_mutex)
- g_mutex_free (bgw->priv->update_mutex);
- if (bgw->priv->update_cache_mutex)
- g_mutex_free (bgw->priv->update_cache_mutex);
-
g_free (bgw->priv);
bgw->priv = NULL;
}
@@ -3817,8 +3820,6 @@ e_book_backend_groupwise_init (EBookBack
priv->cnc = NULL;
priv->original_uri = NULL;
priv->cache_timeout = 0;
- priv->update_mutex = g_mutex_new();
- priv->update_cache_mutex = g_mutex_new ();
priv->reserved1 = NULL;
backend->priv = priv;
--- calendar/backends/groupwise/e-cal-backend-groupwise.c.orig 2007-04-19 23:17:01.000000000 +0530
+++ calendar/backends/groupwise/e-cal-backend-groupwise.c 2007-04-20 00:13:32.000000000 +0530
@@ -93,6 +93,8 @@ static ECalBackendClass *parent_class =
#define CURSOR_ITEM_LIMIT 100
#define CURSOR_ICALID_LIMIT 500
+#define d(x)
+
EGwConnection *
e_cal_backend_groupwise_get_connection (ECalBackendGroupwise *cbgw) {
@@ -289,7 +291,7 @@ get_deltas (gpointer handle)
char *time_string = NULL;
char t_str [100];
const char *serv_time;
- static GStaticMutex connecting = G_STATIC_MUTEX_INIT;
+ static int connecting_atom = 0;
const char *time_interval_string;
const char *key = "attempts";
const char *attempts;
@@ -319,7 +321,10 @@ get_deltas (gpointer handle)
attempts = e_cal_backend_cache_get_key_value (cache, key);
- g_static_mutex_lock (&connecting);
+ if (!g_atomic_int_compare_and_exchange (&connecting_atom, 0, 1)) {
+ d(g_print("%s:%s:%d: An updater thread is running already\n", __FILE__, __PRETTY_FUNCTION__, __LINE__));
+ return TRUE; /* As another thread is already running, we return a TRUE as a sign of "not a failure" */
+ }
serv_time = e_cal_backend_cache_get_server_utc_time (cache);
if (serv_time) {
@@ -364,13 +369,13 @@ get_deltas (gpointer handle)
}
if (status == E_GW_CONNECTION_STATUS_NO_RESPONSE) {
- g_static_mutex_unlock (&connecting);
+ g_atomic_int_compare_and_exchange (&connecting_atom, 1, 0);
return TRUE;
}
msg = e_gw_connection_get_error_message (status);
- g_static_mutex_unlock (&connecting);
+ g_atomic_int_compare_and_exchange (&connecting_atom, 1, 0);
return TRUE;
}
@@ -446,12 +451,12 @@ get_deltas (gpointer handle)
if (status != E_GW_CONNECTION_STATUS_OK) {
if (status == E_GW_CONNECTION_STATUS_NO_RESPONSE) {
- g_static_mutex_unlock (&connecting);
+ g_atomic_int_compare_and_exchange (&connecting_atom, 1, 0);
return TRUE;
}
e_cal_backend_groupwise_notify_error_code (cbgw, status);
- g_static_mutex_unlock (&connecting);
+ g_atomic_int_compare_and_exchange (&connecting_atom, 1, 0);
return TRUE;
}
@@ -462,11 +467,11 @@ get_deltas (gpointer handle)
status = e_gw_connection_read_cal_ids (cnc, cbgw->priv->container_id, cursor, FALSE, CURSOR_ICALID_LIMIT, position, &item_list);
if (status != E_GW_CONNECTION_STATUS_OK) {
if (status == E_GW_CONNECTION_STATUS_NO_RESPONSE) {
- g_static_mutex_unlock (&connecting);
+ g_atomic_int_compare_and_exchange (&connecting_atom, 1, 0);
return TRUE;
}
e_cal_backend_groupwise_notify_error_code (cbgw, status);
- g_static_mutex_unlock (&connecting);
+ g_atomic_int_compare_and_exchange (&connecting_atom, 1, 0);
return TRUE;
}
@@ -601,7 +606,7 @@ get_deltas (gpointer handle)
g_slist_free (cache_keys);
}
- g_static_mutex_unlock (&connecting);
+ g_atomic_int_compare_and_exchange (&connecting_atom, 1, 0);
return TRUE;
}