event: Protect event cache with a lock
We'll be creating events from multiple threads soon, so make sure the event cache is protected enough.
This commit is contained in:
+22
-1
@@ -139,6 +139,9 @@ static GParamSpec* properties[N_PROPS] = { NULL, };
|
|||||||
* GcalEvent cache
|
* GcalEvent cache
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
G_LOCK_DEFINE (main_lock);
|
||||||
|
G_LOCK_DEFINE (event_cache_lock);
|
||||||
|
|
||||||
static GHashTable *event_cache = NULL;
|
static GHashTable *event_cache = NULL;
|
||||||
|
|
||||||
G_DEFINE_CONSTRUCTOR (init_event_cache_map);
|
G_DEFINE_CONSTRUCTOR (init_event_cache_map);
|
||||||
@@ -272,6 +275,8 @@ gcal_event_update_uid_internal (GcalEvent *self)
|
|||||||
|
|
||||||
should_update_cache = self->uid != NULL;
|
should_update_cache = self->uid != NULL;
|
||||||
|
|
||||||
|
G_LOCK (event_cache_lock);
|
||||||
|
|
||||||
if (should_update_cache)
|
if (should_update_cache)
|
||||||
{
|
{
|
||||||
g_debug ("Removing '%s' (%p) from cache", self->uid, self);
|
g_debug ("Removing '%s' (%p) from cache", self->uid, self);
|
||||||
@@ -299,6 +304,8 @@ gcal_event_update_uid_internal (GcalEvent *self)
|
|||||||
g_hash_table_insert (event_cache, self->uid, self);
|
g_hash_table_insert (event_cache, self->uid, self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
G_UNLOCK (event_cache_lock);
|
||||||
|
|
||||||
e_cal_component_id_free (id);
|
e_cal_component_id_free (id);
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UID]);
|
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_UID]);
|
||||||
}
|
}
|
||||||
@@ -495,7 +502,9 @@ gcal_event_finalize (GObject *object)
|
|||||||
|
|
||||||
g_debug ("Removing '%s' (%p) from cache", self->uid, self);
|
g_debug ("Removing '%s' (%p) from cache", self->uid, self);
|
||||||
|
|
||||||
|
G_LOCK (event_cache_lock);
|
||||||
g_hash_table_remove (event_cache, self->uid);
|
g_hash_table_remove (event_cache, self->uid);
|
||||||
|
G_UNLOCK (event_cache_lock);
|
||||||
|
|
||||||
g_clear_pointer (&self->dt_start, g_date_time_unref);
|
g_clear_pointer (&self->dt_start, g_date_time_unref);
|
||||||
g_clear_pointer (&self->dt_end, g_date_time_unref);
|
g_clear_pointer (&self->dt_end, g_date_time_unref);
|
||||||
@@ -820,10 +829,17 @@ gcal_event_new (GcalCalendar *calendar,
|
|||||||
{
|
{
|
||||||
GcalEvent *event;
|
GcalEvent *event;
|
||||||
g_autofree gchar *uuid;
|
g_autofree gchar *uuid;
|
||||||
|
gboolean event_cached;
|
||||||
|
|
||||||
|
G_LOCK (main_lock);
|
||||||
|
|
||||||
uuid = get_uuid_from_component (gcal_calendar_get_source (calendar), component);
|
uuid = get_uuid_from_component (gcal_calendar_get_source (calendar), component);
|
||||||
|
|
||||||
if (g_hash_table_contains (event_cache, uuid))
|
G_LOCK (event_cache_lock);
|
||||||
|
event_cached = g_hash_table_contains (event_cache, uuid);
|
||||||
|
G_UNLOCK (event_cache_lock);
|
||||||
|
|
||||||
|
if (event_cached)
|
||||||
{
|
{
|
||||||
g_debug ("Using cached value for %s", uuid);
|
g_debug ("Using cached value for %s", uuid);
|
||||||
|
|
||||||
@@ -843,10 +859,15 @@ gcal_event_new (GcalCalendar *calendar,
|
|||||||
if (event)
|
if (event)
|
||||||
{
|
{
|
||||||
g_debug ("Adding %s to the cache", event->uid);
|
g_debug ("Adding %s to the cache", event->uid);
|
||||||
|
|
||||||
|
G_LOCK (event_cache_lock);
|
||||||
g_hash_table_insert (event_cache, event->uid, event);
|
g_hash_table_insert (event_cache, event->uid, event);
|
||||||
|
G_UNLOCK (event_cache_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
G_UNLOCK (main_lock);
|
||||||
|
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user