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.
This commit is contained in:
+70
-59
@@ -32,6 +32,8 @@
|
|||||||
|
|
||||||
#include <libedataserver/libedataserver.h>
|
#include <libedataserver/libedataserver.h>
|
||||||
|
|
||||||
|
#define BATCH_SIZE 5
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
ADD_EVENT,
|
ADD_EVENT,
|
||||||
@@ -581,87 +583,96 @@ timeline_source_dispatch (GSource *source,
|
|||||||
{
|
{
|
||||||
TimelineSource *timeline_source;
|
TimelineSource *timeline_source;
|
||||||
GcalTimeline *self;
|
GcalTimeline *self;
|
||||||
GcalRange *event_range;
|
gint processed_events;
|
||||||
QueueData *queue_data;
|
|
||||||
GcalEvent *event;
|
|
||||||
gint i;
|
|
||||||
|
|
||||||
GCAL_ENTRY;
|
GCAL_ENTRY;
|
||||||
|
|
||||||
|
processed_events = 0;
|
||||||
timeline_source = (TimelineSource*) source;
|
timeline_source = (TimelineSource*) source;
|
||||||
self = timeline_source->timeline;
|
self = timeline_source->timeline;
|
||||||
queue_data = g_queue_pop_head (self->event_queue);
|
|
||||||
|
|
||||||
event = queue_data->event;
|
while (processed_events < BATCH_SIZE && !g_queue_is_empty (self->event_queue))
|
||||||
event_range = gcal_event_get_range (event);
|
|
||||||
|
|
||||||
switch (queue_data->queue_event)
|
|
||||||
{
|
{
|
||||||
case ADD_EVENT:
|
GcalRange *event_range;
|
||||||
GCAL_TRACE_MSG ("Processing ADD_EVENT for event '%s' (%s)",
|
QueueData *queue_data;
|
||||||
gcal_event_get_summary (event),
|
GcalEvent *event;
|
||||||
gcal_event_get_uid (event));
|
gint i;
|
||||||
|
|
||||||
if (queue_data->update_range_tree)
|
queue_data = g_queue_pop_head (self->event_queue);
|
||||||
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++)
|
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))
|
if (queue_data->update_range_tree)
|
||||||
continue;
|
|
||||||
|
|
||||||
add_event_to_subscriber (subscriber, event);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UPDATE_EVENT:
|
|
||||||
{
|
|
||||||
GCAL_TRACE_MSG ("Processing UPDATE_EVENT for event '%s' (%s)",
|
|
||||||
gcal_event_get_summary (event),
|
|
||||||
gcal_event_get_uid (event));
|
|
||||||
|
|
||||||
if (queue_data->update_range_tree)
|
|
||||||
{
|
|
||||||
GcalRange *old_event_range;
|
|
||||||
|
|
||||||
/* Remove the old event */
|
|
||||||
old_event_range = gcal_event_get_range (queue_data->old_event);
|
|
||||||
|
|
||||||
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));
|
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++)
|
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;
|
||||||
|
|
||||||
|
add_event_to_subscriber (subscriber, event);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case UPDATE_EVENT:
|
||||||
{
|
{
|
||||||
GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
|
GCAL_TRACE_MSG ("Processing UPDATE_EVENT for event '%s' (%s)",
|
||||||
|
gcal_event_get_summary (event),
|
||||||
|
gcal_event_get_uid (event));
|
||||||
|
|
||||||
if (!subscriber_contains_event (subscriber, event))
|
if (queue_data->update_range_tree)
|
||||||
continue;
|
{
|
||||||
|
GcalRange *old_event_range;
|
||||||
|
|
||||||
update_subscriber_event (subscriber, event);
|
/* Remove the old event */
|
||||||
|
old_event_range = gcal_event_get_range (queue_data->old_event);
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
update_subscriber_event (subscriber, event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case REMOVE_EVENT:
|
case REMOVE_EVENT:
|
||||||
GCAL_TRACE_MSG ("Processing REMOVE_EVENT for event '%s' (%s)",
|
GCAL_TRACE_MSG ("Processing REMOVE_EVENT for event '%s' (%s)",
|
||||||
gcal_event_get_summary (event),
|
gcal_event_get_summary (event),
|
||||||
gcal_event_get_uid (event));
|
gcal_event_get_uid (event));
|
||||||
|
|
||||||
for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
|
for (i = 0; queue_data->subscribers && i < queue_data->subscribers->len; i++)
|
||||||
{
|
{
|
||||||
GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
|
GcalTimelineSubscriber *subscriber = g_ptr_array_index (queue_data->subscribers, i);
|
||||||
remove_event_from_subscriber (subscriber, event);
|
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)
|
queue_data_free (queue_data);
|
||||||
gcal_range_tree_remove_range (self->events, event_range, event);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
queue_data_free (queue_data);
|
processed_events++;
|
||||||
|
}
|
||||||
|
|
||||||
GCAL_RETURN (G_SOURCE_CONTINUE);
|
GCAL_RETURN (G_SOURCE_CONTINUE);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user