recurrence: use refcount instead of copy/free

This commit is contained in:
Georges Basile Stavracas Neto
2017-09-06 22:15:13 -03:00
parent 0cb6f20aea
commit edce0ab076
4 changed files with 51 additions and 23 deletions
+1 -1
View File
@@ -521,7 +521,7 @@ action_button_clicked (GtkWidget *widget,
dialog->recurrence_changed = TRUE; dialog->recurrence_changed = TRUE;
} }
g_clear_pointer (&recur, gcal_recurrence_free); g_clear_pointer (&recur, gcal_recurrence_unref);
} }
else else
{ {
+2 -2
View File
@@ -437,7 +437,7 @@ gcal_event_finalize (GObject *object)
g_clear_pointer (&self->color, gdk_rgba_free); g_clear_pointer (&self->color, gdk_rgba_free);
g_clear_object (&self->component); g_clear_object (&self->component);
g_clear_object (&self->source); 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); 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); comp = gcal_event_get_component (self);
icalcomp = e_cal_component_get_icalcomponent (comp); 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); self->recurrence = gcal_recurrence_copy (recur);
prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY); prop = icalcomponent_get_first_property (icalcomp, ICAL_RRULE_PROPERTY);
+31 -11
View File
@@ -23,7 +23,17 @@
#include <glib.h> #include <glib.h>
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: * gcal_recurrence_new:
@@ -45,6 +55,8 @@ gcal_recurrence_new (void)
new_recur->limit.until = NULL; new_recur->limit.until = NULL;
new_recur->limit.count = 0; new_recur->limit.count = 0;
new_recur->ref_count = 1;
return new_recur; return new_recur;
} }
@@ -76,17 +88,25 @@ gcal_recurrence_copy (GcalRecurrence *recur)
return new_recur; return new_recur;
} }
/** GcalRecurrence *
* gcal_recurrence_free: gcal_recurrence_ref (GcalRecurrence *self)
* @recur: a #GcalRecurrence.
*
* Frees @recur
*/
void
gcal_recurrence_free (GcalRecurrence *recur)
{ {
gcal_clear_datetime (&recur->limit.until); g_return_val_if_fail (self, NULL);
g_slice_free (GcalRecurrence, recur); 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);
} }
/** /**
+15 -7
View File
@@ -49,10 +49,13 @@ typedef enum
struct _GcalRecurrence struct _GcalRecurrence
{ {
gint ref_count;
GcalRecurrenceFrequency frequency; GcalRecurrenceFrequency frequency;
GcalRecurrenceLimitType limit_type; GcalRecurrenceLimitType limit_type;
struct { struct
{
GDateTime *until; GDateTime *until;
guint count; guint count;
} limit; } limit;
@@ -63,16 +66,21 @@ GType gcal_recurrence_get_type (void) G_GNUC_C
GcalRecurrence* gcal_recurrence_new (void); 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* gcal_recurrence_ref (GcalRecurrence *self);
GcalRecurrence *recur2);
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 G_END_DECLS