[evolution-ews/evolution-ews-3-12] Simplify memory management around ews_sync_mi_flags() function
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-ews/evolution-ews-3-12] Simplify memory management around ews_sync_mi_flags() function
- Date: Wed, 26 Mar 2014 16:02:30 +0000 (UTC)
commit 2d869f1c12529fbd60cf0d54e0454a26c4217833
Author: Milan Crha <mcrha redhat com>
Date: Wed Mar 26 16:57:16 2014 +0100
Simplify memory management around ews_sync_mi_flags() function
It's quite hard to follow memory management of the calls if the called
function sometimes frees the passed-in data and sometimes not, thus
the actual simplification here is to make it clear whom is responsible
for the memory free. It's always the caller now. This should also
avoid any memory leaks in the related code in the future.
src/camel/camel-ews-folder.c | 47 +++++++++++++++++++---------------------
src/server/e-ews-connection.c | 20 ++++++++--------
src/server/e-ews-connection.h | 8 +++---
3 files changed, 36 insertions(+), 39 deletions(-)
---
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index 7ed46c1..b22a7ec 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -94,7 +94,7 @@ struct _CamelEwsFolderPrivate {
extern gint camel_application_is_exiting;
-static gboolean ews_delete_messages (CamelFolder *folder, GSList *deleted_items, gboolean expunge,
GCancellable *cancellable, GError **error);
+static gboolean ews_delete_messages (CamelFolder *folder, const GSList *deleted_items, gboolean expunge,
GCancellable *cancellable, GError **error);
static gboolean ews_refresh_info_sync (CamelFolder *folder, GCancellable *cancellable, GError **error);
#define d(x)
@@ -838,13 +838,14 @@ static void
msg_update_flags (ESoapMessage *msg,
gpointer user_data)
{
- GSList *mi_list = user_data;
+ /* the mi_list is owned by the caller */
+ const GSList *mi_list = user_data, *iter;
CamelEwsMessageInfo *mi;
- while ((mi = g_slist_nth_data (mi_list, 0))) {
+ for (iter = mi_list; iter; iter = g_slist_next (iter)) {
guint32 flags_changed;
- mi_list = g_slist_remove (mi_list, mi);
+ mi = iter->data;
flags_changed = mi->server_flags ^ mi->info.flags;
@@ -926,15 +927,12 @@ msg_update_flags (ESoapMessage *msg,
mi->info.dirty = TRUE;
camel_folder_summary_touch (mi->info.summary);
-
- camel_message_info_unref (mi);
}
- /* Don't think we need to free the list; we already freed every element */
}
static gboolean
ews_sync_mi_flags (CamelFolder *folder,
- GSList *mi_list,
+ const GSList *mi_list,
GCancellable *cancellable,
GError **error)
{
@@ -955,7 +953,7 @@ ews_sync_mi_flags (CamelFolder *folder,
cnc, EWS_PRIORITY_LOW,
"AlwaysOverwrite", "SaveOnly",
NULL, NULL,
- msg_update_flags, mi_list, NULL,
+ msg_update_flags, (gpointer) mi_list, NULL,
cancellable, &local_error);
if (local_error) {
@@ -970,7 +968,7 @@ ews_sync_mi_flags (CamelFolder *folder,
static gboolean
ews_save_flags (CamelFolder *folder,
- GSList *mi_list,
+ const GSList *mi_list,
GCancellable *cancellable,
GError **error)
{
@@ -1023,7 +1021,7 @@ ews_folder_is_of_type (CamelFolder *folder,
static gboolean
ews_move_to_junk_folder (CamelFolder *folder,
- GSList *junk_uids,
+ const GSList *junk_uids,
GCancellable *cancellable,
GError **error)
{
@@ -1035,7 +1033,6 @@ ews_move_to_junk_folder (CamelFolder *folder,
if (ews_folder_is_of_type (folder, CAMEL_FOLDER_TYPE_JUNK)) {
/* cannot move to itself, but treat it as success */
- g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
return TRUE;
}
@@ -1073,7 +1070,7 @@ ews_move_to_junk_folder (CamelFolder *folder,
if (status) {
CamelFolderChangeInfo *changes;
- GSList *iter;
+ const GSList *iter;
changes = camel_folder_change_info_new ();
@@ -1100,8 +1097,6 @@ ews_move_to_junk_folder (CamelFolder *folder,
camel_ews_store_maybe_disconnect (ews_store, local_error);
g_propagate_error (error, local_error);
}
-
- g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
}
g_object_unref (cnc);
@@ -1176,6 +1171,7 @@ ews_synchronize_sync (CamelFolder *folder,
if (mi_list_len == EWS_MAX_FETCH_COUNT) {
success = ews_save_flags (folder, mi_list, cancellable, &local_error);
+ g_slist_free_full (mi_list, camel_message_info_unref);
mi_list = NULL;
mi_list_len = 0;
}
@@ -1183,16 +1179,15 @@ ews_synchronize_sync (CamelFolder *folder,
if (mi_list != NULL && success)
success = ews_save_flags (folder, mi_list, cancellable, &local_error);
+ g_slist_free_full (mi_list, camel_message_info_unref);
if (deleted_uids && success)
success = ews_delete_messages (folder, deleted_uids, ews_folder_is_of_type (folder,
CAMEL_FOLDER_TYPE_TRASH), cancellable, &local_error);
- else
- g_slist_free_full (deleted_uids, (GDestroyNotify) camel_pstring_free);
+ g_slist_free_full (deleted_uids, (GDestroyNotify) camel_pstring_free);
if (junk_uids && success)
success = ews_move_to_junk_folder (folder, junk_uids, cancellable, &local_error);
- else
- g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
+ g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
camel_folder_summary_save_to_db (folder->summary, NULL);
camel_folder_summary_free_array (uids);
@@ -1862,6 +1857,7 @@ ews_transfer_messages_to_sync (CamelFolder *source,
if (mi_list_len == EWS_MAX_FETCH_COUNT) {
success = ews_save_flags (source, mi_list, cancellable, &local_error);
+ g_slist_free_full (mi_list, camel_message_info_unref);
mi_list = NULL;
mi_list_len = 0;
}
@@ -1869,6 +1865,7 @@ ews_transfer_messages_to_sync (CamelFolder *source,
if (mi_list != NULL && success)
success = ews_save_flags (source, mi_list, cancellable, &local_error);
+ g_slist_free_full (mi_list, camel_message_info_unref);
ids = g_slist_reverse (ids);
@@ -1971,7 +1968,7 @@ ews_transfer_messages_to_sync (CamelFolder *source,
static gboolean
ews_delete_messages_from_server (CamelEwsStore *ews_store,
- GSList *deleted_items,
+ const GSList *deleted_items,
EwsDeleteType delete_type,
GCancellable *cancellable,
GError **error)
@@ -1992,15 +1989,15 @@ ews_delete_messages_from_server (CamelEwsStore *ews_store,
static void
ews_delete_messages_from_folder (CamelFolder *folder,
- GSList *deleted_items)
+ const GSList *deleted_items)
{
CamelFolderChangeInfo *changes;
- GSList *l;
+ const GSList *iter;
changes = camel_folder_change_info_new ();
- for (l = deleted_items; l != NULL; l = l->next) {
- const gchar *uid = l->data;
+ for (iter = deleted_items; iter != NULL; iter = iter->next) {
+ const gchar *uid = iter->data;
camel_folder_summary_lock (folder->summary);
camel_folder_change_info_remove_uid (changes, uid);
@@ -2019,7 +2016,7 @@ ews_delete_messages_from_folder (CamelFolder *folder,
static gboolean
ews_delete_messages (CamelFolder *folder,
- GSList *deleted_items,
+ const GSList *deleted_items,
gboolean expunge,
GCancellable *cancellable,
GError **error)
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 3459f43..1fad03d 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -4423,7 +4423,7 @@ delete_item_response_cb (ESoapResponse *response,
void
e_ews_connection_delete_items (EEwsConnection *cnc,
gint pri,
- GSList *ids,
+ const GSList *ids,
EwsDeleteType delete_type,
EwsSendMeetingCancellationsType send_cancels,
EwsAffectedTaskOccurrencesType affected_tasks,
@@ -4434,7 +4434,7 @@ e_ews_connection_delete_items (EEwsConnection *cnc,
ESoapMessage *msg;
GSimpleAsyncResult *simple;
EwsAsyncData *async_data;
- GSList *l;
+ const GSList *iter;
g_return_if_fail (cnc != NULL);
@@ -4461,8 +4461,8 @@ e_ews_connection_delete_items (EEwsConnection *cnc,
e_soap_message_start_element (msg, "ItemIds", "messages", NULL);
- for (l = ids; l != NULL; l = g_slist_next (l))
- e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id",
l->data);
+ for (iter = ids; iter != NULL; iter = g_slist_next (iter))
+ e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id",
iter->data);
e_soap_message_end_element (msg);
@@ -4584,7 +4584,7 @@ e_ews_connection_delete_items_finish (EEwsConnection *cnc,
gboolean
e_ews_connection_delete_items_sync (EEwsConnection *cnc,
gint pri,
- GSList *ids,
+ const GSList *ids,
EwsDeleteType delete_type,
EwsSendMeetingCancellationsType send_cancels,
EwsAffectedTaskOccurrencesType affected_tasks,
@@ -6028,7 +6028,7 @@ e_ews_connection_move_items (EEwsConnection *cnc,
gint pri,
const gchar *folder_id,
gboolean docopy,
- GSList *ids,
+ const GSList *ids,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data)
@@ -6036,7 +6036,7 @@ e_ews_connection_move_items (EEwsConnection *cnc,
ESoapMessage *msg;
GSimpleAsyncResult *simple;
EwsAsyncData *async_data;
- GSList *l;
+ const GSList *iter;
g_return_if_fail (cnc != NULL);
@@ -6070,8 +6070,8 @@ e_ews_connection_move_items (EEwsConnection *cnc,
e_soap_message_end_element (msg); /* ToFolderId */
e_soap_message_start_element (msg, "ItemIds", "messages", NULL);
- for (l = ids; l != NULL; l = g_slist_next (l))
- e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id",
l->data);
+ for (iter = ids; iter != NULL; iter = g_slist_next (iter))
+ e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id",
iter->data);
e_soap_message_end_element (msg); /* ItemIds */
e_ews_message_write_footer (msg);
@@ -6137,7 +6137,7 @@ e_ews_connection_move_items_sync (EEwsConnection *cnc,
gint pri,
const gchar *folder_id,
gboolean docopy,
- GSList *ids,
+ const GSList *ids,
GSList **items,
GCancellable *cancellable,
GError **error)
diff --git a/src/server/e-ews-connection.h b/src/server/e-ews-connection.h
index a998441..300c1d4 100644
--- a/src/server/e-ews-connection.h
+++ b/src/server/e-ews-connection.h
@@ -574,7 +574,7 @@ gboolean e_ews_connection_get_items_sync (EEwsConnection *cnc,
void e_ews_connection_delete_items (EEwsConnection *cnc,
gint pri,
- GSList *ids,
+ const GSList *ids,
EwsDeleteType delete_type,
EwsSendMeetingCancellationsType send_cancels,
EwsAffectedTaskOccurrencesType affected_tasks,
@@ -588,7 +588,7 @@ gboolean e_ews_connection_delete_items_finish
gboolean e_ews_connection_delete_items_sync
(EEwsConnection *cnc,
gint pri,
- GSList *ids,
+ const GSList *ids,
EwsDeleteType delete_type,
EwsSendMeetingCancellationsType send_cancels,
EwsAffectedTaskOccurrencesType affected_tasks,
@@ -892,7 +892,7 @@ void e_ews_connection_move_items (EEwsConnection *cnc,
gint pri,
const gchar *folder_id,
gboolean docopy,
- GSList *ids,
+ const GSList *ids,
GCancellable *cancellable,
GAsyncReadyCallback callback,
gpointer user_data);
@@ -906,7 +906,7 @@ gboolean e_ews_connection_move_items_sync
gint pri,
const gchar *folder_id,
gboolean docopy,
- GSList *ids,
+ const GSList *ids,
GSList **items_ret,
GCancellable *cancellable,
GError **error);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]