summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meeks <michael.meeks@novell.com>2010-03-04 20:03:12 +0000
committerMichael Meeks <michael.meeks@novell.com>2010-03-04 20:03:12 +0000
commitfb8a1441ce711f9d179b83ce8aa9e4cdd9f3b760 (patch)
treead73155896b5da28ed50118b8c64993f136e099b
parentc59761e781ae3703d74649cfb2b7e9946946daf0 (diff)
downloadevolution-data-server-fb8a1441ce711f9d179b83ce8aa9e4cdd9f3b760.tar.gz
make groupwise locking more granular to improve latency
-rw-r--r--calendar/backends/groupwise/e-cal-backend-groupwise.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/calendar/backends/groupwise/e-cal-backend-groupwise.c b/calendar/backends/groupwise/e-cal-backend-groupwise.c
index 6b3169dac..5316b6a41 100644
--- a/calendar/backends/groupwise/e-cal-backend-groupwise.c
+++ b/calendar/backends/groupwise/e-cal-backend-groupwise.c
@@ -370,6 +370,7 @@ get_deltas (gpointer handle)
kind = e_cal_backend_get_kind (E_CAL_BACKEND (cbgw));
cnc = priv->cnc;
+ container_id = g_strdup (cbgw->priv->container_id);
store = priv->store;
item_list = NULL;
@@ -405,15 +406,14 @@ get_deltas (gpointer handle)
e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EQUAL, "@type", get_element_type (kind));
e_gw_filter_group_conditions (filter, E_GW_FILTER_OP_AND, 2);
- container_id = g_strdup (cbgw->priv->container_id);
PRIV_UNLOCK (priv);
status = e_gw_connection_get_items (cnc, container_id, "attachments recipients message recipientStatus default peek", filter, &item_list);
if (status == E_GW_CONNECTION_STATUS_INVALID_CONNECTION)
status = e_gw_connection_get_items (cnc, container_id, "attachments recipients message recipientStatus default peek", filter, &item_list);
+
PRIV_LOCK (priv);
- g_free (container_id);
g_object_unref (filter);
if (status != E_GW_CONNECTION_STATUS_OK) {
@@ -430,6 +430,8 @@ get_deltas (gpointer handle)
e_cal_backend_store_put_key_value (store, ATTEMPTS_KEY, attempts);
g_free (attempts);
+ g_free (container_id);
+
if (status == E_GW_CONNECTION_STATUS_NO_RESPONSE) {
PRIV_UNLOCK (priv);
return TRUE;
@@ -534,10 +536,16 @@ get_deltas (gpointer handle)
filter = e_gw_filter_new ();
e_gw_filter_add_filter_component (filter, E_GW_FILTER_OP_EQUAL, "@type", get_element_type (kind));
- status = e_gw_connection_create_cursor (cnc, cbgw->priv->container_id, "id iCalId recurrenceKey startDate", filter, &cursor);
+ PRIV_UNLOCK (priv);
+ status = e_gw_connection_create_cursor (cnc, container_id, "id iCalId recurrenceKey startDate", filter, &cursor);
+ PRIV_LOCK (priv);
+
g_object_unref (filter);
if (status != E_GW_CONNECTION_STATUS_OK) {
+
+ g_free (container_id);
+
if (status == E_GW_CONNECTION_STATUS_NO_RESPONSE) {
PRIV_UNLOCK (priv);
return TRUE;
@@ -552,7 +560,9 @@ get_deltas (gpointer handle)
done = FALSE;
while (!done) {
- status = e_gw_connection_read_cal_ids (cnc, cbgw->priv->container_id, cursor, FALSE, CURSOR_ICALID_LIMIT, position, &item_list);
+ PRIV_UNLOCK (priv);
+ status = e_gw_connection_read_cal_ids (cnc, container_id, cursor, FALSE, CURSOR_ICALID_LIMIT, position, &item_list);
+ PRIV_LOCK (priv);
if (status != E_GW_CONNECTION_STATUS_OK) {
if (status == E_GW_CONNECTION_STATUS_NO_RESPONSE) {
goto err_done;
@@ -575,7 +585,9 @@ get_deltas (gpointer handle)
position = E_GW_CURSOR_POSITION_CURRENT;
}
- e_gw_connection_destroy_cursor (cnc, cbgw->priv->container_id, cursor);
+ PRIV_UNLOCK (priv);
+ e_gw_connection_destroy_cursor (cnc, container_id, cursor);
+ PRIV_LOCK (priv);
e_cal_backend_store_freeze_changes (store);
uid_array = g_ptr_array_new ();
@@ -638,10 +650,12 @@ get_deltas (gpointer handle)
}
if (needs_to_get) {
- e_gw_connection_get_items_from_ids (priv->cnc,
- priv->container_id,
- "attachments recipients message recipientStatus default peek",
- uid_array, &item_list);
+ PRIV_UNLOCK (priv);
+ e_gw_connection_get_items_from_ids (
+ cnc, container_id,
+ "attachments recipients message recipientStatus default peek",
+ uid_array, &item_list);
+ PRIV_LOCK (priv);
for (l = item_list; l != NULL; l = l->next) {
ECalComponent *comp = NULL;
@@ -673,6 +687,8 @@ get_deltas (gpointer handle)
g_ptr_array_free (uid_array, TRUE);
err_done:
+ g_free (container_id);
+
if (item_list) {
g_list_free (item_list);
item_list = NULL;
@@ -1695,6 +1711,9 @@ e_cal_backend_groupwise_get_object_list (ECalBackendSync *backend, EDataCal *cal
}
}
+ g_message (G_STRLOC ": object list length %d from %d objects",
+ g_list_length (*objects), g_slist_length (components));
+
g_object_unref (cbsexp);
g_slist_foreach (components, (GFunc) g_object_unref, NULL);
g_slist_free (components);