[gnome-calendar/gbsneto/range: 11/12] timeline: Process events in batches
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/gbsneto/range: 11/12] timeline: Process events in batches
- Date: Tue, 14 Apr 2020 18:40:25 +0000 (UTC)
commit c64fbdc59308ecf48c9d949234f9de173bdd9b7a
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 5038538b..0501e839 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,
@@ -581,87 +583,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]