[evolution-data-server] Prefer GSlice over heap allocation for short-lived structures



commit 604ba98559758f8002a94869c58ddc693fbc2e51
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jan 21 18:50:52 2020 +0100

    Prefer GSlice over heap allocation for short-lived structures
    
    It might be quicker to use GSlice than to allocate new memory on the heap,
    thus let's try to benefit from it.

 .../libedata-book/e-book-backend-sexp.c            | 21 ++++----
 src/addressbook/libedata-book/e-book-cache.c       |  4 +-
 .../libedata-book/e-book-meta-backend.c            |  4 +-
 src/calendar/libecal/e-cal-check-timezones.c       |  4 +-
 src/calendar/libecal/e-cal-client.c                | 56 +++++++++++-----------
 .../libecal/e-cal-component-alarm-instance.c       |  4 +-
 .../libecal/e-cal-component-alarm-repeat.c         |  4 +-
 .../libecal/e-cal-component-alarm-trigger.c        |  8 ++--
 src/calendar/libecal/e-cal-component-alarm.c       |  4 +-
 src/calendar/libecal/e-cal-component-alarms.c      |  4 +-
 src/calendar/libecal/e-cal-component-attendee.c    |  4 +-
 src/calendar/libecal/e-cal-component-datetime.c    |  6 +--
 src/calendar/libecal/e-cal-component-id.c          |  4 +-
 src/calendar/libecal/e-cal-component-organizer.c   |  4 +-
 .../libecal/e-cal-component-parameter-bag.c        |  4 +-
 src/calendar/libecal/e-cal-component-period.c      |  6 +--
 .../libecal/e-cal-component-property-bag.c         |  4 +-
 src/calendar/libecal/e-cal-component-range.c       |  4 +-
 src/calendar/libecal/e-cal-component-text.c        |  4 +-
 src/calendar/libecal/e-cal-recur.c                 |  8 ++--
 src/calendar/libecal/e-reminder-watcher.c          | 22 +++++----
 src/calendar/libedata-cal/e-cal-backend-sexp.c     | 40 +++++++---------
 src/calendar/libedata-cal/e-cal-cache.c            | 14 +++---
 src/calendar/libedata-cal/e-cal-meta-backend.c     |  4 +-
 src/camel/camel-db.c                               |  4 +-
 src/camel/camel-filter-driver.c                    | 10 +++-
 src/camel/camel-folder-summary.c                   |  4 +-
 src/camel/camel-folder.c                           |  4 +-
 src/camel/camel-gpg-context.c                      |  8 ++--
 src/camel/camel-trie.c                             |  4 +-
 src/camel/camel-uid-cache.c                        |  4 +-
 src/camel/camel-url-scanner.c                      |  4 +-
 src/camel/camel-vee-data-cache.c                   | 19 ++++++--
 src/camel/camel-weak-ref-group.c                   |  8 ++--
 .../providers/imapx/camel-imapx-conn-manager.c     | 32 ++++++-------
 src/camel/providers/imapx/camel-imapx-folder.c     |  4 +-
 src/camel/providers/imapx/camel-imapx-job.c        |  4 +-
 src/camel/providers/imapx/camel-imapx-server.c     | 36 ++++++++------
 src/camel/providers/local/camel-mbox-store.c       | 31 +++++++-----
 src/libebackend/e-backend.c                        | 27 +++++++----
 src/libebackend/e-cache.c                          | 12 ++---
 src/libebackend/e-data-factory.c                   | 16 +++----
 src/libebackend/e-server-side-source.c             |  4 +-
 src/libebackend/e-source-registry-server.c         |  4 +-
 src/libebackend/e-sqlite3-vfs.c                    |  4 +-
 src/libebackend/e-user-prompter-server.c           |  4 +-
 src/libebackend/e-user-prompter.c                  |  6 +--
 src/libedataserver/e-credentials.c                 |  8 ++--
 src/libedataserver/e-operation-pool.c              |  4 +-
 src/libedataserver/e-proxy.c                       | 14 ++----
 src/libedataserver/e-source-credentials-provider.c |  4 +-
 src/libedataserver/e-source.c                      |  7 +--
 src/libedataserver/e-webdav-discover.c             |  8 ++--
 src/libedataserver/e-webdav-session.c              | 16 +++----
 .../e-credentials-prompter-impl-oauth2.c           |  4 +-
 src/libedataserverui/e-credentials-prompter.c      | 17 ++++---
 src/libedataserverui/e-reminders-widget.c          |  4 +-
 src/libedataserverui/e-trust-prompt.c              |  4 +-
 src/libedataserverui/e-webdav-discover-widget.c    |  8 ++--
 59 files changed, 315 insertions(+), 277 deletions(-)
---
diff --git a/src/addressbook/libedata-book/e-book-backend-sexp.c 
b/src/addressbook/libedata-book/e-book-backend-sexp.c
index f6946e5c1..18497cf77 100644
--- a/src/addressbook/libedata-book/e-book-backend-sexp.c
+++ b/src/addressbook/libedata-book/e-book-backend-sexp.c
@@ -32,20 +32,19 @@
 #include <locale.h>
 #include <string.h>
 
-typedef struct _SearchContext SearchContext;
 typedef gboolean (*CompareFunc) (const gchar *, const gchar *, const gchar *);
 
+typedef struct _SearchContext {
+       EContact *contact;
+} SearchContext;
+
 struct _EBookBackendSExpPrivate {
        ESExp *search_sexp;
        gchar *text;
-       SearchContext *search_context;
+       SearchContext search_context;
        GRecMutex search_context_lock;
 };
 
-struct _SearchContext {
-       EContact *contact;
-};
-
 G_DEFINE_TYPE_WITH_PRIVATE (EBookBackendSExp, e_book_backend_sexp, G_TYPE_OBJECT)
 
 static gboolean
@@ -1085,7 +1084,6 @@ book_backend_sexp_finalize (GObject *object)
 
        g_object_unref (priv->search_sexp);
        g_free (priv->text);
-       g_free (priv->search_context);
 
        g_rec_mutex_clear (&priv->search_context_lock);
 
@@ -1106,7 +1104,6 @@ static void
 e_book_backend_sexp_init (EBookBackendSExp *sexp)
 {
        sexp->priv = e_book_backend_sexp_get_instance_private (sexp);
-       sexp->priv->search_context = g_new (SearchContext, 1);
 
        g_rec_mutex_init (&sexp->priv->search_context_lock);
 }
@@ -1157,13 +1154,13 @@ e_book_backend_sexp_new (const gchar *text)
                                sexp->priv->search_sexp, 0,
                                symbols[ii].name,
                                (ESExpIFunc *) symbols[ii].func,
-                               sexp->priv->search_context);
+                               &(sexp->priv->search_context));
                } else {
                        e_sexp_add_function (
                                sexp->priv->search_sexp, 0,
                                symbols[ii].name,
                                symbols[ii].func,
-                               sexp->priv->search_context);
+                               &(sexp->priv->search_context));
                }
        }
 
@@ -1219,13 +1216,13 @@ e_book_backend_sexp_match_contact (EBookBackendSExp *sexp,
 
        e_book_backend_sexp_lock (sexp);
 
-       sexp->priv->search_context->contact = g_object_ref (contact);
+       sexp->priv->search_context.contact = g_object_ref (contact);
 
        r = e_sexp_eval (sexp->priv->search_sexp);
 
        retval = (r && r->type == ESEXP_RES_BOOL && r->value.boolean);
 
-       g_object_unref (sexp->priv->search_context->contact);
+       g_object_unref (sexp->priv->search_context.contact);
 
        e_sexp_result_free (sexp->priv->search_sexp, r);
 
diff --git a/src/addressbook/libedata-book/e-book-cache.c b/src/addressbook/libedata-book/e-book-cache.c
index 99ca5e135..01877edd3 100644
--- a/src/addressbook/libedata-book/e-book-cache.c
+++ b/src/addressbook/libedata-book/e-book-cache.c
@@ -171,7 +171,7 @@ e_book_cache_search_data_new (const gchar *uid,
        g_return_val_if_fail (uid != NULL, NULL);
        g_return_val_if_fail (vcard != NULL, NULL);
 
-       data = g_new0 (EBookCacheSearchData, 1);
+       data = g_slice_new0 (EBookCacheSearchData);
        data->uid = g_strdup (uid);
        data->vcard = g_strdup (vcard);
        data->extra = g_strdup (extra);
@@ -216,7 +216,7 @@ e_book_cache_search_data_free (gpointer ptr)
                g_free (data->uid);
                g_free (data->vcard);
                g_free (data->extra);
-               g_free (data);
+               g_slice_free (EBookCacheSearchData, data);
        }
 }
 
diff --git a/src/addressbook/libedata-book/e-book-meta-backend.c 
b/src/addressbook/libedata-book/e-book-meta-backend.c
index 047a905a5..2edbe2f4c 100644
--- a/src/addressbook/libedata-book/e-book-meta-backend.c
+++ b/src/addressbook/libedata-book/e-book-meta-backend.c
@@ -151,7 +151,7 @@ e_book_meta_backend_info_new (const gchar *uid,
 
        g_return_val_if_fail (uid != NULL, NULL);
 
-       info = g_new0 (EBookMetaBackendInfo, 1);
+       info = g_slice_new0 (EBookMetaBackendInfo);
        info->uid = g_strdup (uid);
        info->revision = g_strdup (revision);
        info->object = g_strdup (object);
@@ -198,7 +198,7 @@ e_book_meta_backend_info_free (gpointer ptr)
                g_free (info->revision);
                g_free (info->object);
                g_free (info->extra);
-               g_free (info);
+               g_slice_free (EBookMetaBackendInfo, info);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-check-timezones.c b/src/calendar/libecal/e-cal-check-timezones.c
index 5b8f9f458..fb1dd80b5 100644
--- a/src/calendar/libecal/e-cal-check-timezones.c
+++ b/src/calendar/libecal/e-cal-check-timezones.c
@@ -530,7 +530,7 @@ e_cal_client_tzlookup_icalcomp_data_new (ICalComponent *icomp)
 
        g_return_val_if_fail (I_CAL_IS_COMPONENT (icomp), NULL);
 
-       lookup_data = g_new0 (ECalClientTzlookupICalCompData, 1);
+       lookup_data = g_slice_new0 (ECalClientTzlookupICalCompData);
        lookup_data->icomp = g_object_ref (icomp);
        lookup_data->tzcache = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref);
 
@@ -575,7 +575,7 @@ e_cal_client_tzlookup_icalcomp_data_free (ECalClientTzlookupICalCompData *lookup
        if (lookup_data) {
                g_clear_object (&lookup_data->icomp);
                g_hash_table_destroy (lookup_data->tzcache);
-               g_free (lookup_data);
+               g_slice_free (ECalClientTzlookupICalCompData, lookup_data);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-client.c b/src/calendar/libecal/e-cal-client.c
index d4f6246cf..7b85efff2 100644
--- a/src/calendar/libecal/e-cal-client.c
+++ b/src/calendar/libecal/e-cal-client.c
@@ -694,7 +694,7 @@ idle_proxy_notify_data_free (gpointer ptr)
                g_clear_object (&ipn->client);
                g_free (ipn->property_name);
                g_value_unset (&ipn->property_value);
-               g_free (ipn);
+               g_slice_free (IdleProxyNotifyData, ipn);
        }
 }
 
@@ -724,7 +724,7 @@ cal_client_dbus_proxy_notify_cb (EDBusCalendar *dbus_proxy,
        if (client == NULL)
                return;
 
-       ipn = g_new0 (IdleProxyNotifyData, 1);
+       ipn = g_slice_new0 (IdleProxyNotifyData);
        ipn->client = g_object_ref (client);
        ipn->property_name = g_strdup (pspec->name);
        g_value_init (&ipn->property_value, pspec->value_type);
@@ -2158,6 +2158,12 @@ struct comp_instance {
        ICalTime *end;
 };
 
+static struct comp_instance *
+comp_instance_new (void)
+{
+       return g_slice_new0 (struct comp_instance);
+}
+
 static void
 comp_instance_free (gpointer ptr)
 {
@@ -2167,7 +2173,7 @@ comp_instance_free (gpointer ptr)
                g_clear_object (&ci->comp);
                g_clear_object (&ci->start);
                g_clear_object (&ci->end);
-               g_free (ci);
+               g_slice_free (struct comp_instance, ci);
        }
 }
 
@@ -2191,7 +2197,7 @@ add_instance_cb (ICalComponent *icomp,
        instances_hold = user_data;
        list = instances_hold->instances;
 
-       ci = g_new0 (struct comp_instance, 1);
+       ci = comp_instance_new ();
 
        /* add the instance to the list */
        ci->comp = e_cal_component_new_from_icalcomponent (i_cal_component_clone (icomp));
@@ -2373,7 +2379,7 @@ process_detached_instances (GSList *instances,
         * (ie, detached instances with no master object) */
        while (unprocessed_instances != NULL) {
                cid = unprocessed_instances->data;
-               ci = g_new0 (struct comp_instance, 1);
+               ci = comp_instance_new ();
                ci->comp = g_object_ref (cid->comp);
                ci->start = i_cal_time_clone (cid->start);
                ci->end = i_cal_time_clone (cid->end);
@@ -2421,7 +2427,7 @@ generate_instances (ECalClient *client,
                        ECalComponentDateTime *dtstart, *dtend;
 
                        /* keep the detached instances apart */
-                       ci = g_new0 (struct comp_instance, 1);
+                       ci = comp_instance_new ();
                        ci->comp = g_object_ref (comp);
 
                        dtstart = e_cal_component_get_dtstart (comp);
@@ -2475,17 +2481,15 @@ generate_instances (ECalClient *client,
                                comp_instance_free (ci);
                        }
                } else {
-                       struct instances_info *instances_hold;
+                       struct instances_info instances_hold;
 
-                       instances_hold = g_new0 (struct instances_info, 1);
-                       instances_hold->instances = &instances;
+                       memset (&instances_hold, 0, sizeof (struct instances_info));
+                       instances_hold.instances = &instances;
 
                        e_cal_recur_generate_instances_sync (
-                               e_cal_component_get_icalcomponent (comp), starttt, endtt, add_instance_cb, 
instances_hold,
+                               e_cal_component_get_icalcomponent (comp), starttt, endtt, add_instance_cb, 
&instances_hold,
                                e_cal_client_tzlookup_cb, client,
                                default_zone, cancellable, NULL);
-
-                       g_free (instances_hold);
                }
        }
 
@@ -2603,7 +2607,7 @@ free_get_objects_async_data (struct get_objects_async_data *goad)
                g_object_unref (goad->comp);
        g_free (goad->query);
        g_free (goad->uid);
-       g_free (goad);
+       g_slice_free (struct get_objects_async_data, goad);
 }
 
 static void
@@ -2781,7 +2785,7 @@ e_cal_client_generate_instances (ECalClient *client,
        if (!use_cancellable)
                use_cancellable = g_cancellable_new ();
 
-       goad = g_new0 (struct get_objects_async_data, 1);
+       goad = g_slice_new0 (struct get_objects_async_data);
        goad->cancellable = g_object_ref (use_cancellable);
        goad->client = g_object_ref (client);
        goad->start = start;
@@ -2893,27 +2897,26 @@ static void
 generate_instances_for_object_got_objects_cb (struct get_objects_async_data *goad,
                                               GSList *objects)
 {
-       struct instances_info *instances_hold;
+       struct instances_info instances_hold;
        GSList *instances = NULL;
 
        g_return_if_fail (goad != NULL);
 
-       instances_hold = g_new0 (struct instances_info, 1);
-       instances_hold->instances = &instances;
+       memset (&instances_hold, 0, sizeof (struct instances_info));
+       instances_hold.instances = &instances;
 
        /* generate all instances in the given time range */
        generate_instances (
                goad->client, goad->start, goad->end, objects,
-               goad->cancellable, add_instance_cb, instances_hold);
+               goad->cancellable, add_instance_cb, &instances_hold);
 
        /* it also frees 'instances' GSList */
        process_instances (
-               goad->client, goad->comp, *(instances_hold->instances),
+               goad->client, goad->comp, *(instances_hold.instances),
                goad->cb, goad->cb_data);
 
        /* clean up */
        free_get_objects_async_data (goad);
-       g_free (instances_hold);
 }
 
 /**
@@ -2989,7 +2992,7 @@ e_cal_client_generate_instances_for_object (ECalClient *client,
        if (!use_cancellable)
                use_cancellable = g_cancellable_new ();
 
-       goad = g_new0 (struct get_objects_async_data, 1);
+       goad = g_slice_new0 (struct get_objects_async_data);
        goad->cancellable = g_object_ref (use_cancellable);
        goad->client = g_object_ref (client);
        goad->start = start;
@@ -3038,7 +3041,7 @@ e_cal_client_generate_instances_for_object_sync (ECalClient *client,
        ECalComponent *comp;
        const gchar *uid;
        GSList *instances = NULL;
-       struct instances_info *instances_hold;
+       struct instances_info instances_hold;
 
        g_return_if_fail (E_IS_CAL_CLIENT (client));
 
@@ -3068,21 +3071,20 @@ e_cal_client_generate_instances_for_object_sync (ECalClient *client,
 
        uid = e_cal_component_get_uid (comp);
 
-       instances_hold = g_new0 (struct instances_info, 1);
-       instances_hold->instances = &instances;
+       memset (&instances_hold, 0, sizeof (struct instances_info));
+       instances_hold.instances = &instances;
 
        /* generate all instances in the given time range */
        generate_instances (
                client, start, end,
                get_objects_sync (client, start, end, uid),
-               cancellable, add_instance_cb, instances_hold);
+               cancellable, add_instance_cb, &instances_hold);
 
        /* it also frees 'instances' GSList */
-       process_instances (client, comp, *(instances_hold->instances), cb, cb_data);
+       process_instances (client, comp, *(instances_hold.instances), cb, cb_data);
 
        /* clean up */
        g_object_unref (comp);
-       g_free (instances_hold);
 }
 
 typedef struct _ForeachTZIDCallbackData ForeachTZIDCallbackData;
diff --git a/src/calendar/libecal/e-cal-component-alarm-instance.c 
b/src/calendar/libecal/e-cal-component-alarm-instance.c
index e02302c39..8e5328d67 100644
--- a/src/calendar/libecal/e-cal-component-alarm-instance.c
+++ b/src/calendar/libecal/e-cal-component-alarm-instance.c
@@ -66,7 +66,7 @@ e_cal_component_alarm_instance_new (const gchar *uid,
 
        g_return_val_if_fail (uid != NULL, NULL);
 
-       instance = g_new0 (ECalComponentAlarmInstance, 1);
+       instance = g_slice_new0 (ECalComponentAlarmInstance);
        instance->uid = g_strdup (uid);
        instance->instance_time = instance_time;
        instance->occur_start = occur_start;
@@ -114,7 +114,7 @@ e_cal_component_alarm_instance_free (gpointer instance)
 
        if (instnc) {
                g_free (instnc->uid);
-               g_free (instnc);
+               g_slice_free (ECalComponentAlarmInstance, instnc);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-alarm-repeat.c 
b/src/calendar/libecal/e-cal-component-alarm-repeat.c
index f697e00d0..18c4cc35d 100644
--- a/src/calendar/libecal/e-cal-component-alarm-repeat.c
+++ b/src/calendar/libecal/e-cal-component-alarm-repeat.c
@@ -77,7 +77,7 @@ e_cal_component_alarm_repeat_new_seconds (gint repetitions,
 {
        ECalComponentAlarmRepeat *repeat;
 
-       repeat = g_new0 (ECalComponentAlarmRepeat, 1);
+       repeat = g_slice_new0 (ECalComponentAlarmRepeat);
        repeat->repetitions = repetitions;
        repeat->interval = i_cal_duration_new_from_int (interval_seconds);
 
@@ -119,7 +119,7 @@ e_cal_component_alarm_repeat_free (gpointer repeat)
 
        if (rpt) {
                g_clear_object (&rpt->interval);
-               g_free (rpt);
+               g_slice_free (ECalComponentAlarmRepeat, rpt);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-alarm-trigger.c 
b/src/calendar/libecal/e-cal-component-alarm-trigger.c
index 7b5306206..7a91add5e 100644
--- a/src/calendar/libecal/e-cal-component-alarm-trigger.c
+++ b/src/calendar/libecal/e-cal-component-alarm-trigger.c
@@ -65,7 +65,7 @@ e_cal_component_alarm_trigger_new_relative (ECalComponentAlarmTriggerKind kind,
        g_return_val_if_fail (kind != E_CAL_COMPONENT_ALARM_TRIGGER_ABSOLUTE, NULL);
        g_return_val_if_fail (I_CAL_IS_DURATION (duration), NULL);
 
-       trigger = g_new0 (ECalComponentAlarmTrigger, 1);
+       trigger = g_slice_new0 (ECalComponentAlarmTrigger);
        trigger->parameter_bag = e_cal_component_parameter_bag_new ();
 
        e_cal_component_alarm_trigger_set_relative (trigger, kind, duration);
@@ -95,7 +95,7 @@ e_cal_component_alarm_trigger_new_absolute (const ICalTime *absolute_time)
 
        g_return_val_if_fail (I_CAL_IS_TIME (absolute_time), NULL);
 
-       trigger = g_new0 (ECalComponentAlarmTrigger, 1);
+       trigger = g_slice_new0 (ECalComponentAlarmTrigger);
        trigger->parameter_bag = e_cal_component_parameter_bag_new ();
 
        e_cal_component_alarm_trigger_set_absolute (trigger, absolute_time);
@@ -126,7 +126,7 @@ e_cal_component_alarm_trigger_new_from_property (const ICalProperty *property)
        if (i_cal_property_isa ((ICalProperty *) property) != I_CAL_TRIGGER_PROPERTY)
                return NULL;
 
-       trigger = g_new0 (ECalComponentAlarmTrigger, 1);
+       trigger = g_slice_new0 (ECalComponentAlarmTrigger);
        trigger->parameter_bag = e_cal_component_parameter_bag_new ();
 
        e_cal_component_alarm_trigger_set_from_property (trigger, property);
@@ -182,7 +182,7 @@ e_cal_component_alarm_trigger_free (gpointer trigger)
                e_cal_component_parameter_bag_free (trg->parameter_bag);
                g_clear_object (&trg->rel_duration);
                g_clear_object (&trg->abs_time);
-               g_free (trg);
+               g_slice_free (ECalComponentAlarmTrigger, trg);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-alarm.c b/src/calendar/libecal/e-cal-component-alarm.c
index 525e33147..52ecc2a8e 100644
--- a/src/calendar/libecal/e-cal-component-alarm.c
+++ b/src/calendar/libecal/e-cal-component-alarm.c
@@ -66,7 +66,7 @@ e_cal_component_alarm_new (void)
 {
        ECalComponentAlarm *alarm;
 
-       alarm = g_new0 (ECalComponentAlarm, 1);
+       alarm = g_slice_new0 (ECalComponentAlarm);
        alarm->uid = e_util_generate_uid ();
        alarm->action = E_CAL_COMPONENT_ALARM_UNKNOWN;
        alarm->property_bag = e_cal_component_property_bag_new ();
@@ -215,7 +215,7 @@ e_cal_component_alarm_free (gpointer alarm)
                e_cal_component_property_bag_free (alrm->property_bag);
                g_slist_free_full (alrm->attendees, e_cal_component_attendee_free);
                g_slist_free_full (alrm->attachments, g_object_unref);
-               g_free (alrm);
+               g_slice_free (ECalComponentAlarm, alrm);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-alarms.c b/src/calendar/libecal/e-cal-component-alarms.c
index 7eeb464c0..c7c5e9219 100644
--- a/src/calendar/libecal/e-cal-component-alarms.c
+++ b/src/calendar/libecal/e-cal-component-alarms.c
@@ -58,7 +58,7 @@ e_cal_component_alarms_new (ECalComponent *comp)
 
        g_return_val_if_fail (E_IS_CAL_COMPONENT (comp), NULL);
 
-       alarms = g_new0 (ECalComponentAlarms, 1);
+       alarms = g_slice_new0 (ECalComponentAlarms);
        alarms->comp = g_object_ref (comp);
 
        return alarms;
@@ -106,7 +106,7 @@ e_cal_component_alarms_free (gpointer alarms)
        if (alrms) {
                g_clear_object (&alrms->comp);
                g_slist_free_full (alrms->instances, e_cal_component_alarm_instance_free);
-               g_free (alrms);
+               g_slice_free (ECalComponentAlarms, alrms);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-attendee.c b/src/calendar/libecal/e-cal-component-attendee.c
index 3799b2441..7a0fe28c6 100644
--- a/src/calendar/libecal/e-cal-component-attendee.c
+++ b/src/calendar/libecal/e-cal-component-attendee.c
@@ -65,7 +65,7 @@ e_cal_component_attendee_new (void)
 {
        ECalComponentAttendee *attendee;
 
-       attendee = g_new0 (ECalComponentAttendee, 1);
+       attendee = g_slice_new0 (ECalComponentAttendee);
        attendee->cutype = I_CAL_CUTYPE_NONE;
        attendee->role = I_CAL_ROLE_REQPARTICIPANT;
        attendee->partstat = I_CAL_PARTSTAT_NEEDSACTION;
@@ -218,7 +218,7 @@ e_cal_component_attendee_free (gpointer attendee)
                g_free (att->sentby);
                g_free (att->cn);
                g_free (att->language);
-               g_free (att);
+               g_slice_free (ECalComponentAttendee, att);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-datetime.c b/src/calendar/libecal/e-cal-component-datetime.c
index 3f724e858..29b040b36 100644
--- a/src/calendar/libecal/e-cal-component-datetime.c
+++ b/src/calendar/libecal/e-cal-component-datetime.c
@@ -59,7 +59,7 @@ e_cal_component_datetime_new (const ICalTime *value,
 
        g_return_val_if_fail (I_CAL_IS_TIME (value), NULL);
 
-       dt = g_new0 (ECalComponentDateTime, 1);
+       dt = g_slice_new0 (ECalComponentDateTime);
        e_cal_component_datetime_set (dt, value, tzid);
 
        return dt;
@@ -88,7 +88,7 @@ e_cal_component_datetime_new_take (ICalTime *value,
 
        g_return_val_if_fail (I_CAL_IS_TIME (value), NULL);
 
-       dt = g_new0 (ECalComponentDateTime, 1);
+       dt = g_slice_new0 (ECalComponentDateTime);
        dt->value = value;
        dt->tzid = tzid;
 
@@ -134,7 +134,7 @@ e_cal_component_datetime_free (gpointer dt)
        if (pdt) {
                g_clear_object (&pdt->value);
                g_free (pdt->tzid);
-               g_free (pdt);
+               g_slice_free (ECalComponentDateTime, pdt);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-id.c b/src/calendar/libecal/e-cal-component-id.c
index aec9e45d4..d5d719e8c 100644
--- a/src/calendar/libecal/e-cal-component-id.c
+++ b/src/calendar/libecal/e-cal-component-id.c
@@ -87,7 +87,7 @@ e_cal_component_id_new_take (gchar *uid,
                rid = NULL;
        }
 
-       id = g_new0 (ECalComponentId, 1);
+       id = g_slice_new0 (ECalComponentId);
        id->uid = uid;
        id->rid = rid;
 
@@ -128,7 +128,7 @@ e_cal_component_id_free (gpointer id)
        if (eid) {
                g_free (eid->uid);
                g_free (eid->rid);
-               g_free (eid);
+               g_slice_free (ECalComponentId, eid);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-organizer.c 
b/src/calendar/libecal/e-cal-component-organizer.c
index 126937638..dcb75d6d9 100644
--- a/src/calendar/libecal/e-cal-component-organizer.c
+++ b/src/calendar/libecal/e-cal-component-organizer.c
@@ -56,7 +56,7 @@ e_cal_component_organizer_new (void)
 {
        ECalComponentOrganizer *organizer;
 
-       organizer = g_new0 (ECalComponentOrganizer, 1);
+       organizer = g_slice_new0 (ECalComponentOrganizer);
        organizer->parameter_bag = e_cal_component_parameter_bag_new ();
 
        return organizer;
@@ -175,7 +175,7 @@ e_cal_component_organizer_free (gpointer organizer)
                g_free (org->sentby);
                g_free (org->cn);
                g_free (org->language);
-               g_free (org);
+               g_slice_free (ECalComponentOrganizer, org);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-parameter-bag.c 
b/src/calendar/libecal/e-cal-component-parameter-bag.c
index 95437c864..785d15822 100644
--- a/src/calendar/libecal/e-cal-component-parameter-bag.c
+++ b/src/calendar/libecal/e-cal-component-parameter-bag.c
@@ -48,7 +48,7 @@ e_cal_component_parameter_bag_new (void)
 {
        ECalComponentParameterBag *bag;
 
-       bag = g_new0 (ECalComponentParameterBag, 1);
+       bag = g_slice_new0 (ECalComponentParameterBag);
        bag->parameters = g_ptr_array_new_with_free_func (g_object_unref);
 
        return bag;
@@ -127,7 +127,7 @@ e_cal_component_parameter_bag_free (gpointer bag)
 
        if (bg) {
                g_ptr_array_unref (bg->parameters);
-               g_free (bg);
+               g_slice_free (ECalComponentParameterBag, bg);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-period.c b/src/calendar/libecal/e-cal-component-period.c
index 860c7780e..80f107d82 100644
--- a/src/calendar/libecal/e-cal-component-period.c
+++ b/src/calendar/libecal/e-cal-component-period.c
@@ -61,7 +61,7 @@ e_cal_component_period_new_datetime (const ICalTime *start,
 
        g_return_val_if_fail (I_CAL_IS_TIME (start), NULL);
 
-       period = g_new0 (ECalComponentPeriod, 1);
+       period = g_slice_new0 (ECalComponentPeriod);
        period->kind = E_CAL_COMPONENT_PERIOD_DATETIME;
 
        e_cal_component_period_set_datetime_full (period, start, end);
@@ -91,7 +91,7 @@ e_cal_component_period_new_duration (const ICalTime *start,
        g_return_val_if_fail (I_CAL_IS_TIME (start), NULL);
        g_return_val_if_fail (I_CAL_IS_DURATION (duration), NULL);
 
-       period = g_new0 (ECalComponentPeriod, 1);
+       period = g_slice_new0 (ECalComponentPeriod);
        period->kind = E_CAL_COMPONENT_PERIOD_DURATION;
 
        e_cal_component_period_set_duration_full (period, start, duration);
@@ -150,7 +150,7 @@ e_cal_component_period_free (gpointer period)
                g_clear_object (&pd->start);
                g_clear_object (&pd->end);
                g_clear_object (&pd->duration);
-               g_free (pd);
+               g_slice_free (ECalComponentPeriod, pd);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-property-bag.c 
b/src/calendar/libecal/e-cal-component-property-bag.c
index cec7538d7..dd7f53c27 100644
--- a/src/calendar/libecal/e-cal-component-property-bag.c
+++ b/src/calendar/libecal/e-cal-component-property-bag.c
@@ -48,7 +48,7 @@ e_cal_component_property_bag_new (void)
 {
        ECalComponentPropertyBag *bag;
 
-       bag = g_new0 (ECalComponentPropertyBag, 1);
+       bag = g_slice_new0 (ECalComponentPropertyBag);
        bag->properties = g_ptr_array_new_with_free_func (g_object_unref);
 
        return bag;
@@ -127,7 +127,7 @@ e_cal_component_property_bag_free (gpointer bag)
 
        if (bg) {
                g_ptr_array_unref (bg->properties);
-               g_free (bg);
+               g_slice_free (ECalComponentPropertyBag, bg);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-range.c b/src/calendar/libecal/e-cal-component-range.c
index 964a45170..04be682df 100644
--- a/src/calendar/libecal/e-cal-component-range.c
+++ b/src/calendar/libecal/e-cal-component-range.c
@@ -84,7 +84,7 @@ e_cal_component_range_new_take (ECalComponentRangeKind kind,
 
        g_return_val_if_fail (datetime != NULL, NULL);
 
-       range = g_new0 (ECalComponentRange, 1);
+       range = g_slice_new0 (ECalComponentRange);
        range->kind = kind;
        range->datetime = datetime;
 
@@ -127,7 +127,7 @@ e_cal_component_range_free (gpointer range)
 
        if (rng) {
                e_cal_component_datetime_free (rng->datetime);
-               g_free (rng);
+               g_slice_free (ECalComponentRange, rng);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-component-text.c b/src/calendar/libecal/e-cal-component-text.c
index ab3b555f2..332468604 100644
--- a/src/calendar/libecal/e-cal-component-text.c
+++ b/src/calendar/libecal/e-cal-component-text.c
@@ -54,7 +54,7 @@ e_cal_component_text_new (const gchar *value,
 {
        ECalComponentText *text;
 
-       text = g_new0 (ECalComponentText, 1);
+       text = g_slice_new0 (ECalComponentText);
        text->value = g_strdup (value);
        text->altrep = g_strdup (altrep);
 
@@ -96,7 +96,7 @@ e_cal_component_text_free (gpointer text)
        if (te) {
                g_free (te->value);
                g_free (te->altrep);
-               g_free (te);
+               g_slice_free (ECalComponentText, te);
        }
 }
 
diff --git a/src/calendar/libecal/e-cal-recur.c b/src/calendar/libecal/e-cal-recur.c
index dc1e457ca..52613cb18 100644
--- a/src/calendar/libecal/e-cal-recur.c
+++ b/src/calendar/libecal/e-cal-recur.c
@@ -106,7 +106,7 @@ e_instance_time_new (const ICalTime *tt,
        if (!tt)
                return NULL;
 
-       it = g_new0 (EInstanceTime, 1);
+       it = g_slice_new0 (EInstanceTime);
 
        it->tt = i_cal_time_clone (tt);
        it->duration_set = duration && !i_cal_duration_is_null_duration (duration);
@@ -135,7 +135,7 @@ e_instance_time_free (gpointer ptr)
 
        if (it) {
                g_clear_object (&it->tt);
-               g_free (it);
+               g_slice_free (EInstanceTime, it);
        }
 }
 
@@ -1782,7 +1782,7 @@ e_cal_recur_from_icalproperty (ICalProperty *prop,
 
        g_return_val_if_fail (prop != NULL, NULL);
 
-       r = g_new (ECalRecurrence, 1);
+       r = g_slice_new0 (ECalRecurrence);
 
        if (exception) {
                ir = i_cal_property_get_exrule (prop);
@@ -1918,7 +1918,7 @@ e_cal_recur_free (ECalRecurrence *r)
        g_list_free (r->bysecond);
        g_list_free (r->bysetpos);
 
-       g_free (r);
+       g_slice_free (ECalRecurrence, r);
 }
 
 /* Generates one year's worth of recurrence instances.  Returns TRUE if all the
diff --git a/src/calendar/libecal/e-reminder-watcher.c b/src/calendar/libecal/e-reminder-watcher.c
index 3075e46c8..e104aa880 100644
--- a/src/calendar/libecal/e-reminder-watcher.c
+++ b/src/calendar/libecal/e-reminder-watcher.c
@@ -181,7 +181,7 @@ client_data_new (EReminderWatcher *watcher,
        g_return_val_if_fail (E_IS_REMINDER_WATCHER (watcher), NULL);
        g_return_val_if_fail (E_IS_CAL_CLIENT (client), NULL);
 
-       cd = g_new0 (ClientData, 1);
+       cd = g_slice_new0 (ClientData);
        cd->watcher = watcher;
        cd->client = client;
        cd->view = NULL;
@@ -225,7 +225,7 @@ client_data_free (gpointer ptr)
        if (cd) {
                client_data_free_view (cd);
                g_clear_object (&cd->client);
-               g_free (cd);
+               g_slice_free (ClientData, cd);
        }
 }
 
@@ -421,7 +421,7 @@ e_reminder_data_new_take_component (const gchar *source_uid,
        g_return_val_if_fail (component != NULL, NULL);
        g_return_val_if_fail (instance != NULL, NULL);
 
-       rd = g_new0 (EReminderData, 1);
+       rd = g_slice_new0 (EReminderData);
        rd->source_uid = g_strdup (source_uid);
        rd->component = component;
        rd->instance = e_cal_component_alarm_instance_copy (instance);
@@ -490,7 +490,7 @@ e_reminder_data_free (gpointer rd)
                g_clear_object (&ptr->component);
                e_cal_component_alarm_instance_free (ptr->instance);
                g_free (ptr->source_uid);
-               g_free (ptr);
+               g_slice_free (EReminderData, ptr);
        }
 }
 
@@ -775,7 +775,7 @@ objects_changed_data_free (gpointer ptr)
                g_clear_object (&ocd->client);
                g_slist_free_full (ocd->ids, (GDestroyNotify) e_cal_component_id_free);
                g_clear_object (&ocd->zone);
-               g_free (ocd);
+               g_slice_free (ObjectsChangedData, ocd);
        }
 }
 
@@ -978,7 +978,7 @@ e_reminder_watcher_objects_changed (EReminderWatcher *watcher,
                ObjectsChangedData *ocd;
                GTask *task;
 
-               ocd = g_new0 (ObjectsChangedData, 1);
+               ocd = g_slice_new (ObjectsChangedData);
                ocd->client = g_object_ref (client);
                ocd->ids = ids;
                ocd->interval_start = client_get_last_notification_time (client) + 1;
@@ -1332,6 +1332,12 @@ typedef struct _EmitSignalData {
        gboolean is_snoozed; /* only for the triggered signal */
 } EmitSignalData;
 
+static EmitSignalData *
+emit_signal_data_new (void)
+{
+       return g_slice_new0 (EmitSignalData);
+}
+
 static void
 emit_signal_data_free (gpointer ptr)
 {
@@ -1340,7 +1346,7 @@ emit_signal_data_free (gpointer ptr)
        if (esd) {
                g_clear_object (&esd->watcher);
                g_slist_free_full (esd->reminders, e_reminder_data_free);
-               g_free (esd);
+               g_slice_free (EmitSignalData, esd);
        }
 }
 
@@ -1368,7 +1374,7 @@ e_reminder_watcher_emit_signal_idle_multiple (EReminderWatcher *watcher,
 {
        EmitSignalData *esd;
 
-       esd = g_new0 (EmitSignalData, 1);
+       esd = emit_signal_data_new ();
        esd->watcher = g_object_ref (watcher);
        esd->signal_id = signal_id;
        esd->reminders = g_slist_copy_deep ((GSList *) reminders, (GCopyFunc) e_reminder_data_copy, NULL);
diff --git a/src/calendar/libedata-cal/e-cal-backend-sexp.c b/src/calendar/libedata-cal/e-cal-backend-sexp.c
index 20aa13e64..21da70722 100644
--- a/src/calendar/libedata-cal/e-cal-backend-sexp.c
+++ b/src/calendar/libedata-cal/e-cal-backend-sexp.c
@@ -31,16 +31,7 @@
 
 #include "e-cal-backend-sexp.h"
 
-typedef struct _SearchContext SearchContext;
-
-struct _ECalBackendSExpPrivate {
-       ESExp *search_sexp;
-       gchar *text;
-       SearchContext *search_context;
-       GRecMutex search_context_lock;
-};
-
-struct _SearchContext {
+typedef struct _SearchContext {
        ECalComponent *comp;
        ETimezoneCache *cache;
        gboolean occurs;
@@ -49,6 +40,13 @@ struct _SearchContext {
        gboolean expr_range_set;
        time_t expr_range_start;
        time_t expr_range_end;
+} SearchContext;
+
+struct _ECalBackendSExpPrivate {
+       ESExp *search_sexp;
+       gchar *text;
+       SearchContext search_context;
+       GRecMutex search_context_lock;
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE (ECalBackendSExp, e_cal_backend_sexp, G_TYPE_OBJECT)
@@ -1148,7 +1146,6 @@ cal_backend_sexp_finalize (GObject *object)
 
        g_object_unref (priv->search_sexp);
        g_free (priv->text);
-       g_free (priv->search_context);
        g_rec_mutex_clear (&priv->search_context_lock);
 
        /* Chain up to parent's finalize() method. */
@@ -1168,7 +1165,6 @@ static void
 e_cal_backend_sexp_init (ECalBackendSExp *sexp)
 {
        sexp->priv = e_cal_backend_sexp_get_instance_private (sexp);
-       sexp->priv->search_context = g_new (SearchContext, 1);
 
        g_rec_mutex_init (&sexp->priv->search_context_lock);
 }
@@ -1230,13 +1226,13 @@ e_cal_backend_sexp_new (const gchar *text)
                                sexp->priv->search_sexp, 0,
                                symbols[ii].name,
                                (ESExpIFunc *) symbols[ii].func,
-                               sexp->priv->search_context);
+                               &(sexp->priv->search_context));
                } else {
                        e_sexp_add_function (
                                sexp->priv->search_sexp, 0,
                                symbols[ii].name,
                                symbols[ii].func,
-                               sexp->priv->search_context);
+                               &(sexp->priv->search_context));
                }
        }
 
@@ -1248,7 +1244,7 @@ e_cal_backend_sexp_new (const gchar *text)
        }
 
        if (sexp != NULL) {
-               SearchContext *ctx = sexp->priv->search_context;
+               SearchContext *ctx = &(sexp->priv->search_context);
 
                ctx->expr_range_set = e_sexp_evaluate_occur_times (
                        sexp->priv->search_sexp,
@@ -1299,15 +1295,15 @@ e_cal_backend_sexp_match_comp (ECalBackendSExp *sexp,
 
        e_cal_backend_sexp_lock (sexp);
 
-       sexp->priv->search_context->comp = g_object_ref (comp);
-       sexp->priv->search_context->cache = g_object_ref (cache);
+       sexp->priv->search_context.comp = g_object_ref (comp);
+       sexp->priv->search_context.cache = g_object_ref (cache);
 
        r = e_sexp_eval (sexp->priv->search_sexp);
 
        retval = (r && r->type == ESEXP_RES_BOOL && r->value.boolean);
 
-       g_object_unref (sexp->priv->search_context->comp);
-       g_object_unref (sexp->priv->search_context->cache);
+       g_object_unref (sexp->priv->search_context.comp);
+       g_object_unref (sexp->priv->search_context.cache);
 
        e_sexp_result_free (sexp->priv->search_sexp, r);
 
@@ -1661,11 +1657,11 @@ e_cal_backend_sexp_evaluate_occur_times (ECalBackendSExp *sexp,
        g_return_val_if_fail (start != NULL, FALSE);
        g_return_val_if_fail (end != NULL, FALSE);
 
-       if (!sexp->priv->search_context->expr_range_set)
+       if (!sexp->priv->search_context.expr_range_set)
                return FALSE;
 
-       *start = sexp->priv->search_context->expr_range_start;
-       *end = sexp->priv->search_context->expr_range_end;
+       *start = sexp->priv->search_context.expr_range_start;
+       *end = sexp->priv->search_context.expr_range_end;
 
        return TRUE;
 }
diff --git a/src/calendar/libedata-cal/e-cal-cache.c b/src/calendar/libedata-cal/e-cal-cache.c
index b2f95ebf3..5aaa51e35 100644
--- a/src/calendar/libedata-cal/e-cal-cache.c
+++ b/src/calendar/libedata-cal/e-cal-cache.c
@@ -127,7 +127,7 @@ e_cal_cache_offline_change_new (const gchar *uid,
 
        g_return_val_if_fail (uid != NULL, NULL);
 
-       change = g_new0 (ECalCacheOfflineChange, 1);
+       change = g_slice_new0 (ECalCacheOfflineChange);
        change->uid = g_strdup (uid);
        change->rid = g_strdup (rid);
        change->revision = g_strdup (revision);
@@ -175,7 +175,7 @@ e_cal_cache_offline_change_free (gpointer change)
                g_free (chng->rid);
                g_free (chng->revision);
                g_free (chng->object);
-               g_free (chng);
+               g_slice_free (ECalCacheOfflineChange, chng);
        }
 }
 
@@ -204,7 +204,7 @@ e_cal_cache_search_data_new (const gchar *uid,
        g_return_val_if_fail (uid != NULL, NULL);
        g_return_val_if_fail (object != NULL, NULL);
 
-       data = g_new0 (ECalCacheSearchData, 1);
+       data = g_slice_new0 (ECalCacheSearchData);
        data->uid = g_strdup (uid);
        data->rid = (rid && *rid) ? g_strdup (rid) : NULL;
        data->object = g_strdup (object);
@@ -251,7 +251,7 @@ e_cal_cache_search_data_free (gpointer ptr)
                g_free (data->rid);
                g_free (data->object);
                g_free (data->extra);
-               g_free (data);
+               g_slice_free (ECalCacheSearchData, data);
        }
 }
 
@@ -1928,7 +1928,7 @@ timezone_migration_data_free (gpointer ptr)
 
        if (tmd) {
                g_clear_object (&tmd->zone);
-               g_free (tmd);
+               g_slice_free (TimezoneMigrationData, tmd);
        }
 }
 
@@ -1991,7 +1991,7 @@ ecc_count_timezones_in_icalcomp_cb (ICalParameter *param,
                        zone = e_cal_util_copy_timezone (zone);
 
                if (zone) {
-                       tmd = g_new0 (TimezoneMigrationData, 1);
+                       tmd = g_slice_new0 (TimezoneMigrationData);
                        tmd->is_deref = !ctd->is_inc;
                        tmd->refs = 1;
                        tmd->zone = zone;
@@ -2101,7 +2101,7 @@ e_cal_cache_fill_tmd_cb (ECache *cache,
                if (zone) {
                        TimezoneMigrationData *tmd;
 
-                       tmd = g_new0 (TimezoneMigrationData, 1);
+                       tmd = g_slice_new0 (TimezoneMigrationData);
                        tmd->zone = zone;
                        tmd->refs = 0;
 
diff --git a/src/calendar/libedata-cal/e-cal-meta-backend.c b/src/calendar/libedata-cal/e-cal-meta-backend.c
index 977eb5113..7501f2a43 100644
--- a/src/calendar/libedata-cal/e-cal-meta-backend.c
+++ b/src/calendar/libedata-cal/e-cal-meta-backend.c
@@ -165,7 +165,7 @@ e_cal_meta_backend_info_new (const gchar *uid,
 
        g_return_val_if_fail (uid != NULL, NULL);
 
-       info = g_new0 (ECalMetaBackendInfo, 1);
+       info = g_slice_new0 (ECalMetaBackendInfo);
        info->uid = g_strdup (uid);
        info->revision = g_strdup (revision);
        info->object = g_strdup (object);
@@ -212,7 +212,7 @@ e_cal_meta_backend_info_free (gpointer ptr)
                g_free (info->revision);
                g_free (info->object);
                g_free (info->extra);
-               g_free (info);
+               g_slice_free (ECalMetaBackendInfo, info);
        }
 }
 
diff --git a/src/camel/camel-db.c b/src/camel/camel-db.c
index 3e550944b..5bf863b1e 100644
--- a/src/camel/camel-db.c
+++ b/src/camel/camel-db.c
@@ -102,7 +102,7 @@ sync_request_thread_cb (gpointer task_data,
        g_mutex_unlock (&sync_data->cFile->pending_syncs_lock);
 
        done = sync_data->done;
-       g_free (sync_data);
+       g_slice_free (struct SyncRequestData, sync_data);
 
        if (done != NULL) {
                g_mutex_lock (&done->mutex);
@@ -139,7 +139,7 @@ sync_push_request (CamelSqlite3File *cFile,
                done->is_set = FALSE;
        }
 
-       data = g_new0 (struct SyncRequestData, 1);
+       data = g_slice_new0 (struct SyncRequestData);
        data->cFile = cFile;
        data->flags = cFile->flags;
        data->done = done;
diff --git a/src/camel/camel-filter-driver.c b/src/camel/camel-filter-driver.c
index 56d8b5e99..77cb361b5 100644
--- a/src/camel/camel-filter-driver.c
+++ b/src/camel/camel-filter-driver.c
@@ -186,6 +186,12 @@ typedef struct _MessageTransferData {
        GPtrArray *move_uids;
 } MessageTransferData;
 
+static MessageTransferData *
+message_transfer_data_new (void)
+{
+       return g_slice_new0 (MessageTransferData);
+}
+
 static void
 message_transfer_data_free (gpointer ptr)
 {
@@ -196,7 +202,7 @@ message_transfer_data_free (gpointer ptr)
                        g_ptr_array_free (mtd->copy_uids, TRUE);
                if (mtd->move_uids)
                        g_ptr_array_free (mtd->move_uids, TRUE);
-               g_free (mtd);
+               g_slice_free (MessageTransferData, mtd);
        }
 }
 
@@ -219,7 +225,7 @@ filter_driver_add_to_transfers (CamelFilterDriver *driver,
        mtd = g_hash_table_lookup (driver->priv->transfers, destination);
 
        if (!mtd) {
-               mtd = g_new0 (MessageTransferData, 1);
+               mtd = message_transfer_data_new ();
                g_hash_table_insert (driver->priv->transfers, g_object_ref (destination), mtd);
        }
 
diff --git a/src/camel/camel-folder-summary.c b/src/camel/camel-folder-summary.c
index c981228bd..0b33bb5ec 100644
--- a/src/camel/camel-folder-summary.c
+++ b/src/camel/camel-folder-summary.c
@@ -1599,7 +1599,7 @@ cfs_free_weakref (gpointer ptr)
        if (weakref) {
                g_weak_ref_set (weakref, NULL);
                g_weak_ref_clear (weakref);
-               g_free (weakref);
+               g_slice_free (GWeakRef, weakref);
        }
 }
 
@@ -1694,7 +1694,7 @@ cfs_schedule_info_release_timer (CamelFolderSummary *summary)
                if (can_do) {
                        GWeakRef *weakref;
 
-                       weakref = g_new0 (GWeakRef, 1);
+                       weakref = g_slice_new0 (GWeakRef);
                        g_weak_ref_init (weakref, summary);
 
                        summary->priv->timeout_handle = g_timeout_add_seconds_full (
diff --git a/src/camel/camel-folder.c b/src/camel/camel-folder.c
index eb393827d..a0e7c5c9e 100644
--- a/src/camel/camel-folder.c
+++ b/src/camel/camel-folder.c
@@ -4263,7 +4263,7 @@ uid_index_pair_free (gpointer ptr)
                g_ptr_array_unref (uip->uids);
                if (uip->indexes)
                        g_ptr_array_unref (uip->indexes);
-               g_free (uip);
+               g_slice_free (UidIndexPair, uip);
        }
 }
 
@@ -4358,7 +4358,7 @@ camel_folder_transfer_messages_to_sync (CamelFolder *source,
 
                                uip = g_hash_table_lookup (todo, folder);
                                if (!uip) {
-                                       uip = g_new0 (UidIndexPair, 1);
+                                       uip = g_slice_new0 (UidIndexPair);
                                        uip->uids = g_ptr_array_new_with_free_func ((GDestroyNotify) 
camel_pstring_free);
                                        if (transferred_uids)
                                                uip->indexes = g_ptr_array_new ();
diff --git a/src/camel/camel-gpg-context.c b/src/camel/camel-gpg-context.c
index 13ae071a5..5e2528bdf 100644
--- a/src/camel/camel-gpg-context.c
+++ b/src/camel/camel-gpg-context.c
@@ -105,7 +105,7 @@ gpg_recipients_data_free (gpointer ptr)
        if (rd) {
                g_free (rd->keyid);
                g_free (rd->known_key_data);
-               g_free (rd);
+               g_slice_free (GpgRecipientsData, rd);
        }
 }
 
@@ -212,7 +212,7 @@ gpg_ctx_new (CamelCipherContext *context,
 
        session = camel_cipher_context_get_session (context);
 
-       gpg = g_new (struct _GpgCtx, 1);
+       gpg = g_slice_new0 (struct _GpgCtx);
        gpg->mode = GPG_CTX_MODE_SIGN;
        gpg->session = g_object_ref (session);
        gpg->cancellable = cancellable;
@@ -382,7 +382,7 @@ gpg_ctx_add_recipient (struct _GpgCtx *gpg,
                safe_keyid = g_strdup (keyid);
        }
 
-       rd = g_new0 (GpgRecipientsData, 1);
+       rd = g_slice_new0 (GpgRecipientsData);
        rd->keyid = safe_keyid;
        rd->known_key_data = g_strdup (known_key_data);
 
@@ -548,7 +548,7 @@ gpg_ctx_free (struct _GpgCtx *gpg)
        if (gpg->decrypt_extra_text)
                g_string_free (gpg->decrypt_extra_text, TRUE);
 
-       g_free (gpg);
+       g_slice_free (struct _GpgCtx, gpg);
 }
 
 static const gchar *
diff --git a/src/camel/camel-trie.c b/src/camel/camel-trie.c
index e2f4c33ad..74bf233fb 100644
--- a/src/camel/camel-trie.c
+++ b/src/camel/camel-trie.c
@@ -116,7 +116,7 @@ camel_trie_new (gboolean icase)
 {
        CamelTrie *trie;
 
-       trie = g_new (CamelTrie, 1);
+       trie = g_slice_new (CamelTrie);
        trie->root.next = NULL;
        trie->root.fail = NULL;
        trie->root.match = NULL;
@@ -145,7 +145,7 @@ camel_trie_free (CamelTrie *trie)
        g_ptr_array_free (trie->fail_states, TRUE);
        camel_memchunk_destroy (trie->match_chunks);
        camel_memchunk_destroy (trie->state_chunks);
-       g_free (trie);
+       g_slice_free (CamelTrie, trie);
 }
 
 static struct _trie_match *
diff --git a/src/camel/camel-uid-cache.c b/src/camel/camel-uid-cache.c
index 23237f53a..6e4167f46 100644
--- a/src/camel/camel-uid-cache.c
+++ b/src/camel/camel-uid-cache.c
@@ -83,7 +83,7 @@ camel_uid_cache_new (const gchar *filename)
 
        close (fd);
 
-       cache = g_new (CamelUIDCache, 1);
+       cache = g_slice_new0 (CamelUIDCache);
        cache->uids = g_hash_table_new (g_str_hash, g_str_equal);
        cache->filename = g_strdup (filename);
        cache->level = 1;
@@ -244,7 +244,7 @@ camel_uid_cache_destroy (CamelUIDCache *cache)
        g_hash_table_foreach (cache->uids, free_uid, NULL);
        g_hash_table_destroy (cache->uids);
        g_free (cache->filename);
-       g_free (cache);
+       g_slice_free (CamelUIDCache, cache);
 }
 
 /**
diff --git a/src/camel/camel-url-scanner.c b/src/camel/camel-url-scanner.c
index 1b3dfb7d2..f18536053 100644
--- a/src/camel/camel-url-scanner.c
+++ b/src/camel/camel-url-scanner.c
@@ -42,7 +42,7 @@ camel_url_scanner_new (void)
 {
        CamelUrlScanner *scanner;
 
-       scanner = g_new (CamelUrlScanner, 1);
+       scanner = g_slice_new0 (CamelUrlScanner);
        scanner->patterns = g_ptr_array_new ();
        scanner->trie = camel_trie_new (TRUE);
 
@@ -62,7 +62,7 @@ camel_url_scanner_free (CamelUrlScanner *scanner)
 
        g_ptr_array_free (scanner->patterns, TRUE);
        camel_trie_free (scanner->trie);
-       g_free (scanner);
+       g_slice_free (CamelUrlScanner, scanner);
 }
 
 /**
diff --git a/src/camel/camel-vee-data-cache.c b/src/camel/camel-vee-data-cache.c
index 60b96bcb3..ae488f625 100644
--- a/src/camel/camel-vee-data-cache.c
+++ b/src/camel/camel-vee-data-cache.c
@@ -342,6 +342,19 @@ typedef struct _VeeData {
        const gchar *orig_message_uid;
 } VeeData;
 
+static VeeData *
+vee_data_new (void)
+{
+       return g_slice_new0 (VeeData);
+}
+
+static void
+vee_data_free (gpointer ptr)
+{
+       if (ptr)
+               g_slice_free (VeeData, ptr);
+}
+
 static guint
 vee_data_hash (gconstpointer ptr)
 {
@@ -428,7 +441,7 @@ camel_vee_data_cache_init (CamelVeeDataCache *data_cache)
        data_cache->priv->subfolder_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, 
g_object_unref);
 
        g_mutex_init (&data_cache->priv->mi_mutex);
-       data_cache->priv->orig_message_uid_hash = g_hash_table_new_full (vee_data_hash, vee_data_equal, 
g_free, g_object_unref);
+       data_cache->priv->orig_message_uid_hash = g_hash_table_new_full (vee_data_hash, vee_data_equal, 
vee_data_free, g_object_unref);
        data_cache->priv->vee_message_uid_hash = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, 
NULL);
 }
 
@@ -498,7 +511,7 @@ camel_vee_data_cache_add_subfolder (CamelVeeDataCache *data_cache,
 
                                        mi_data = camel_vee_message_info_data_new (sf_data, 
vdata.orig_message_uid);
 
-                                       hash_data = g_new0 (VeeData, 1);
+                                       hash_data = vee_data_new ();
                                        hash_data->folder = subfolder;
                                        hash_data->orig_message_uid = 
camel_vee_message_info_data_get_orig_message_uid (mi_data);
 
@@ -705,7 +718,7 @@ camel_vee_data_cache_get_message_info_data (CamelVeeDataCache *data_cache,
                /* res holds the reference now */
                g_object_unref (sf_data);
 
-               hash_data = g_new0 (VeeData, 1);
+               hash_data = vee_data_new ();
                hash_data->folder = folder;
                hash_data->orig_message_uid = camel_vee_message_info_data_get_orig_message_uid (res);
 
diff --git a/src/camel/camel-weak-ref-group.c b/src/camel/camel-weak-ref-group.c
index 3cd8e199b..0194d1c5d 100644
--- a/src/camel/camel-weak-ref-group.c
+++ b/src/camel/camel-weak-ref-group.c
@@ -52,7 +52,7 @@ object_data_new (gpointer object)
 {
        ObjectData *od;
 
-       od = g_new (ObjectData, 1);
+       od = g_slice_new (ObjectData);
        od->use_count = 1;
 
        g_weak_ref_init (&od->weakref, object);
@@ -69,7 +69,7 @@ object_data_free (gpointer ptr)
                g_warn_if_fail (od->use_count == 0);
                g_weak_ref_set (&od->weakref, NULL);
                g_weak_ref_clear (&od->weakref);
-               g_free (od);
+               g_slice_free (ObjectData, od);
        }
 }
 
@@ -86,7 +86,7 @@ camel_weak_ref_group_new (void)
 {
        CamelWeakRefGroup *wrg;
 
-       wrg = g_new (CamelWeakRefGroup, 1);
+       wrg = g_slice_new (CamelWeakRefGroup);
        wrg->ref_count = 1;
        wrg->object = NULL;
 
@@ -140,7 +140,7 @@ camel_weak_ref_group_unref (CamelWeakRefGroup *group)
 
        if (!group->ref_count) {
                camel_weak_ref_group_set (group, NULL);
-               g_free (group);
+               g_slice_free (CamelWeakRefGroup, group);
        }
 }
 
diff --git a/src/camel/providers/imapx/camel-imapx-conn-manager.c 
b/src/camel/providers/imapx/camel-imapx-conn-manager.c
index c14a0d5e1..1d8a48433 100644
--- a/src/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/src/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -118,7 +118,7 @@ mailbox_refresh_data_free (MailboxRefreshData *data)
        if (data) {
                g_clear_object (&data->conn_man);
                g_clear_object (&data->mailbox);
-               g_free (data);
+               g_slice_free (MailboxRefreshData, data);
        }
 }
 
@@ -167,7 +167,7 @@ imapx_conn_manager_refresh_mailbox_cb (CamelIMAPXServer *is,
        }
        g_mutex_unlock (&conn_man->priv->idle_refresh_lock);
 
-       data = g_new0 (MailboxRefreshData, 1);
+       data = g_slice_new0 (MailboxRefreshData);
        data->conn_man = g_object_ref (conn_man);
        data->mailbox = g_object_ref (mailbox);
 
@@ -1435,7 +1435,7 @@ list_job_data_free (gpointer ptr)
 
        if (job_data) {
                g_free (job_data->pattern);
-               g_free (job_data);
+               g_slice_free (struct ListJobData, job_data);
        }
 }
 
@@ -1497,7 +1497,7 @@ camel_imapx_conn_manager_list_sync (CamelIMAPXConnManager *conn_man,
                imapx_conn_manager_list_matches,
                NULL);
 
-       job_data = g_new0 (struct ListJobData, 1);
+       job_data = g_slice_new0 (struct ListJobData);
        job_data->pattern = g_strdup (pattern);
        job_data->flags = flags;
 
@@ -2026,8 +2026,8 @@ get_message_job_data_free (gpointer ptr)
        if (job_data) {
                g_clear_object (&job_data->summary);
                g_clear_object (&job_data->message_cache);
-               g_free (job_data->message_uid);
-               g_free (job_data);
+               camel_pstring_free (job_data->message_uid);
+               g_slice_free (struct GetMessageJobData, job_data);
        }
 }
 
@@ -2123,10 +2123,10 @@ camel_imapx_conn_manager_get_message_sync (CamelIMAPXConnManager *conn_man,
                imapx_conn_manager_get_message_matches,
                imapx_conn_manager_get_message_copy_result);
 
-       job_data = g_new0 (struct GetMessageJobData, 1);
+       job_data = g_slice_new0 (struct GetMessageJobData);
        job_data->summary = g_object_ref (summary);
        job_data->message_cache = g_object_ref (message_cache);
-       job_data->message_uid = g_strdup (message_uid);
+       job_data->message_uid = (gchar *) camel_pstring_strdup (message_uid);
 
        camel_imapx_job_set_user_data (job, job_data, get_message_job_data_free);
 
@@ -2157,7 +2157,7 @@ copy_message_job_data_free (gpointer ptr)
        if (job_data) {
                g_clear_object (&job_data->destination);
                g_ptr_array_free (job_data->uids, TRUE);
-               g_free (job_data);
+               g_slice_free (struct CopyMessageJobData, job_data);
        }
 }
 
@@ -2221,7 +2221,7 @@ imapx_conn_manager_copy_message_sync (CamelIMAPXConnManager *conn_man,
                imapx_conn_manager_nothing_matches,
                NULL);
 
-       job_data = g_new0 (struct CopyMessageJobData, 1);
+       job_data = g_slice_new0 (struct CopyMessageJobData);
        job_data->destination = g_object_ref (destination);
        job_data->uids = g_ptr_array_new_full (uids->len, (GDestroyNotify) camel_pstring_free);
        job_data->delete_originals = delete_originals;
@@ -2286,7 +2286,7 @@ append_message_job_data_free (gpointer ptr)
                g_clear_object (&job_data->summary);
                g_clear_object (&job_data->message_cache);
                g_clear_object (&job_data->message);
-               g_free (job_data);
+               g_slice_free (struct AppendMessageJobData, job_data);
        }
 }
 
@@ -2347,7 +2347,7 @@ camel_imapx_conn_manager_append_message_sync (CamelIMAPXConnManager *conn_man,
                imapx_conn_manager_nothing_matches,
                NULL);
 
-       job_data = g_new0 (struct AppendMessageJobData, 1);
+       job_data = g_slice_new0 (struct AppendMessageJobData);
        job_data->summary = g_object_ref (summary);
        job_data->message_cache = g_object_ref (message_cache);
        job_data->message = g_object_ref (message);
@@ -2426,10 +2426,10 @@ camel_imapx_conn_manager_sync_message_sync (CamelIMAPXConnManager *conn_man,
                imapx_conn_manager_get_message_matches,
                NULL);
 
-       job_data = g_new0 (struct GetMessageJobData, 1);
+       job_data = g_slice_new0 (struct GetMessageJobData);
        job_data->summary = g_object_ref (summary);
        job_data->message_cache = g_object_ref (message_cache);
-       job_data->message_uid = g_strdup (message_uid);
+       job_data->message_uid = (gchar *) camel_pstring_strdup (message_uid);
 
        camel_imapx_job_set_user_data (job, job_data, get_message_job_data_free);
 
@@ -2792,7 +2792,7 @@ uid_search_job_data_free (gpointer ptr)
                g_free (job_data->criteria_prefix);
                g_free (job_data->search_key);
                g_strfreev (job_data->words);
-               g_free (job_data);
+               g_slice_free (struct UidSearchJobData, job_data);
        }
 }
 
@@ -2867,7 +2867,7 @@ camel_imapx_conn_manager_uid_search_sync (CamelIMAPXConnManager *conn_man,
 
        g_return_val_if_fail (CAMEL_IS_IMAPX_CONN_MANAGER (conn_man), NULL);
 
-       job_data = g_new0 (struct UidSearchJobData, 1);
+       job_data = g_slice_new0 (struct UidSearchJobData);
        job_data->criteria_prefix = g_strdup (criteria_prefix);
        job_data->search_key = g_strdup (search_key);
        job_data->words = imapx_copy_strv (words);
diff --git a/src/camel/providers/imapx/camel-imapx-folder.c b/src/camel/providers/imapx/camel-imapx-folder.c
index 40b19f7b6..0df26f1e9 100644
--- a/src/camel/providers/imapx/camel-imapx-folder.c
+++ b/src/camel/providers/imapx/camel-imapx-folder.c
@@ -945,7 +945,7 @@ remove_cache_files_free (gpointer ptr)
        if (rcf) {
                g_clear_object (&rcf->imapx_folder);
                g_slist_free_full (rcf->uids, (GDestroyNotify) camel_pstring_free);
-               g_free (rcf);
+               g_slice_free (RemoveCacheFiles, rcf);
        }
 }
 
@@ -1021,7 +1021,7 @@ imapx_folder_changed (CamelFolder *folder,
                                RemoveCacheFiles *rcf;
                                gchar *description;
 
-                               rcf = g_new0 (RemoveCacheFiles, 1);
+                               rcf = g_slice_new0 (RemoveCacheFiles);
                                rcf->imapx_folder = g_object_ref (imapx_folder);
                                rcf->uids = removed_uids;
 
diff --git a/src/camel/providers/imapx/camel-imapx-job.c b/src/camel/providers/imapx/camel-imapx-job.c
index ed9c45ade..99bb616b4 100644
--- a/src/camel/providers/imapx/camel-imapx-job.c
+++ b/src/camel/providers/imapx/camel-imapx-job.c
@@ -183,7 +183,7 @@ camel_imapx_job_new (guint32 job_kind,
 
        g_return_val_if_fail (run_sync != NULL, NULL);
 
-       job = g_new0 (CamelIMAPXJob, 1);
+       job = g_slice_new0 (CamelIMAPXJob);
        job->ref_count = 1;
        job->job_kind = job_kind;
        job->mailbox = mailbox ? g_object_ref (mailbox) : NULL;
@@ -230,7 +230,7 @@ camel_imapx_job_unref (CamelIMAPXJob *job)
 
                job->ref_count = 0xdeadbeef;
 
-               g_free (job);
+               g_slice_free (CamelIMAPXJob, job);
        }
 }
 
diff --git a/src/camel/providers/imapx/camel-imapx-server.c b/src/camel/providers/imapx/camel-imapx-server.c
index e51529eb6..cf341a917 100644
--- a/src/camel/providers/imapx/camel-imapx-server.c
+++ b/src/camel/providers/imapx/camel-imapx-server.c
@@ -376,7 +376,7 @@ fetch_changes_info_free (gpointer ptr)
 
        if (nfo) {
                camel_named_flags_free (nfo->server_user_flags);
-               g_free (nfo);
+               g_slice_free (FetchChangesInfo, nfo);
        }
 }
 
@@ -1200,7 +1200,7 @@ imapx_untagged_fetch (CamelIMAPXServer *is,
 
                        nfo = g_hash_table_lookup (is->priv->fetch_changes_infos, finfo->uid);
                        if (!nfo) {
-                               nfo = g_new0 (FetchChangesInfo, 1);
+                               nfo = g_slice_new0 (FetchChangesInfo);
 
                                g_hash_table_insert (is->priv->fetch_changes_infos, (gpointer) 
camel_pstring_strdup (finfo->uid), nfo);
                        }
@@ -2159,7 +2159,7 @@ imapx_untagged (CamelIMAPXServer *is,
         * we will need to protect this data structure with locks
         */
        g_return_val_if_fail (is->priv->context == NULL, FALSE);
-       is->priv->context = g_new0 (CamelIMAPXServerUntaggedContext, 1);
+       is->priv->context = g_slice_new0 (CamelIMAPXServerUntaggedContext);
 
        settings = camel_imapx_server_ref_settings (is);
        fetch_order = camel_imapx_settings_get_fetch_order (settings);
@@ -2248,7 +2248,7 @@ imapx_untagged (CamelIMAPXServer *is,
                CAMEL_IMAPX_INPUT_STREAM (input_stream), cancellable, error);
 
 exit:
-       g_free (is->priv->context);
+       g_slice_free (CamelIMAPXServerUntaggedContext, is->priv->context);
        is->priv->context = NULL;
 
        return success;
@@ -3613,7 +3613,7 @@ imapx_server_finalize (GObject *object)
        camel_folder_change_info_free (is->priv->changes);
        imapx_free_status (is->priv->copyuid_status);
 
-       g_free (is->priv->context);
+       g_slice_free (CamelIMAPXServerUntaggedContext, is->priv->context);
        g_hash_table_destroy (is->priv->untagged_handlers);
 
        if (is->priv->inactivity_timeout != NULL)
@@ -6850,6 +6850,18 @@ typedef struct _IdleThreadData {
        gint idle_stamp;
 } IdleThreadData;
 
+static void
+idle_thread_data_free (gpointer ptr)
+{
+       IdleThreadData *itd = ptr;
+
+       if (itd) {
+               g_clear_object (&itd->is);
+               g_clear_object (&itd->idle_cancellable);
+               g_slice_free (IdleThreadData, itd);
+       }
+}
+
 static gpointer
 imapx_server_idle_thread (gpointer user_data)
 {
@@ -6880,9 +6892,7 @@ imapx_server_idle_thread (gpointer user_data)
                g_cond_broadcast (&is->priv->idle_cond);
                g_mutex_unlock (&is->priv->idle_lock);
 
-               g_clear_object (&itd->is);
-               g_clear_object (&itd->idle_cancellable);
-               g_free (itd);
+               idle_thread_data_free (itd);
 
                return NULL;
        }
@@ -6963,9 +6973,7 @@ imapx_server_idle_thread (gpointer user_data)
        g_clear_object (&mailbox);
        g_clear_error (&local_error);
 
-       g_clear_object (&itd->is);
-       g_clear_object (&itd->idle_cancellable);
-       g_free (itd);
+       idle_thread_data_free (itd);
 
        return NULL;
 }
@@ -6991,7 +6999,7 @@ imapx_server_run_idle_thread_cb (gpointer user_data)
                        GThread *thread;
                        GError *local_error = NULL;
 
-                       itd = g_new0 (IdleThreadData, 1);
+                       itd = g_slice_new0 (IdleThreadData);
                        itd->is = g_object_ref (is);
                        itd->idle_cancellable = g_object_ref (is->priv->idle_cancellable);
                        itd->idle_stamp = is->priv->idle_stamp;
@@ -7002,9 +7010,7 @@ imapx_server_run_idle_thread_cb (gpointer user_data)
                        } else {
                                g_warning ("%s: Failed to create IDLE thread: %s", G_STRFUNC, local_error ? 
local_error->message : "Unknown error");
 
-                               g_clear_object (&itd->is);
-                               g_clear_object (&itd->idle_cancellable);
-                               g_free (itd);
+                               idle_thread_data_free (itd);
                        }
 
                        g_clear_error (&local_error);
diff --git a/src/camel/providers/local/camel-mbox-store.c b/src/camel/providers/local/camel-mbox-store.c
index 389c2b54a..4fe4f3b9d 100644
--- a/src/camel/providers/local/camel-mbox-store.c
+++ b/src/camel/providers/local/camel-mbox-store.c
@@ -71,12 +71,24 @@ inode_equal (gconstpointer a,
        return v1->inode == v2->inode && v1->dnode == v2->dnode;
 }
 
+static struct _inode *
+inode_new (const struct _inode *src)
+{
+       struct _inode *inode;
+
+       inode = g_slice_new0 (struct _inode);
+       if (src) {
+               inode->dnode = src->dnode;
+               inode->inode = src->inode;
+       }
+
+       return inode;
+}
+
 static void
-inode_free (gpointer k,
-            gpointer v,
-            gpointer d)
+inode_free (gpointer ptr)
 {
-       g_free (k);
+       g_slice_free (struct _inode, ptr);
 }
 
 static gboolean
@@ -252,9 +264,8 @@ scan_dir (CamelStore *store,
 
                        if (g_hash_table_lookup (visited, &in) == NULL) {
 #ifndef G_OS_WIN32
-                               struct _inode *inew = g_new (struct _inode, 1);
+                               struct _inode *inew = inode_new (&in);
 
-                               *inew = in;
                                g_hash_table_insert (visited, inew, inew);
 #endif
                                if ((fi->child = scan_dir (store, visited, fi, path, fi->full_name, flags, 
error)))
@@ -468,16 +479,15 @@ mbox_store_get_folder_info_sync (CamelStore *store,
                        return NULL;
                }
 
-               visited = g_hash_table_new (inode_hash, inode_equal);
+               visited = g_hash_table_new_full (inode_hash, inode_equal, inode_free, NULL);
 #ifndef G_OS_WIN32
-               inode = g_malloc0 (sizeof (*inode));
+               inode = inode_new (NULL);
                inode->dnode = st.st_dev;
                inode->inode = st.st_ino;
 
                g_hash_table_insert (visited, inode, inode);
 #endif
                fi = scan_dir (store, visited, NULL, path, NULL, flags, error);
-               g_hash_table_foreach (visited, inode_free, NULL);
                g_hash_table_destroy (visited);
                g_free (path);
 
@@ -496,7 +506,7 @@ mbox_store_get_folder_info_sync (CamelStore *store,
                g_free (test_if_subdir);
        }
 
-       visited = g_hash_table_new (inode_hash, inode_equal);
+       visited = g_hash_table_new_full (inode_hash, inode_equal, inode_free, NULL);
 
        basename = g_path_get_basename (top);
 
@@ -522,7 +532,6 @@ mbox_store_get_folder_info_sync (CamelStore *store,
 
        g_free (subdir);
 
-       g_hash_table_foreach (visited, inode_free, NULL);
        g_hash_table_destroy (visited);
        g_free (path);
 
diff --git a/src/libebackend/e-backend.c b/src/libebackend/e-backend.c
index 3981594b2..a29725921 100644
--- a/src/libebackend/e-backend.c
+++ b/src/libebackend/e-backend.c
@@ -86,6 +86,17 @@ typedef struct _CanReachData {
        GCancellable *cancellable;
 } CanReachData;
 
+static void
+can_reach_data_free (gpointer ptr)
+{
+       CanReachData *crd = ptr;
+
+       if (crd) {
+               g_clear_object (&crd->backend);
+               g_slice_free (CanReachData, crd);
+       }
+}
+
 static void
 backend_network_monitor_can_reach_cb (GObject *source_object,
                                       GAsyncResult *result,
@@ -113,8 +124,7 @@ backend_network_monitor_can_reach_cb (GObject *source_object,
        if (G_IS_IO_ERROR (error, G_IO_ERROR_CANCELLED) ||
            host_is_reachable == e_backend_get_online (crd->backend)) {
                g_clear_error (&error);
-               g_object_unref (crd->backend);
-               g_free (crd);
+               can_reach_data_free (crd);
                return;
        }
 
@@ -129,8 +139,7 @@ backend_network_monitor_can_reach_cb (GObject *source_object,
                e_source_set_connection_status (source, E_SOURCE_CONNECTION_STATUS_DISCONNECTED);
        }
 
-       g_object_unref (crd->backend);
-       g_free (crd);
+       can_reach_data_free (crd);
 }
 
 static GSocketConnectable *
@@ -199,7 +208,7 @@ backend_update_online_state_timeout_cb (gpointer user_data)
 
                cancellable = g_cancellable_new ();
 
-               crd = g_new0 (CanReachData, 1);
+               crd = g_slice_new0 (CanReachData);
                crd->backend = g_object_ref (backend);
                crd->cancellable = cancellable;
 
@@ -316,7 +325,7 @@ authenticate_thread_data_new (EBackend *backend,
 {
        AuthenticateThreadData *data;
 
-       data = g_new0 (AuthenticateThreadData, 1);
+       data = g_slice_new0 (AuthenticateThreadData);
        data->backend = g_object_ref (backend);
        data->cancellable = g_object_ref (cancellable);
        data->credentials = credentials ? e_named_parameters_new_clone (credentials) : e_named_parameters_new 
();
@@ -340,7 +349,7 @@ authenticate_thread_data_free (AuthenticateThreadData *data)
                g_clear_object (&data->backend);
                g_clear_object (&data->cancellable);
                e_named_parameters_free (data->credentials);
-               g_free (data);
+               g_slice_free (AuthenticateThreadData, data);
        }
 }
 
@@ -1113,7 +1122,7 @@ credentials_required_data_free (gpointer ptr)
        if (data) {
                g_free (data->certificate_pem);
                g_clear_error (&data->op_error);
-               g_free (data);
+               g_slice_free (CredentialsRequiredData, data);
        }
 }
 
@@ -1173,7 +1182,7 @@ e_backend_credentials_required (EBackend *backend,
 
        g_return_if_fail (E_IS_BACKEND (backend));
 
-       data = g_new0 (CredentialsRequiredData, 1);
+       data = g_slice_new0 (CredentialsRequiredData);
        data->reason = reason;
        data->certificate_pem = g_strdup (certificate_pem);
        data->certificate_errors = certificate_errors;
diff --git a/src/libebackend/e-cache.c b/src/libebackend/e-cache.c
index 66e581428..48a679358 100644
--- a/src/libebackend/e-cache.c
+++ b/src/libebackend/e-cache.c
@@ -384,7 +384,7 @@ e_cache_offline_change_new (const gchar *uid,
 
        g_return_val_if_fail (uid != NULL, NULL);
 
-       change = g_new0 (ECacheOfflineChange, 1);
+       change = g_slice_new0 (ECacheOfflineChange);
        change->uid = g_strdup (uid);
        change->revision = g_strdup (revision);
        change->object = g_strdup (object);
@@ -430,7 +430,7 @@ e_cache_offline_change_free (gpointer change)
                g_free (chng->uid);
                g_free (chng->revision);
                g_free (chng->object);
-               g_free (chng);
+               g_slice_free (ECacheOfflineChange, chng);
        }
 }
 
@@ -455,7 +455,7 @@ e_cache_column_info_new (const gchar *name,
        g_return_val_if_fail (name != NULL, NULL);
        g_return_val_if_fail (type != NULL, NULL);
 
-       info = g_new0 (ECacheColumnInfo, 1);
+       info = g_slice_new0 (ECacheColumnInfo);
        info->name = g_strdup (name);
        info->type = g_strdup (type);
        info->index_name = g_strdup (index_name);
@@ -500,7 +500,7 @@ e_cache_column_info_free (gpointer info)
                g_free (nfo->name);
                g_free (nfo->type);
                g_free (nfo->index_name);
-               g_free (nfo);
+               g_slice_free (ECacheColumnInfo, nfo);
        }
 }
 
@@ -2024,7 +2024,7 @@ foreach_update_row_data_free (gpointer ptr)
                g_free (fr->revision);
                g_free (fr->object);
                g_ptr_array_free (fr->column_values, TRUE);
-               g_free (fr);
+               g_slice_free (struct ForeachUpdateRowData, fr);
        }
 }
 
@@ -2106,7 +2106,7 @@ e_cache_foreach_update_cb (ECache *cache,
                g_ptr_array_add (cvalues, g_strdup (column_values[ii]));
        }
 
-       rd = g_new0 (struct ForeachUpdateRowData, 1);
+       rd = g_slice_new0 (struct ForeachUpdateRowData);
        rd->uid = g_strdup (column_values[fu->uid_index]);
        rd->revision = g_strdup (column_values[fu->revision_index]);
        rd->object = g_strdup (column_values[fu->object_index]);
diff --git a/src/libebackend/e-data-factory.c b/src/libebackend/e-data-factory.c
index 428c4463d..7c4106a68 100644
--- a/src/libebackend/e-data-factory.c
+++ b/src/libebackend/e-data-factory.c
@@ -129,7 +129,7 @@ data_factory_spawn_subprocess_backend_thread_data_new (EDataFactory *data_factor
 {
        DataFactorySpawnSubprocessBackendThreadData *data;
 
-       data = g_new0 (DataFactorySpawnSubprocessBackendThreadData, 1);
+       data = g_slice_new0 (DataFactorySpawnSubprocessBackendThreadData);
        data->data_factory = g_object_ref (data_factory);
        data->invocation = g_object_ref (invocation);
        data->uid = g_strdup (uid);
@@ -149,7 +149,7 @@ data_factory_spawn_subprocess_backend_thread_data_free (DataFactorySpawnSubproce
                g_free (data->extension_name);
                g_free (data->subprocess_path);
 
-               g_free (data);
+               g_slice_free (DataFactorySpawnSubprocessBackendThreadData, data);
        }
 }
 
@@ -168,7 +168,7 @@ data_factory_subprocess_helper_new (EDBusSubprocessBackend *proxy,
 {
        DataFactorySubprocessHelper *helper;
 
-       helper = g_new0 (DataFactorySubprocessHelper, 1);
+       helper = g_slice_new0 (DataFactorySubprocessHelper);
        helper->proxy = g_object_ref (proxy);
        helper->factory_name = g_strdup (factory_name);
        helper->bus_name = g_strdup (bus_name);
@@ -184,7 +184,7 @@ data_factory_subprocess_helper_free (DataFactorySubprocessHelper *helper)
                g_free (helper->factory_name);
                g_free (helper->bus_name);
 
-               g_free (helper);
+               g_slice_free (DataFactorySubprocessHelper, helper);
        }
 }
 
@@ -199,7 +199,7 @@ opened_backend_data_new (EBackend *backend, /* assumes ownership of 'backend' */
 {
        OpenedBackendData *obd;
 
-       obd = g_new0 (OpenedBackendData, 1);
+       obd = g_slice_new0 (OpenedBackendData);
        obd->backend = backend;
        obd->object_path = g_strdup (object_path);
 
@@ -214,7 +214,7 @@ opened_backend_data_free (gpointer ptr)
        if (obd) {
                g_clear_object (&obd->backend);
                g_free (obd->object_path);
-               g_free (obd);
+               g_slice_free (OpenedBackendData, obd);
        }
 }
 
@@ -289,7 +289,7 @@ data_factory_subprocess_data_new (EDataFactory *data_factory,
 {
        DataFactorySubprocessData *sd;
 
-       sd = g_new0 (DataFactorySubprocessData, 1);
+       sd = g_slice_new0 (DataFactorySubprocessData);
        sd->data_factory = g_object_ref (data_factory);
        sd->invocation = g_object_ref (invocation);
        sd->uid = g_strdup (uid);
@@ -319,7 +319,7 @@ data_factory_subprocess_data_free (DataFactorySubprocessData *sd)
                g_free (sd->module_filename);
                g_free (sd->subprocess_helpers_hash_key);
 
-               g_free (sd);
+               g_slice_free (DataFactorySubprocessData, sd);
        }
 }
 
diff --git a/src/libebackend/e-server-side-source.c b/src/libebackend/e-server-side-source.c
index 97f9dd4c4..4ce73a6a9 100644
--- a/src/libebackend/e-server-side-source.c
+++ b/src/libebackend/e-server-side-source.c
@@ -243,7 +243,7 @@ reinvoke_credentials_required_data_free (gpointer ptr)
                g_free (data->arg_certificate_errors);
                g_free (data->arg_dbus_error_name);
                g_free (data->arg_dbus_error_message);
-               g_free (data);
+               g_slice_free (ReinvokeCredentialsRequiredData, data);
        }
 }
 
@@ -307,7 +307,7 @@ server_side_source_invoke_credentials_required_cb (EDBusSource *dbus_interface,
                        source->priv->pending_credentials_lookup = g_object_ref (cancellable);
                        g_mutex_unlock (&source->priv->pending_credentials_lookup_lock);
 
-                       data = g_new0 (ReinvokeCredentialsRequiredData, 1);
+                       data = g_slice_new0 (ReinvokeCredentialsRequiredData);
                        data->source = g_object_ref (source);
                        data->arg_reason = g_strdup (arg_reason);
                        data->arg_certificate_pem = g_strdup (arg_certificate_pem);
diff --git a/src/libebackend/e-source-registry-server.c b/src/libebackend/e-source-registry-server.c
index 8c70ec4a1..69637aa15 100644
--- a/src/libebackend/e-source-registry-server.c
+++ b/src/libebackend/e-source-registry-server.c
@@ -472,7 +472,7 @@ file_event_data_new (GFile *file,
 {
        FileEventData *fed;
 
-       fed = g_new0 (FileEventData, 1);
+       fed = g_slice_new0 (FileEventData);
        fed->file = g_object_ref (file);
        fed->event_type = event_type;
 
@@ -486,7 +486,7 @@ file_event_data_free (gpointer ptr)
 
        if (fed) {
                g_clear_object (&fed->file);
-               g_free (fed);
+               g_slice_free (FileEventData, fed);
        }
 }
 
diff --git a/src/libebackend/e-sqlite3-vfs.c b/src/libebackend/e-sqlite3-vfs.c
index 579e36fe9..785ac3b4f 100644
--- a/src/libebackend/e-sqlite3-vfs.c
+++ b/src/libebackend/e-sqlite3-vfs.c
@@ -87,7 +87,7 @@ sync_request_thread_cb (gpointer task_data,
        g_mutex_unlock (&sync_data->cFile->pending_syncs_lock);
 
        sync_op = sync_data->sync_op;
-       g_free (sync_data);
+       g_slice_free (struct SyncRequestData, sync_data);
 
        if (sync_op)
                e_flag_set (sync_op);
@@ -116,7 +116,7 @@ sync_push_request (ESqlite3File *cFile,
        if (wait_for_finish)
                sync_op = e_flag_new ();
 
-       data = g_new0 (struct SyncRequestData, 1);
+       data = g_slice_new0 (struct SyncRequestData);
        data->cFile = cFile;
        data->flags = cFile->flags;
        data->sync_op = sync_op;
diff --git a/src/libebackend/e-user-prompter-server.c b/src/libebackend/e-user-prompter-server.c
index ca959fb60..a0432f6c3 100644
--- a/src/libebackend/e-user-prompter-server.c
+++ b/src/libebackend/e-user-prompter-server.c
@@ -94,7 +94,7 @@ prompt_request_free (gpointer data)
                g_free (pr->dialog_name);
                e_named_parameters_free (pr->parameters);
 
-               g_free (pr);
+               g_slice_free (PromptRequest, pr);
        }
 }
 
@@ -119,7 +119,7 @@ add_prompt (EUserPrompterServer *server,
 
        server->priv->last_prompt_id++;
 
-       pr = g_new0 (PromptRequest, 1);
+       pr = g_slice_new0 (PromptRequest);
        pr->is_extension_prompt = is_extension_prompt;
        pr->id = server->priv->last_prompt_id;
        pr->type = g_strdup (type);
diff --git a/src/libebackend/e-user-prompter.c b/src/libebackend/e-user-prompter.c
index 34c7f142a..84d44fd55 100644
--- a/src/libebackend/e-user-prompter.c
+++ b/src/libebackend/e-user-prompter.c
@@ -110,7 +110,7 @@ prompter_async_data_free (PrompterAsyncData *async_data)
 
        g_free (async_data->response_signal_name);
 
-       g_free (async_data);
+       g_slice_free (PrompterAsyncData, async_data);
 }
 
 static void
@@ -363,7 +363,7 @@ e_user_prompter_prompt (EUserPrompter *prompter,
                G_OBJECT (prompter), callback, user_data,
                e_user_prompter_prompt);
 
-       async_data = g_new0 (PrompterAsyncData, 1);
+       async_data = g_slice_new0 (PrompterAsyncData);
        async_data->type = g_strdup (type);
        async_data->title = g_strdup (title);
        async_data->primary_text = g_strdup (primary_text);
@@ -525,7 +525,7 @@ e_user_prompter_extension_prompt (EUserPrompter *prompter,
                G_OBJECT (prompter), callback, user_data,
                e_user_prompter_extension_prompt);
 
-       async_data = g_new0 (PrompterAsyncData, 1);
+       async_data = g_slice_new0 (PrompterAsyncData);
        async_data->dialog_name = g_strdup (dialog_name);
        if (in_parameters) {
                async_data->in_parameters = e_named_parameters_new ();
diff --git a/src/libedataserver/e-credentials.c b/src/libedataserver/e-credentials.c
index 89c1cfd85..0b478d345 100644
--- a/src/libedataserver/e-credentials.c
+++ b/src/libedataserver/e-credentials.c
@@ -57,8 +57,8 @@ e_credentials_new (void)
 {
        ECredentials *credentials;
 
-       credentials = g_new0 (ECredentials, 1);
-       credentials->priv = g_new0 (ECredentialsPrivate, 1);
+       credentials = g_slice_new0 (ECredentials);
+       credentials->priv = g_slice_new0 (ECredentialsPrivate);
        credentials->priv->keys = g_hash_table_new_full (g_str_hash, key_equal, g_free, (GDestroyNotify) 
e_credentials_util_safe_free_string);
        credentials->priv->peek_keys = g_hash_table_new_full (g_str_hash, key_equal, g_free, (GDestroyNotify) 
e_credentials_util_safe_free_string);
 
@@ -194,8 +194,8 @@ e_credentials_free (ECredentials *credentials)
 
        g_hash_table_destroy (credentials->priv->keys);
        g_hash_table_destroy (credentials->priv->peek_keys);
-       g_free (credentials->priv);
-       g_free (credentials);
+       g_slice_free (ECredentialsPrivate, credentials->priv);
+       g_slice_free (ECredentials, credentials);
 }
 
 static void
diff --git a/src/libedataserver/e-operation-pool.c b/src/libedataserver/e-operation-pool.c
index 31f13bf09..dcc356dba 100644
--- a/src/libedataserver/e-operation-pool.c
+++ b/src/libedataserver/e-operation-pool.c
@@ -56,7 +56,7 @@ e_operation_pool_new (guint max_threads,
                return NULL;
        }
 
-       pool = g_new0 (EOperationPool, 1);
+       pool = g_slice_new0 (EOperationPool);
        pool->pool = thread_pool;
        g_mutex_init (&pool->ops_lock);
        pool->ops = g_hash_table_new (g_direct_hash, g_direct_equal);
@@ -84,7 +84,7 @@ e_operation_pool_free (EOperationPool *pool)
        g_thread_pool_free (pool->pool, FALSE, FALSE);
        g_mutex_clear (&pool->ops_lock);
        g_hash_table_destroy (pool->ops);
-       g_free (pool);
+       g_slice_free (EOperationPool, pool);
 }
 
 /**
diff --git a/src/libedataserver/e-proxy.c b/src/libedataserver/e-proxy.c
index 577657c5d..bcd07f941 100644
--- a/src/libedataserver/e-proxy.c
+++ b/src/libedataserver/e-proxy.c
@@ -109,15 +109,9 @@ static void
 ep_free_proxy_host_addr (ProxyHostAddr *host)
 {
        if (host) {
-               if (host->addr) {
-                       g_free (host->addr);
-                       host->addr = NULL;
-               }
-               if (host->mask) {
-                       g_free (host->mask);
-                       host->mask = NULL;
-               }
-               g_free (host);
+               g_clear_pointer (&host->addr, g_free);
+               g_clear_pointer (&host->mask, g_free);
+               g_slice_free (ProxyHostAddr, host);
        }
 }
 
@@ -551,7 +545,7 @@ ep_parse_ignore_host (gpointer data,
                gint addr_len;
                struct sockaddr * so_addr = NULL;
 
-               host_addr = g_new0 (ProxyHostAddr, 1);
+               host_addr = g_slice_new0 (ProxyHostAddr);
 
                so_addr = soup_address_get_sockaddr (addr, &addr_len);
 
diff --git a/src/libedataserver/e-source-credentials-provider.c 
b/src/libedataserver/e-source-credentials-provider.c
index e3057aeba..739d4fd94 100644
--- a/src/libedataserver/e-source-credentials-provider.c
+++ b/src/libedataserver/e-source-credentials-provider.c
@@ -522,7 +522,7 @@ async_context_new (ESource *source,
 {
        AsyncContext *async_context;
 
-       async_context = g_new0 (AsyncContext, 1);
+       async_context = g_slice_new0 (AsyncContext);
        async_context->source = g_object_ref (source);
        async_context->permanently = permanently;
        if (credentials)
@@ -539,7 +539,7 @@ async_context_free (gpointer ptr)
        if (async_context) {
                g_clear_object (&async_context->source);
                e_named_parameters_free (async_context->credentials);
-               g_free (async_context);
+               g_slice_free (AsyncContext, async_context);
        }
 }
 
diff --git a/src/libedataserver/e-source.c b/src/libedataserver/e-source.c
index e7b8cff54..a77fc27f9 100644
--- a/src/libedataserver/e-source.c
+++ b/src/libedataserver/e-source.c
@@ -4626,7 +4626,7 @@ invoke_credentials_required_data_free (gpointer ptr)
        if (data) {
                g_free (data->certificate_pem);
                g_clear_error (&data->op_error);
-               g_free (data);
+               g_slice_free (InvokeCredentialsRequiredData, data);
        }
 }
 
@@ -4686,7 +4686,7 @@ e_source_invoke_credentials_required (ESource *source,
 
        g_return_if_fail (E_IS_SOURCE (source));
 
-       data = g_new0 (InvokeCredentialsRequiredData, 1);
+       data = g_slice_new0 (InvokeCredentialsRequiredData);
        data->reason = reason;
        data->certificate_pem = g_strdup (certificate_pem);
        data->certificate_errors = certificate_errors;
@@ -5033,7 +5033,7 @@ source_get_last_credentials_required_arguments_thread (GTask *task,
        InvokeCredentialsRequiredData *data;
        GError *local_error = NULL;
 
-       data = g_new0 (InvokeCredentialsRequiredData, 1);
+       data = g_slice_new0 (InvokeCredentialsRequiredData);
        data->reason = E_SOURCE_CREDENTIALS_REASON_UNKNOWN;
        data->certificate_pem = NULL;
        data->certificate_errors = 0;
@@ -5046,6 +5046,7 @@ source_get_last_credentials_required_arguments_thread (GTask *task,
 
        if (local_error != NULL) {
                g_task_return_error (task, local_error);
+               invoke_credentials_required_data_free (data);
        } else {
                g_task_return_pointer (task, data, invoke_credentials_required_data_free);
        }
diff --git a/src/libedataserver/e-webdav-discover.c b/src/libedataserver/e-webdav-discover.c
index 8629c4c0b..938d10b93 100644
--- a/src/libedataserver/e-webdav-discover.c
+++ b/src/libedataserver/e-webdav-discover.c
@@ -63,7 +63,7 @@ e_webdav_discover_split_resources (WebDAVDiscoverData *wdd,
                            (resource->supports & wdd->only_supports) == 0)
                                continue;
 
-                       discovered = g_new0 (EWebDAVDiscoveredSource, 1);
+                       discovered = g_slice_new0 (EWebDAVDiscoveredSource);
                        discovered->href = g_strdup (resource->href);
                        discovered->supports = resource->supports;
                        discovered->display_name = g_strdup (resource->display_name);
@@ -362,7 +362,7 @@ e_webdav_discover_context_new (ESource *source,
 {
        EWebDAVDiscoverContext *context;
 
-       context = g_new0 (EWebDAVDiscoverContext, 1);
+       context = g_slice_new0 (EWebDAVDiscoverContext);
        context->source = g_object_ref (source);
        context->url_use_path = g_strdup (url_use_path);
        context->only_supports = only_supports;
@@ -391,7 +391,7 @@ e_webdav_discover_context_free (gpointer ptr)
        g_free (context->out_certificate_pem);
        e_webdav_discover_free_discovered_sources (context->out_discovered_sources);
        g_slist_free_full (context->out_calendar_user_addresses, g_free);
-       g_free (context);
+       g_slice_free (EWebDAVDiscoverContext, context);
 }
 
 static void
@@ -404,7 +404,7 @@ e_webdav_discover_source_free (gpointer ptr)
                g_free (discovered_source->display_name);
                g_free (discovered_source->description);
                g_free (discovered_source->color);
-               g_free (discovered_source);
+               g_slice_free (EWebDAVDiscoveredSource, discovered_source);
        }
 }
 
diff --git a/src/libedataserver/e-webdav-session.c b/src/libedataserver/e-webdav-session.c
index afb8ef4d7..1117e451c 100644
--- a/src/libedataserver/e-webdav-session.c
+++ b/src/libedataserver/e-webdav-session.c
@@ -92,7 +92,7 @@ e_webdav_resource_new (EWebDAVResourceKind kind,
 {
        EWebDAVResource *resource;
 
-       resource = g_new0 (EWebDAVResource, 1);
+       resource = g_slice_new0 (EWebDAVResource);
        resource->kind = kind;
        resource->supports = supports;
        resource->href = g_strdup (href);
@@ -158,7 +158,7 @@ e_webdav_resource_free (gpointer ptr)
                g_free (resource->content_type);
                g_free (resource->description);
                g_free (resource->color);
-               g_free (resource);
+               g_slice_free (EWebDAVResource, resource);
        }
 }
 
@@ -170,7 +170,7 @@ e_webdav_property_change_new (EWebDAVPropertyChangeKind kind,
 {
        EWebDAVPropertyChange *change;
 
-       change = g_new0 (EWebDAVPropertyChange, 1);
+       change = g_slice_new0 (EWebDAVPropertyChange);
        change->kind = kind;
        change->ns_uri = g_strdup (ns_uri);
        change->name = g_strdup (name);
@@ -273,7 +273,7 @@ e_webdav_property_change_free (gpointer ptr)
                g_free (change->ns_uri);
                g_free (change->name);
                g_free (change->value);
-               g_free (change);
+               g_slice_free (EWebDAVPropertyChange, change);
        }
 }
 
@@ -391,7 +391,7 @@ e_webdav_privilege_new (const gchar *ns_uri,
                }
        }
 
-       privilege = g_new (EWebDAVPrivilege, 1);
+       privilege = g_slice_new (EWebDAVPrivilege);
        privilege->ns_uri = g_strdup (ns_uri);
        privilege->name = g_strdup (name);
        privilege->description = g_strdup (description);
@@ -443,7 +443,7 @@ e_webdav_privilege_free (gpointer ptr)
                g_free (privilege->ns_uri);
                g_free (privilege->name);
                g_free (privilege->description);
-               g_free (privilege);
+               g_slice_free (EWebDAVPrivilege, privilege);
        }
 }
 
@@ -485,7 +485,7 @@ e_webdav_access_control_entry_new (EWebDAVACEPrincipalKind principal_kind,
        else
                g_return_val_if_fail (inherited_href == NULL, NULL);
 
-       ace = g_new0 (EWebDAVAccessControlEntry, 1);
+       ace = g_slice_new0 (EWebDAVAccessControlEntry);
        ace->principal_kind = principal_kind;
        ace->principal_href = g_strdup (principal_href);
        ace->flags = flags;
@@ -552,7 +552,7 @@ e_webdav_access_control_entry_free (gpointer ptr)
                g_free (ace->principal_href);
                g_free (ace->inherited_href);
                g_slist_free_full (ace->privileges, e_webdav_privilege_free);
-               g_free (ace);
+               g_slice_free (EWebDAVAccessControlEntry, ace);
        }
 }
 
diff --git a/src/libedataserverui/e-credentials-prompter-impl-oauth2.c 
b/src/libedataserverui/e-credentials-prompter-impl-oauth2.c
index bcc7ce1dd..e47ce1881 100644
--- a/src/libedataserverui/e-credentials-prompter-impl-oauth2.c
+++ b/src/libedataserverui/e-credentials-prompter-impl-oauth2.c
@@ -170,7 +170,7 @@ access_token_thread_data_free (gpointer user_data)
                g_clear_object (&td->registry);
                g_clear_object (&td->service);
                g_free (td->authorization_code);
-               g_free (td);
+               g_slice_free (AccessTokenThreadData, td);
        }
 }
 
@@ -252,7 +252,7 @@ cpi_oauth2_extract_authentication_code (ECredentialsPrompterImplOAuth2 *prompter
                prompter_impl = E_CREDENTIALS_PROMPTER_IMPL (prompter_oauth2);
                prompter = e_credentials_prompter_impl_get_credentials_prompter (prompter_impl);
 
-               td = g_new0 (AccessTokenThreadData, 1);
+               td = g_slice_new0 (AccessTokenThreadData);
                td->prompter_oauth2 = e_weak_ref_new (prompter_oauth2);
                td->service = g_object_ref (prompter_oauth2->priv->service);
                td->cancellable = g_object_ref (prompter_oauth2->priv->cancellable);
diff --git a/src/libedataserverui/e-credentials-prompter.c b/src/libedataserverui/e-credentials-prompter.c
index a0aa64e94..131927be8 100644
--- a/src/libedataserverui/e-credentials-prompter.c
+++ b/src/libedataserverui/e-credentials-prompter.c
@@ -105,7 +105,7 @@ process_prompt_data_free (gpointer ptr)
                g_clear_object (&ppd->cred_source);
                g_free (ppd->error_text);
                e_named_parameters_free (ppd->credentials);
-               g_free (ppd);
+               g_slice_free (ProcessPromptData, ppd);
        }
 }
 
@@ -124,7 +124,7 @@ lookup_source_details_data_free (gpointer ptr)
                g_clear_object (&data->auth_source);
                g_clear_object (&data->cred_source);
                e_named_parameters_free (data->credentials);
-               g_free (data);
+               g_slice_free (LookupSourceDetailsData, data);
        }
 }
 
@@ -160,7 +160,7 @@ credentials_prompter_lookup_source_details_thread (GTask *task,
        } else {
                LookupSourceDetailsData *data;
 
-               data = g_new0 (LookupSourceDetailsData, 1);
+               data = g_slice_new0 (LookupSourceDetailsData);
                data->auth_source = g_object_ref (source);
                data->cred_source = g_object_ref (cred_source ? cred_source : source); /* always set both, 
for simplicity */
                data->credentials = credentials; /* NULL for no credentials available */
@@ -263,7 +263,7 @@ credentials_prompt_data_free (gpointer ptr)
 
                g_clear_object (&data->source);
                g_free (data->error_text);
-               g_free (data);
+               g_slice_free (CredentialsPromptData, data);
        }
 }
 
@@ -280,11 +280,10 @@ credentials_result_data_free (gpointer ptr)
        if (data) {
                g_clear_object (&data->source);
                e_named_parameters_free (data->credentials);
-               g_free (data);
+               g_slice_free (CredentialsResultData, data);
        }
 }
 
-
 static void
 credentials_prompter_maybe_process_next_prompt (ECredentialsPrompter *prompter)
 {
@@ -445,7 +444,7 @@ e_credentials_prompter_manage_impl_prompt (ECredentialsPrompter *prompter,
        } else {
                ProcessPromptData *ppd;
 
-               ppd = g_new0 (ProcessPromptData, 1);
+               ppd = g_slice_new0 (ProcessPromptData);
                ppd->prompter = e_weak_ref_new (prompter);
                ppd->prompter_impl = g_object_ref (prompter_impl);
                ppd->auth_source = g_object_ref (auth_source);
@@ -1630,7 +1629,7 @@ e_credentials_prompter_prompt (ECredentialsPrompter *prompter,
        g_return_if_fail (E_IS_CREDENTIALS_PROMPTER (prompter));
        g_return_if_fail (E_IS_SOURCE (source));
 
-       prompt_data = g_new0 (CredentialsPromptData, 1);
+       prompt_data = g_slice_new0 (CredentialsPromptData);
        prompt_data->source = g_object_ref (source);
        prompt_data->error_text = g_strdup (error_text);
        prompt_data->flags = flags;
@@ -1738,7 +1737,7 @@ e_credentials_prompter_complete_prompt_call (ECredentialsPrompter *prompter,
        } else {
                CredentialsResultData *result;
 
-               result = g_new0 (CredentialsResultData, 1);
+               result = g_slice_new0 (CredentialsResultData);
                result->source = g_object_ref (source);
                result->credentials = e_named_parameters_new_clone (credentials);
 
diff --git a/src/libedataserverui/e-reminders-widget.c b/src/libedataserverui/e-reminders-widget.c
index 1f4ae561c..9838398e9 100644
--- a/src/libedataserverui/e-reminders-widget.c
+++ b/src/libedataserverui/e-reminders-widget.c
@@ -750,7 +750,7 @@ foreach_selected_data_free (gpointer ptr)
                if (fsd->user_data_destroy)
                        fsd->user_data_destroy (fsd->user_data);
                g_free (fsd->error_prefix);
-               g_free (fsd);
+               g_slice_free (ForeachSelectedData, fsd);
        }
 }
 
@@ -833,7 +833,7 @@ reminders_widget_foreach_selected (ERemindersWidget *reminders,
        if (selected) {
                ForeachSelectedData *fsd;
 
-               fsd = g_new0 (ForeachSelectedData, 1);
+               fsd = g_slice_new0 (ForeachSelectedData);
                fsd->selected = selected; /* Takes ownership */
                fsd->sync_func = sync_func;
                fsd->user_data = user_data;
diff --git a/src/libedataserverui/e-trust-prompt.c b/src/libedataserverui/e-trust-prompt.c
index 06e6691d6..6b3faac48 100644
--- a/src/libedataserverui/e-trust-prompt.c
+++ b/src/libedataserverui/e-trust-prompt.c
@@ -455,7 +455,7 @@ save_source_data_free (gpointer ptr)
 
        if (data) {
                g_clear_error (&data->error);
-               g_free (data);
+               g_slice_free (SaveSourceData, data);
        }
 }
 
@@ -568,7 +568,7 @@ e_trust_prompt_run_for_source (GtkWindow *parent,
        if (e_source_has_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND))
                extension_webdav = e_source_get_extension (source, E_SOURCE_EXTENSION_WEBDAV_BACKEND);
 
-       save_data = g_new0 (SaveSourceData, 1);
+       save_data = g_slice_new0 (SaveSourceData);
        save_data->response = E_TRUST_PROMPT_RESPONSE_UNKNOWN;
        save_data->call_save = FALSE;
 
diff --git a/src/libedataserverui/e-webdav-discover-widget.c b/src/libedataserverui/e-webdav-discover-widget.c
index bce73c4b6..916cd6d68 100644
--- a/src/libedataserverui/e-webdav-discover-widget.c
+++ b/src/libedataserverui/e-webdav-discover-widget.c
@@ -64,7 +64,7 @@ e_webdav_discover_content_data_free (gpointer ptr)
                g_clear_object (&data->credentials_prompter);
                g_clear_object (&data->source);
                g_free (data->base_url);
-               g_free (data);
+               g_slice_free (EWebDAVDiscoverContentData, data);
        }
 }
 
@@ -102,7 +102,7 @@ e_webdav_discover_content_new (ECredentialsPrompter *credentials_prompter,
        g_return_val_if_fail (E_IS_CREDENTIALS_PROMPTER (credentials_prompter), NULL);
        g_return_val_if_fail (base_url != NULL, NULL);
 
-       data = g_new0 (EWebDAVDiscoverContentData, 1);
+       data = g_slice_new0 (EWebDAVDiscoverContentData);
        data->credentials_prompter = g_object_ref (credentials_prompter);
        data->source = source ? g_object_ref (source) : NULL;
        data->base_url = g_strdup (base_url);
@@ -623,7 +623,7 @@ refresh_data_free (gpointer ptr)
                g_clear_object (&rd->registry);
                g_free (rd->base_url);
                e_named_parameters_free (rd->credentials);
-               g_free (rd);
+               g_slice_free (RefreshData, rd);
        }
 }
 
@@ -853,7 +853,7 @@ e_webdav_discover_content_refresh (GtkWidget *content,
                return;
        }
 
-       rd = g_new0 (RefreshData, 1);
+       rd = g_slice_new0 (RefreshData);
        rd->content = g_object_ref (content);
        rd->cancellable = cancellable ? g_object_ref (cancellable) : g_cancellable_new ();
        rd->simple = g_simple_async_result_new (G_OBJECT (content), callback, user_data, 
e_webdav_discover_content_refresh);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]