[gnome-calendar/gnome-3-36] timeline: Add sentinel events to the queue



commit 9272af8c538b7c1ec98b2ad3cde0968738712e75
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Thu Apr 16 16:10:33 2020 -0300

    timeline: Add sentinel events to the queue
    
    Moving to have one subscriber per event made us face an interesting
    problem: when removing an event, there may be no subscribers that
    contain this event, in which case we never queue any REMOVE_EVENT
    and the range tree isn't updated.
    
    Add sentinel events (that update the range tree) and subscriber events
    (that update subscribers, but not the range tree).

 src/core/gcal-timeline.c | 134 +++++++++++++++++++++++++----------------------
 1 file changed, 72 insertions(+), 62 deletions(-)
---
diff --git a/src/core/gcal-timeline.c b/src/core/gcal-timeline.c
index bacc2fa6..228575f5 100644
--- a/src/core/gcal-timeline.c
+++ b/src/core/gcal-timeline.c
@@ -132,53 +132,59 @@ queue_event_data (GcalTimeline           *self,
   queue_data = g_new0 (QueueData, 1);
   queue_data->timeline = self;
   queue_data->queue_event = queue_event;
-  queue_data->subscriber = g_object_ref (subscriber);
+  queue_data->subscriber = subscriber ? g_object_ref (subscriber) : NULL;
   queue_data->event = event ? g_object_ref (event) : NULL;
   queue_data->old_event = old_event ? g_object_ref (old_event) : NULL;
   queue_data->update_range_tree = update_range_tree;
 
-  subscriber_event_id = format_subscriber_event_id (subscriber, event);
-
-  switch (queue_event)
+  if (subscriber)
     {
-    case ADD_EVENT:
-    case UPDATE_EVENT:
-      break;
-    case REMOVE_EVENT:
-        {
-          GList *queued_add_link;
+      subscriber_event_id = format_subscriber_event_id (subscriber, event);
 
-          queued_add_link = g_hash_table_lookup (self->queued_adds, subscriber_event_id);
-          if (queued_add_link)
+      switch (queue_event)
+        {
+        case ADD_EVENT:
+        case UPDATE_EVENT:
+          break;
+        case REMOVE_EVENT:
             {
-              QueueData *queued_add = queued_add_link->data;
-
-              GCAL_TRACE_MSG ("Removing ADD_EVENT for event '%s' (%s) from event queue",
-                              gcal_event_get_summary (event),
-                              subscriber_event_id);
-
-              g_hash_table_remove (self->queued_adds, subscriber_event_id);
-              g_queue_delete_link (self->event_queue, queued_add_link);
-              queue_data_free (queued_add);
-              return;
+              GList *queued_add_link;
+
+              queued_add_link = g_hash_table_lookup (self->queued_adds, subscriber_event_id);
+              if (queued_add_link)
+                {
+                  QueueData *queued_add = queued_add_link->data;
+
+                  GCAL_TRACE_MSG ("Removing ADD_EVENT for event '%s' (%s) from event queue",
+                                  gcal_event_get_summary (event),
+                                  subscriber_event_id);
+
+                  g_hash_table_remove (self->queued_adds, subscriber_event_id);
+                  g_queue_delete_link (self->event_queue, queued_add_link);
+                  queue_data_free (queued_add);
+                  return;
+                }
             }
+          break;
         }
-      break;
     }
 
   g_queue_push_tail (self->event_queue, queue_data);
 
-  switch (queue_event)
+  if (subscriber)
     {
-    case ADD_EVENT:
-      g_hash_table_insert (self->queued_adds,
-                           g_steal_pointer (&subscriber_event_id),
-                           g_queue_peek_tail_link (self->event_queue));
-      break;
+      switch (queue_event)
+        {
+        case ADD_EVENT:
+          g_hash_table_insert (self->queued_adds,
+                               g_steal_pointer (&subscriber_event_id),
+                               g_queue_peek_tail_link (self->event_queue));
+          break;
 
-    case UPDATE_EVENT:
-    case REMOVE_EVENT:
-      break;
+        case UPDATE_EVENT:
+        case REMOVE_EVENT:
+          break;
+        }
     }
 }
 
@@ -513,15 +519,13 @@ on_calendar_monitor_event_added_cb (GcalCalendarMonitor *monitor,
   /* Add to all subscribers within the event range */
   subscribers_at_range = gcal_range_tree_get_data_at_range (self->subscriber_ranges, event_range);
 
+  queue_event_data (self, ADD_EVENT, NULL, event, NULL, TRUE);
+
   for (i = 0; subscribers_at_range && i < subscribers_at_range->len; i++)
     {
-      GcalTimelineSubscriber *subscriber;
-      gboolean update_ranges;
-
-      subscriber = g_ptr_array_index (subscribers_at_range, i);
-      update_ranges = i == 0;
+      GcalTimelineSubscriber *subscriber = g_ptr_array_index (subscribers_at_range, i);
 
-      queue_event_data (self, ADD_EVENT, subscriber, event, NULL, update_ranges);
+      queue_event_data (self, ADD_EVENT, subscriber, event, NULL, FALSE);
     }
 
   GCAL_EXIT;
@@ -545,15 +549,13 @@ on_calendar_monitor_event_updated_cb (GcalCalendarMonitor *monitor,
   /* Add to all subscribers within the event range */
   subscribers_at_range = gcal_range_tree_get_data_at_range (self->subscriber_ranges, event_range);
 
+  queue_event_data (self, UPDATE_EVENT, NULL, event, old_event, TRUE);
+
   for (i = 0; subscribers_at_range && i < subscribers_at_range->len; i++)
     {
-      GcalTimelineSubscriber *subscriber;
-      gboolean update_ranges;
+      GcalTimelineSubscriber *subscriber = g_ptr_array_index (subscribers_at_range, i);
 
-      subscriber = g_ptr_array_index (subscribers_at_range, i);
-      update_ranges = i == 0;
-
-      queue_event_data (self, UPDATE_EVENT, subscriber, event, old_event, update_ranges);
+      queue_event_data (self, UPDATE_EVENT, subscriber, event, old_event, FALSE);
     }
 
   GCAL_EXIT;
@@ -577,15 +579,13 @@ on_calendar_monitor_event_removed_cb (GcalCalendarMonitor *monitor,
 
   for (i = 0; subscribers_at_range && i < subscribers_at_range->len; i++)
     {
-      GcalTimelineSubscriber *subscriber;
-      gboolean update_ranges;
+      GcalTimelineSubscriber *subscriber = g_ptr_array_index (subscribers_at_range, i);
 
-      subscriber = g_ptr_array_index (subscribers_at_range, i);
-      update_ranges = i == 0;
-
-      queue_event_data (self, REMOVE_EVENT, subscriber, event, NULL, update_ranges);
+      queue_event_data (self, REMOVE_EVENT, subscriber, event, NULL, FALSE);
     }
 
+  queue_event_data (self, REMOVE_EVENT, NULL, event, NULL, TRUE);
+
   GCAL_EXIT;
 }
 
@@ -669,10 +669,12 @@ timeline_source_dispatch (GSource     *source,
       event = queue_data->event;
       subscriber = queue_data->subscriber;
       event_range = gcal_event_get_range (event);
-      subscriber_event_id = format_subscriber_event_id (subscriber, event);
+
+      if (subscriber)
+        subscriber_event_id = format_subscriber_event_id (subscriber, event);
 
       /* The subscriber may have been removed already */
-      if (!g_hash_table_contains (self->subscribers, subscriber))
+      if (subscriber && !g_hash_table_contains (self->subscribers, subscriber))
         {
           g_hash_table_remove (self->queued_adds, subscriber_event_id);
           queue_data_free (queue_data);
@@ -682,23 +684,28 @@ timeline_source_dispatch (GSource     *source,
       switch (queue_data->queue_event)
         {
         case ADD_EVENT:
-          GCAL_TRACE_MSG ("Processing ADD_EVENT for event '%s' (%s) (in queued_adds: %d)",
+          GCAL_TRACE_MSG ("Processing ADD_EVENT for event '%s' (%s) (in queued_adds: %d, update range tree: 
%d)",
                           gcal_event_get_summary (event),
                           gcal_event_get_uid (event),
-                          g_hash_table_contains (self->queued_adds, subscriber_event_id));
+                          subscriber_event_id && g_hash_table_contains (self->queued_adds, 
subscriber_event_id),
+                          queue_data->update_range_tree);
 
-          g_hash_table_remove (self->queued_adds, subscriber_event_id);
           if (queue_data->update_range_tree)
             gcal_range_tree_add_range (self->events, event_range, g_object_ref (event));
 
-          add_event_to_subscriber (subscriber, event);
+          if (subscriber)
+            {
+              add_event_to_subscriber (subscriber, event);
+              g_hash_table_remove (self->queued_adds, subscriber_event_id);
+            }
           break;
 
         case UPDATE_EVENT:
           {
-            GCAL_TRACE_MSG ("Processing UPDATE_EVENT for event '%s' (%s)",
+            GCAL_TRACE_MSG ("Processing UPDATE_EVENT for event '%s' (%s) (update range tree: %d)",
                             gcal_event_get_summary (event),
-                            gcal_event_get_uid (event));
+                            gcal_event_get_uid (event),
+                            queue_data->update_range_tree);
 
             if (queue_data->update_range_tree)
               {
@@ -711,16 +718,19 @@ timeline_source_dispatch (GSource     *source,
                 gcal_range_tree_add_range (self->events, event_range, g_object_ref (event));
               }
 
-            update_subscriber_event (subscriber, event);
+            if (subscriber)
+              update_subscriber_event (subscriber, event);
           }
           break;
 
         case REMOVE_EVENT:
-          GCAL_TRACE_MSG ("Processing REMOVE_EVENT for event '%s' (%s)",
+          GCAL_TRACE_MSG ("Processing REMOVE_EVENT for event '%s' (%s) (update range tree: %d)",
                           gcal_event_get_summary (event),
-                          gcal_event_get_uid (event));
+                          gcal_event_get_uid (event),
+                          queue_data->update_range_tree);
 
-          remove_event_from_subscriber (subscriber, event);
+          if (subscriber)
+            remove_event_from_subscriber (subscriber, event);
 
           if (queue_data->update_range_tree)
             gcal_range_tree_remove_range (self->events, event_range, event);


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