[gnome-calendar/gbsneto/range: 12/12] timeline: Process events in batches



commit 4dcd11c587571042330123060edf13bb03e7bb2f
Author: Georges Basile Stavracas Neto <georges stavracas gmail com>
Date:   Mon Apr 13 20:43:55 2020 -0300

    timeline: Process events in batches
    
    A batch size of 5 doesn't seem to impact the mainloop
    any more than a batch of size 1, but it reduces the
    amount of time spinning the loop quite considerably.

 src/core/gcal-timeline.c | 121 ++++++++++++++++++++++++++---------------------
 1 file changed, 66 insertions(+), 55 deletions(-)
---
diff --git a/src/core/gcal-timeline.c b/src/core/gcal-timeline.c
index f26439bb..fcdff93a 100644
--- a/src/core/gcal-timeline.c
+++ b/src/core/gcal-timeline.c
@@ -32,6 +32,8 @@
 
 #include <libedataserver/libedataserver.h>
 
+#define BATCH_SIZE 5
+
 typedef enum
 {
   ADD_EVENT,
@@ -580,87 +582,96 @@ timeline_source_dispatch (GSource     *source,
 {
   TimelineSource *timeline_source;
   GcalTimeline *self;
-  GcalRange *event_range;
-  QueueData *queue_data;
-  GcalEvent *event;
-  gint i;
+  gint processed_events;
 
   GCAL_ENTRY;
 
+  processed_events = 0;
   timeline_source = (TimelineSource*) source;
   self = timeline_source->timeline;
-  queue_data = g_queue_pop_head (self->event_queue);
 
-  event = queue_data->event;
-  event_range = gcal_event_get_range (event);
-
-  switch (queue_data->queue_event)
+  while (processed_events < BATCH_SIZE && !g_queue_is_empty (self->event_queue))
     {
-    case ADD_EVENT:
-      GCAL_TRACE_MSG ("Processing ADD_EVENT for event '%s' (%s)",
-                      gcal_event_get_summary (event),
-                      gcal_event_get_uid (event));
+      GcalRange *event_range;
+      QueueData *queue_data;
+      GcalEvent *event;
+      gint i;
 
-      if (queue_data->update_range_tree)
-        gcal_range_tree_add_range (self->events, event_range, g_object_ref (event));
+      queue_data = g_queue_pop_head (self->event_queue);
 
-      for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
+      event = queue_data->event;
+      event_range = gcal_event_get_range (event);
+
+      switch (queue_data->queue_event)
         {
-          GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
+        case ADD_EVENT:
+          GCAL_TRACE_MSG ("Processing ADD_EVENT for event '%s' (%s)",
+                          gcal_event_get_summary (event),
+                          gcal_event_get_uid (event));
 
-          if (!subscriber_contains_event (subscriber, event))
-            continue;
+          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);
-        }
-      break;
+          for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
+            {
+              GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
+
+              if (!subscriber_contains_event (subscriber, event))
+                continue;
 
-    case UPDATE_EVENT:
-      {
-        GCAL_TRACE_MSG ("Processing UPDATE_EVENT for event '%s' (%s)",
-                        gcal_event_get_summary (event),
-                        gcal_event_get_uid (event));
+              add_event_to_subscriber (subscriber, event);
+            }
+          break;
 
-        if (queue_data->update_range_tree)
+        case UPDATE_EVENT:
           {
-            GcalRange *old_event_range;
+            GCAL_TRACE_MSG ("Processing UPDATE_EVENT for event '%s' (%s)",
+                            gcal_event_get_summary (event),
+                            gcal_event_get_uid (event));
 
-            /* Remove the old event */
-            old_event_range = gcal_event_get_range (queue_data->old_event);
+            if (queue_data->update_range_tree)
+              {
+                GcalRange *old_event_range;
 
-            gcal_range_tree_remove_range (self->events, old_event_range, queue_data->old_event);
-            gcal_range_tree_add_range (self->events, event_range, g_object_ref (event));
-          }
+                /* Remove the old event */
+                old_event_range = gcal_event_get_range (queue_data->old_event);
 
-        for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
-          {
-            GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
+                gcal_range_tree_remove_range (self->events, old_event_range, queue_data->old_event);
+                gcal_range_tree_add_range (self->events, event_range, g_object_ref (event));
+              }
+
+            for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
+              {
+                GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
 
-            if (!subscriber_contains_event (subscriber, event))
-              continue;
+                if (!subscriber_contains_event (subscriber, event))
+                  continue;
 
-            update_subscriber_event (subscriber, event);
+                update_subscriber_event (subscriber, event);
+              }
           }
-      }
-      break;
+          break;
 
-    case REMOVE_EVENT:
-      GCAL_TRACE_MSG ("Processing REMOVE_EVENT for event '%s' (%s)",
-                      gcal_event_get_summary (event),
-                      gcal_event_get_uid (event));
+        case REMOVE_EVENT:
+          GCAL_TRACE_MSG ("Processing REMOVE_EVENT for event '%s' (%s)",
+                          gcal_event_get_summary (event),
+                          gcal_event_get_uid (event));
 
-      for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
-        {
-          GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
-          remove_event_from_subscriber (subscriber, event);
+          for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
+            {
+              GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
+              remove_event_from_subscriber (subscriber, event);
+            }
+
+          if (queue_data->update_range_tree)
+            gcal_range_tree_remove_range (self->events, event_range, event);
+          break;
         }
 
-      if (queue_data->update_range_tree)
-        gcal_range_tree_remove_range (self->events, event_range, event);
-      break;
-    }
+      queue_data_free (queue_data);
 
-  queue_data_free (queue_data);
+      processed_events++;
+    }
 
   GCAL_RETURN (G_SOURCE_CONTINUE);
 }


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