[gnome-calendar] recurrence: use refcount instead of copy/free
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar] recurrence: use refcount instead of copy/free
- Date: Thu, 7 Sep 2017 03:03:13 +0000 (UTC)
commit edce0ab0768ebd2b2d471847e0dd2f6c7a41ab13
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date: Wed Sep 6 22:15:13 2017 -0300
recurrence: use refcount instead of copy/free
src/gcal-edit-dialog.c | 2 +-
src/gcal-event.c | 4 ++--
src/gcal-recurrence.c | 40 ++++++++++++++++++++++++++++++----------
src/gcal-recurrence.h | 26 +++++++++++++++++---------
4 files changed, 50 insertions(+), 22 deletions(-)
---
diff --git a/src/gcal-edit-dialog.c b/src/gcal-edit-dialog.c
index 2a55f59..f7ec8a2 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 e52490a..41f8475 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 1291ae4..6113501 100644
--- a/src/gcal-recurrence.c
+++ b/src/gcal-recurrence.c
@@ -23,7 +23,17 @@
#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:
@@ -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
- */
+GcalRecurrence *
+gcal_recurrence_ref (GcalRecurrence *self)
+{
+ 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_free (GcalRecurrence *recur)
+gcal_recurrence_unref (GcalRecurrence *self)
{
- gcal_clear_datetime (&recur->limit.until);
- g_slice_free (GcalRecurrence, recur);
+ 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 6a313dd..00b1979 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);
+
+
+GcalRecurrence* gcal_recurrence_ref (GcalRecurrence *self);
+
+void gcal_recurrence_unref (GcalRecurrence *self);
-void gcal_recurrence_free (GcalRecurrence *recur);
+gboolean gcal_recurrence_is_equal (GcalRecurrence *recur1,
+ GcalRecurrence *recur2);
-gboolean gcal_recurrence_is_equal (GcalRecurrence *recur1,
- GcalRecurrence *recur2);
+GcalRecurrence* gcal_recurrence_parse_recurrence_rules (ECalComponent *comp);
-GcalRecurrence* gcal_recurrence_parse_recurrence_rules (ECalComponent *comp);
+struct icalrecurrencetype* gcal_recurrence_to_rrule (GcalRecurrence *recur);
-struct icalrecurrencetype* gcal_recurrence_to_rrule (GcalRecurrence *recur);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (GcalRecurrence, gcal_recurrence_unref)
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]