diff src/filecache.c @ 844:efed9a1520d6

implemented generic FileData cache use it for caching decoded exif data
author nadvornik
date Wed, 18 Jun 2008 22:26:52 +0000
parents
children 8911a4f0e56c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/filecache.c	Wed Jun 18 22:26:52 2008 +0000
@@ -0,0 +1,76 @@
+/*
+ * Geeqie
+ * Copyright (C) 2008 The Geeqie Team
+ *
+ * Author: Vladimir Nadvornik
+ *
+ * This software is released under the GNU General Public License (GNU GPL).
+ * Please read the included file COPYING for more information.
+ * This software comes with no warranty of any kind, use at your own risk!
+ */
+
+
+#include "main.h"
+#include "filecache.h"
+
+/* this implements a simple LRU algorithm */
+
+struct _FileCacheData {
+	FileCacheReleaseFunc release;
+	GList *list;
+	gulong max_size;
+	gulong size;
+	};
+
+
+FileCacheData *file_cache_new(FileCacheReleaseFunc release, gulong max_size)
+{
+	FileCacheData *fc = g_new(FileCacheData, 1);
+	fc->release = release;
+	fc->list = NULL;
+	fc->max_size = max_size;
+	fc->size = 0;
+	return fc;
+}
+
+gint file_cache_get(FileCacheData *fc, FileData *fd)
+{
+	GList *work;
+	if ((work = g_list_find(fc->list, fd)))
+		{
+		fc->list = g_list_remove_link(fc->list, work);
+		fc->list = g_list_concat(work, fc->list);
+		DEBUG_1("cache hit: %s", fd->path);
+		return TRUE;
+		}
+	DEBUG_1("cache miss: %s", fd->path);
+	return FALSE;
+}
+
+void file_cache_put(FileCacheData *fc, FileData *fd, gulong size)
+{
+	GList *work;
+	FileData *last_fd;
+	if ((work = g_list_find(fc->list, fd)))
+		{ 
+		/* entry already exists, move it to the beginning */
+		fc->list = g_list_remove_link(fc->list, work);
+		fc->list = g_list_concat(work, fc->list);
+		return;
+		}
+	
+	DEBUG_1("cache add: %s", fd->path);
+	file_data_ref(fd);
+	fc->list = g_list_prepend(fc->list, fd);
+	fc->size++; /* FIXME: use size */
+	
+	if (fc->size < fc->max_size) return;
+	
+	fc->size--;
+	work = g_list_last(fc->list);
+	last_fd = work->data;
+	fc->list = g_list_delete_link(fc->list, work);
+	DEBUG_1("cache remove: %s", last_fd->path);
+	fc->release(last_fd);
+	file_data_unref(last_fd);
+}