[gnome-builder] egg-task-cache: perform eviction using GSourceFunc
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] egg-task-cache: perform eviction using GSourceFunc
- Date: Wed, 13 May 2015 00:40:16 +0000 (UTC)
commit 217fd7570ecbb6b0c6a54017e59a9cdbafb4b3ab
Author: Christian Hergert <christian hergert me>
Date: Tue May 12 17:40:10 2015 -0700
egg-task-cache: perform eviction using GSourceFunc
contrib/egg/egg-task-cache.c | 63 +++++++++++++++++++++++++++++++++--------
1 files changed, 50 insertions(+), 13 deletions(-)
---
diff --git a/contrib/egg/egg-task-cache.c b/contrib/egg/egg-task-cache.c
index 09657c1..aac3dce 100644
--- a/contrib/egg/egg-task-cache.c
+++ b/contrib/egg/egg-task-cache.c
@@ -169,9 +169,10 @@ cache_item_new (GObject *item,
return ret;
}
-gboolean
-egg_task_cache_evict (EggTaskCache *self,
- gconstpointer key)
+static gboolean
+egg_task_cache_evict_full (EggTaskCache *self,
+ gconstpointer key,
+ gboolean check_heap)
{
CacheItem *item;
@@ -179,14 +180,17 @@ egg_task_cache_evict (EggTaskCache *self,
if ((item = g_hash_table_lookup (self->cache, key)))
{
- gsize i;
-
- for (i = 0; i < self->evict_heap->len; i++)
+ if (check_heap)
{
- if (item == egg_heap_index (self->evict_heap, gpointer, i))
+ gsize i;
+
+ for (i = 0; i < self->evict_heap->len; i++)
{
- egg_heap_extract_index (self->evict_heap, i, NULL);
- break;
+ if (item == egg_heap_index (self->evict_heap, gpointer, i))
+ {
+ egg_heap_extract_index (self->evict_heap, i, NULL);
+ break;
+ }
}
}
@@ -200,6 +204,13 @@ egg_task_cache_evict (EggTaskCache *self,
return FALSE;
}
+gboolean
+egg_task_cache_evict (EggTaskCache *self,
+ gconstpointer key)
+{
+ return egg_task_cache_evict_full (self, key, TRUE);
+}
+
/**
* egg_task_cache_peek:
* @self: An #EggTaskCache
@@ -418,6 +429,31 @@ egg_task_cache_get_finish (EggTaskCache *self,
return g_task_propagate_pointer (task, error);
}
+static gboolean
+egg_task_cache_do_eviction (gpointer user_data)
+{
+ EggTaskCache *self = user_data;
+ gint64 now = g_get_monotonic_time ();
+
+ while (self->evict_heap->len > 0)
+ {
+ CacheItem *item;
+
+ item = egg_heap_peek (self->evict_heap, gpointer);
+
+ if (item->evict_at < now)
+ {
+ egg_heap_extract (self->evict_heap, NULL);
+ egg_task_cache_evict_full (self, item->item, FALSE);
+ continue;
+ }
+
+ break;
+ }
+
+ return G_SOURCE_CONTINUE;
+}
+
static void
egg_task_cache_constructed (GObject *object)
{
@@ -465,14 +501,15 @@ egg_task_cache_constructed (GObject *object)
*/
if (self->time_to_live_usec > 0)
{
- EvictSource *source;
+ EvictSource *ev;
GMainContext *main_context;
- source = (EvictSource *)g_source_new (&evict_source_funcs, sizeof (EvictSource));
- source->heap = egg_heap_ref (self->evict_heap);
+ ev = (EvictSource *)g_source_new (&evict_source_funcs, sizeof (EvictSource));
+ ev->heap = egg_heap_ref (self->evict_heap);
+ g_source_set_callback ((GSource *)ev, egg_task_cache_do_eviction, self, NULL);
main_context = g_main_context_get_thread_default ();
- self->evict_source = g_source_attach ((GSource *)source, main_context);
+ self->evict_source = g_source_attach ((GSource *)ev, main_context);
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]