[gnome-calendar/gbsneto/timeline: 14/36] event: Remove event cache



commit 94413c26b11f4fe77def5c5fb709c2933a23e4b8
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Wed Mar 25 11:19:39 2020 -0300

    event: Remove event cache
    
    It's for the best. The cache was being more
    problematic than it was worth it.

 src/core/gcal-event.c | 301 +++++++++++++++++---------------------------------
 1 file changed, 102 insertions(+), 199 deletions(-)
---
diff --git a/src/core/gcal-event.c b/src/core/gcal-event.c
index cd8e0465..831ea644 100644
--- a/src/core/gcal-event.c
+++ b/src/core/gcal-event.c
@@ -134,40 +134,6 @@ enum {
 
 static GParamSpec* properties[N_PROPS] = { NULL, };
 
-
-/*
- * GcalEvent cache
- */
-
-G_LOCK_DEFINE (main_lock);
-G_LOCK_DEFINE (event_cache_lock);
-
-static GHashTable *event_cache = NULL;
-
-G_DEFINE_CONSTRUCTOR (init_event_cache_map);
-
-static void
-init_event_cache_map (void)
-{
-  event_cache = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
-}
-
-G_DEFINE_DESTRUCTOR (destroy_event_cache_map);
-
-static void
-destroy_event_cache_map (void)
-{
-  GList *events;
-
-  g_debug ("Number of cached events at destruction: %d", g_hash_table_size (event_cache));
-
-  /* Destroy all events */
-  events = g_hash_table_get_values (event_cache);
-  g_list_free_full (events, g_object_unref);
-
-  g_hash_table_destroy (event_cache);
-}
-
 /*
  * Auxiliary methods
  */
@@ -267,23 +233,11 @@ gcal_event_update_uid_internal (GcalEvent *self)
 {
   ECalComponentId *id;
   const gchar *source_id;
-  gboolean should_update_cache;
 
   /* Setup event uid */
   source_id = self->calendar ? gcal_calendar_get_id (self->calendar) : "";
   id = e_cal_component_get_id (self->component);
 
-  should_update_cache = self->uid != NULL;
-
-  G_LOCK (event_cache_lock);
-
-  if (should_update_cache)
-    {
-      g_debug ("Removing '%s' (%p) from cache", self->uid, self);
-      g_hash_table_remove (event_cache, self->uid);
-      g_clear_pointer (&self->uid, g_free);
-    }
-
   if (e_cal_component_id_get_rid (id) != NULL)
     {
       self->uid = g_strdup_printf ("%s:%s:%s",
@@ -298,14 +252,6 @@ gcal_event_update_uid_internal (GcalEvent *self)
                                    e_cal_component_id_get_uid (id));
     }
 
-  if (should_update_cache)
-    {
-      g_debug ("Adding %s to the cache", self->uid);
-      g_hash_table_insert (event_cache, self->uid, self);
-    }
-
-  G_UNLOCK (event_cache_lock);
-
   e_cal_component_id_free (id);
   g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UID]);
 }
@@ -343,125 +289,124 @@ static void
 gcal_event_set_component_internal (GcalEvent     *self,
                                    ECalComponent *component)
 {
-  if (g_set_object (&self->component, component))
+  g_autoptr (GTimeZone) zone_start = NULL;
+  g_autoptr (GTimeZone) zone_end = NULL;
+  ECalComponentDateTime *start;
+  ECalComponentDateTime *end;
+  ECalComponentText *text;
+  ICalTime *date;
+  GDateTime *date_start;
+  GDateTime *date_end;
+  gboolean start_is_all_day, end_is_all_day;
+  gchar *description, *location;
+
+  g_assert (self->component == NULL);
+
+  self->component = e_cal_component_clone (component);
+
+  /* Setup start date */
+  start = e_cal_component_get_dtstart (component);
+
+  /*
+   * A NULL start date is invalid. We set something bogus to proceed, and make
+   * it set a GError and return NULL.
+   */
+  if (!start || !e_cal_component_datetime_get_value (start))
     {
-      ECalComponentDateTime *start;
-      ECalComponentDateTime *end;
-      ECalComponentText *text;
-      ICalTime *date;
-      GDateTime *date_start;
-      GTimeZone *zone_start = NULL;
-      GDateTime *date_end;
-      GTimeZone *zone_end = NULL;
-      gboolean start_is_all_day, end_is_all_day;
-      gchar *description, *location;
-
-      /* Setup start date */
-      start = e_cal_component_get_dtstart (component);
+      self->is_valid = FALSE;
+      g_set_error (&self->initialization_error,
+                   GCAL_EVENT_ERROR,
+                   GCAL_EVENT_ERROR_INVALID_START_DATE,
+                   "Event '%s' has an invalid start date", gcal_event_get_uid (self));
 
-      /*
-       * A NULL start date is invalid. We set something bogus to proceed, and make
-       * it set a GError and return NULL.
-       */
-      if (!start || !e_cal_component_datetime_get_value (start))
-        {
-          self->is_valid = FALSE;
-          g_set_error (&self->initialization_error,
-                       GCAL_EVENT_ERROR,
-                       GCAL_EVENT_ERROR_INVALID_START_DATE,
-                       "Event '%s' has an invalid start date", gcal_event_get_uid (self));
-
-          e_cal_component_datetime_free (start);
-          start = e_cal_component_datetime_new_take (i_cal_time_new_today (), NULL);
-        }
+      e_cal_component_datetime_free (start);
+      start = e_cal_component_datetime_new_take (i_cal_time_new_today (), NULL);
+    }
 
-      GCAL_TRACE_MSG ("Retrieving start timezone");
+  GCAL_TRACE_MSG ("Retrieving start timezone");
 
-      date = i_cal_time_normalize (e_cal_component_datetime_get_value (start));
-      zone_start = get_timezone_from_ical (start);
-      date_start = g_date_time_new (zone_start,
-                                    i_cal_time_get_year (date),
-                                    i_cal_time_get_month (date),
-                                    i_cal_time_get_day (date),
-                                    i_cal_time_is_date (date) ? 0 : i_cal_time_get_hour (date),
-                                    i_cal_time_is_date (date) ? 0 : i_cal_time_get_minute (date),
-                                    i_cal_time_is_date (date) ? 0 : i_cal_time_get_second (date));
-      start_is_all_day = gcal_date_time_is_date (date_start);
+  date = i_cal_time_normalize (e_cal_component_datetime_get_value (start));
+  zone_start = get_timezone_from_ical (start);
+  date_start = g_date_time_new (zone_start,
+                                i_cal_time_get_year (date),
+                                i_cal_time_get_month (date),
+                                i_cal_time_get_day (date),
+                                i_cal_time_is_date (date) ? 0 : i_cal_time_get_hour (date),
+                                i_cal_time_is_date (date) ? 0 : i_cal_time_get_minute (date),
+                                i_cal_time_is_date (date) ? 0 : i_cal_time_get_second (date));
+  start_is_all_day = gcal_date_time_is_date (date_start);
 
-      self->dt_start = date_start;
+  self->dt_start = date_start;
 
-      g_clear_object (&date);
+  g_clear_object (&date);
 
-      /* Setup end date */
-      end = e_cal_component_get_dtend (component);
+  /* Setup end date */
+  end = e_cal_component_get_dtend (component);
 
-      if (!end || !e_cal_component_datetime_get_value (end))
-        {
-          self->all_day = TRUE;
-        }
-      else
-        {
-          GCAL_TRACE_MSG ("Retrieving end timezone");
+  if (!end || !e_cal_component_datetime_get_value (end))
+    {
+      self->all_day = TRUE;
+    }
+  else
+    {
+      GCAL_TRACE_MSG ("Retrieving end timezone");
 
-          date = i_cal_time_normalize (e_cal_component_datetime_get_value (end));
-          zone_end = get_timezone_from_ical (end);
-          date_end = g_date_time_new (zone_end,
-                                      i_cal_time_get_year (date),
-                                      i_cal_time_get_month (date),
-                                      i_cal_time_get_day (date),
-                                      i_cal_time_is_date (date) ? 0 : i_cal_time_get_hour (date),
-                                      i_cal_time_is_date (date) ? 0 : i_cal_time_get_minute (date),
-                                      i_cal_time_is_date (date) ? 0 : i_cal_time_get_second (date));
-          end_is_all_day = gcal_date_time_is_date (date_end);
+      date = i_cal_time_normalize (e_cal_component_datetime_get_value (end));
+      zone_end = get_timezone_from_ical (end);
+      date_end = g_date_time_new (zone_end,
+                                  i_cal_time_get_year (date),
+                                  i_cal_time_get_month (date),
+                                  i_cal_time_get_day (date),
+                                  i_cal_time_is_date (date) ? 0 : i_cal_time_get_hour (date),
+                                  i_cal_time_is_date (date) ? 0 : i_cal_time_get_minute (date),
+                                  i_cal_time_is_date (date) ? 0 : i_cal_time_get_second (date));
+      end_is_all_day = gcal_date_time_is_date (date_end);
 
-          self->dt_end = g_date_time_ref (date_end);
+      self->dt_end = g_date_time_ref (date_end);
 
-          /* Setup all day */
-          self->all_day = start_is_all_day && end_is_all_day;
+      /* Setup all day */
+      self->all_day = start_is_all_day && end_is_all_day;
 
-          g_clear_object (&date);
-        }
+      g_clear_object (&date);
+    }
 
-      /* Summary */
-      text = e_cal_component_get_summary (component);
-      if (text && e_cal_component_text_get_value (text))
-        gcal_event_set_summary (self, e_cal_component_text_get_value (text));
-      else
-        gcal_event_set_summary (self, "");
+  /* Summary */
+  text = e_cal_component_get_summary (component);
+  if (text && e_cal_component_text_get_value (text))
+    gcal_event_set_summary (self, e_cal_component_text_get_value (text));
+  else
+    gcal_event_set_summary (self, "");
 
-      /* Location */
-      location = e_cal_component_get_location (component);
-      gcal_event_set_location (self, location ? location : "");
+  /* Location */
+  location = e_cal_component_get_location (component);
+  gcal_event_set_location (self, location ? location : "");
 
-      /* Setup description */
-      description = get_desc_from_component (component, "\n\n");
-      gcal_event_set_description (self, description);
+  /* Setup description */
+  description = get_desc_from_component (component, "\n\n");
+  gcal_event_set_description (self, description);
 
-      /* Setup UID */
-      gcal_event_update_uid_internal (self);
+  /* Setup UID */
+  gcal_event_update_uid_internal (self);
 
-      /* Set has-recurrence to check if the component has recurrence or not */
-      self->has_recurrence = e_cal_component_has_recurrences(component);
+  /* Set has-recurrence to check if the component has recurrence or not */
+  self->has_recurrence = e_cal_component_has_recurrences(component);
 
-      /* Load the recurrence-rules in GcalRecurrence struct */
-      self->recurrence = gcal_recurrence_parse_recurrence_rules (component);
+  /* Load the recurrence-rules in GcalRecurrence struct */
+  self->recurrence = gcal_recurrence_parse_recurrence_rules (component);
 
-      /* Load and setup the alarms */
-      load_alarms (self);
+  /* Load and setup the alarms */
+  load_alarms (self);
 
-      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HAS_RECURRENCE]);
-      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RECURRENCE]);
-      g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPONENT]);
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_HAS_RECURRENCE]);
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_RECURRENCE]);
+  g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COMPONENT]);
 
-      g_clear_pointer (&zone_start, g_time_zone_unref);
-      g_clear_pointer (&zone_end, g_time_zone_unref);
-      g_clear_pointer (&description, g_free);
-      g_clear_pointer (&location, g_free);
+  g_clear_pointer (&description, g_free);
+  g_clear_pointer (&location, g_free);
 
-      e_cal_component_text_free (text);
-      e_cal_component_datetime_free (start);
-      e_cal_component_datetime_free (end);
-    }
+  e_cal_component_text_free (text);
+  e_cal_component_datetime_free (start);
+  e_cal_component_datetime_free (end);
 }
 
 /*
@@ -500,12 +445,6 @@ gcal_event_finalize (GObject *object)
 {
   GcalEvent *self = (GcalEvent *)object;
 
-  g_debug ("Removing '%s' (%p) from cache", self->uid, self);
-
-  G_LOCK (event_cache_lock);
-  g_hash_table_remove (event_cache, self->uid);
-  G_UNLOCK (event_cache_lock);
-
   g_clear_pointer (&self->dt_start, g_date_time_unref);
   g_clear_pointer (&self->dt_end, g_date_time_unref);
   g_clear_pointer (&self->summary, g_free);
@@ -827,48 +766,12 @@ gcal_event_new (GcalCalendar   *calendar,
                 ECalComponent  *component,
                 GError        **error)
 {
-  GcalEvent *event;
-  g_autofree gchar *uuid;
-  gboolean event_cached;
-
-  G_LOCK (main_lock);
-
-  uuid = get_uuid_from_component (gcal_calendar_get_source (calendar), component);
-
-  G_LOCK (event_cache_lock);
-  event_cached = g_hash_table_contains (event_cache, uuid);
-  G_UNLOCK (event_cache_lock);
-
-  if (event_cached)
-    {
-      g_debug ("Using cached value for %s", uuid);
-
-      event = g_hash_table_lookup (event_cache, uuid);
-      gcal_event_set_component_internal (event, component);
-      g_object_ref (event);
-    }
-  else
-    {
-      event = g_initable_new (GCAL_TYPE_EVENT,
-                              NULL,
-                              error,
-                              "calendar", calendar,
-                              "component", component,
-                              NULL);
-
-      if (event)
-        {
-          g_debug ("Adding %s to the cache", event->uid);
-
-          G_LOCK (event_cache_lock);
-          g_hash_table_insert (event_cache, event->uid, event);
-          G_UNLOCK (event_cache_lock);
-        }
-    }
-
-  G_UNLOCK (main_lock);
-
-  return event;
+  return g_initable_new (GCAL_TYPE_EVENT,
+                         NULL,
+                         error,
+                         "calendar", calendar,
+                         "component", component,
+                         NULL);
 }
 
 /**


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]