recurrence: use refcount instead of copy/free
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user