Mercurial > geeqie
view src/filecache.c @ 880:71fc4b084e7e
French translation was updated.
author | zas_ |
---|---|
date | Fri, 04 Jul 2008 22:49:04 +0000 |
parents | bd3bdceb1230 |
children | d8e1e820cee7 |
line wrap: on
line source
/* * 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" /* Set to TRUE to add file cache dumps to the debug output */ const gboolean debug_file_cache = FALSE; /* this implements a simple LRU algorithm */ struct _FileCacheData { FileCacheReleaseFunc release; GList *list; gulong max_size; gulong size; }; typedef struct _FileCacheEntry FileCacheEntry; struct _FileCacheEntry { FileData *fd; 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; } gboolean file_cache_get(FileCacheData *fc, FileData *fd) { GList *work; g_assert(fc && fd); work = fc->list; while (work) { FileCacheEntry *fce = work->data; if (fce->fd == fd) { /* entry exists */ DEBUG_1("cache hit: fc=%p %s", fc, fd->path); if (work == fc->list) return TRUE; /* already at the beginning */ /* move it to the beginning */ DEBUG_1("cache move to front: fc=%p %s", fc, fd->path); fc->list = g_list_remove_link(fc->list, work); fc->list = g_list_concat(work, fc->list); if (debug_file_cache) file_cache_dump(fc); return TRUE; } work = work->next; } DEBUG_1("cache miss: fc=%p %s", fc, fd->path); return FALSE; } void file_cache_set_size(FileCacheData *fc, gulong size) { GList *work; FileCacheEntry *last_fe; if (debug_file_cache) file_cache_dump(fc); work = g_list_last(fc->list); while (fc->size > size && work) { GList *prev; last_fe = work->data; prev = work->prev; fc->list = g_list_delete_link(fc->list, work); work = prev; DEBUG_1("cache remove: fc=%p %s", fc, last_fe->fd->path); fc->size -= last_fe->size; fc->release(last_fe->fd); file_data_unref(last_fe->fd); g_free(last_fe); } } void file_cache_put(FileCacheData *fc, FileData *fd, gulong size) { FileCacheEntry *fe; if (file_cache_get(fc, fd)) return; DEBUG_1("cache add: fc=%p %s", fc, fd->path); fe = g_new(FileCacheEntry, 1); fe->fd = file_data_ref(fd); fe->size = size; fc->list = g_list_prepend(fc->list, fe); fc->size += size; file_cache_set_size(fc, fc->max_size); } gulong file_cache_get_max_size(FileCacheData *fc) { return fc->max_size; } gulong file_cache_get_size(FileCacheData *fc) { return fc->size; } void file_cache_set_max_size(FileCacheData *fc, gulong size) { fc->max_size = size; file_cache_set_size(fc, fc->max_size); } void file_cache_dump(FileCacheData *fc) { GList *work; work = fc->list; guint n = 0; DEBUG_1("cache dump: fc=%p max size:%ld size:%ld", fc, fc->max_size, fc->size); while (work) { FileCacheEntry *fe = work->data; work = work->next; DEBUG_1("cache entry: fc=%p [%lu] %s %ld", fc, ++n, fe->fd->path, fe->size); } }