[gnome-calendar] recurrence: use refcount instead of copy/free



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]