[gnome-calendar/gnome-3-36] timeline: Add sentinel events to the queue
- From: Georges Basile Stavracas Neto <gbsneto src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-calendar/gnome-3-36] timeline: Add sentinel events to the queue
- Date: Thu, 16 Apr 2020 19:57:57 +0000 (UTC)
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]