From edce0ab0768ebd2b2d471847e0dd2f6c7a41ab13 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Wed, 6 Sep 2017 22:15:13 -0300 Subject: [PATCH] recurrence: use refcount instead of copy/free --- src/gcal-edit-dialog.c | 2 +- src/gcal-event.c | 4 ++-- src/gcal-recurrence.c | 42 +++++++++++++++++++++++++++++++----------- src/gcal-recurrence.h | 26 +++++++++++++++++--------- 4 files changed, 51 insertions(+), 23 deletions(-) diff --git a/src/gcal-edit-dialog.c b/src/gcal-edit-dialog.c index 2a55f59b..f7ec8a2a 100644 --- a/src/gcal-edit-dialog.c +++ b/src/gcal-edit-dialog.c @@ -521,7 +521,7 @@ action_button_clicked (GtkWidget *widget, dialog->recurrence_changed = TRUE; } - g_clear_pointer (&recur, gcal_recurrence_free); + g_clear_pointer (&recur, gcal_recurrence_unref); } else { diff --git a/src/gcal-event.c b/src/gcal-event.c index e52490ac..41f8475d 100644 --- a/src/gcal-event.c +++ b/src/gcal-event.c @@ -437,7 +437,7 @@ gcal_event_finalize (GObject *object) g_clear_pointer (&self->color, gdk_rgba_free); g_clear_object (&self->component); g_clear_object (&self->source); - g_clear_pointer (&self->recurrence, gcal_recurrence_free); + g_clear_pointer (&self->recurrence, gcal_recurrence_unref); G_OBJECT_CLASS (gcal_event_parent_class)->finalize (object); } @@ -1651,7 +1651,7 @@ gcal_event_set_recurrence (GcalEvent *self, comp = gcal_event_get_component (self); icalcomp = e_cal_component_get_icalcomponent (comp); - g_clear_pointer (&self->recurrence, gcal_recurrence_free); + g_clear_pointer (&self->recurrence, gcal_recurrence_unref); self->recurrence = gcal_recurrence_copy (recur); prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY); diff --git a/src/gcal-recurrence.c b/src/gcal-recurrence.c index 1291ae4e..61135013 100644 --- a/src/gcal-recurrence.c +++ b/src/gcal-recurrence.c @@ -23,7 +23,17 @@ #include -G_DEFINE_BOXED_TYPE (GcalRecurrence, gcal_recurrence, gcal_recurrence_copy, gcal_recurrence_free) +G_DEFINE_BOXED_TYPE (GcalRecurrence, gcal_recurrence, gcal_recurrence_ref, gcal_recurrence_unref) + +static void +gcal_recurrence_free (GcalRecurrence *self) +{ + g_assert (self); + g_assert_cmpint (self->ref_count, ==, 0); + + gcal_clear_datetime (&self->limit.until); + g_slice_free (GcalRecurrence, self); +} /** * gcal_recurrence_new: @@ -45,6 +55,8 @@ gcal_recurrence_new (void) new_recur->limit.until = NULL; new_recur->limit.count = 0; + new_recur->ref_count = 1; + return new_recur; } @@ -76,17 +88,25 @@ gcal_recurrence_copy (GcalRecurrence *recur) return new_recur; } -/** - * gcal_recurrence_free: - * @recur: a #GcalRecurrence. - * - * Frees @recur - */ -void -gcal_recurrence_free (GcalRecurrence *recur) +GcalRecurrence * +gcal_recurrence_ref (GcalRecurrence *self) { - gcal_clear_datetime (&recur->limit.until); - g_slice_free (GcalRecurrence, recur); + g_return_val_if_fail (self, NULL); + g_return_val_if_fail (self->ref_count, NULL); + + g_atomic_int_inc (&self->ref_count); + + return self; +} + +void +gcal_recurrence_unref (GcalRecurrence *self) +{ + g_return_if_fail (self); + g_return_if_fail (self->ref_count); + + if (g_atomic_int_dec_and_test (&self->ref_count)) + gcal_recurrence_free (self); } /** diff --git a/src/gcal-recurrence.h b/src/gcal-recurrence.h index 6a313ddf..00b19798 100644 --- a/src/gcal-recurrence.h +++ b/src/gcal-recurrence.h @@ -49,12 +49,15 @@ typedef enum struct _GcalRecurrence { + gint ref_count; + GcalRecurrenceFrequency frequency; GcalRecurrenceLimitType limit_type; - struct { - GDateTime *until; - guint count; + struct + { + GDateTime *until; + guint count; } limit; }; @@ -63,16 +66,21 @@ GType gcal_recurrence_get_type (void) G_GNUC_C GcalRecurrence* gcal_recurrence_new (void); -GcalRecurrence* gcal_recurrence_copy (GcalRecurrence *recur); +GcalRecurrence* gcal_recurrence_copy (GcalRecurrence *recur); -void gcal_recurrence_free (GcalRecurrence *recur); -gboolean gcal_recurrence_is_equal (GcalRecurrence *recur1, - GcalRecurrence *recur2); +GcalRecurrence* gcal_recurrence_ref (GcalRecurrence *self); -GcalRecurrence* gcal_recurrence_parse_recurrence_rules (ECalComponent *comp); +void gcal_recurrence_unref (GcalRecurrence *self); -struct icalrecurrencetype* gcal_recurrence_to_rrule (GcalRecurrence *recur); +gboolean gcal_recurrence_is_equal (GcalRecurrence *recur1, + GcalRecurrence *recur2); + +GcalRecurrence* gcal_recurrence_parse_recurrence_rules (ECalComponent *comp); + +struct icalrecurrencetype* gcal_recurrence_to_rrule (GcalRecurrence *recur); + +G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcalRecurrence, gcal_recurrence_unref) G_END_DECLS