1
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
3
* Authors: Jeffrey Stedfast <fejj@ximian.com>
5
* Copyright 2003-2004 Ximian, Inc. (www.ximian.com)
7
* This program is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU General Public License as published by
9
* the Free Software Foundation; either version 2 of the License, or
10
* (at your option) any later version.
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
32
cache_new (CacheNodeExpireFunc expire, CacheNodeFreeFunc free_node, unsigned int node_size, unsigned int max_size)
36
cache = g_new (Cache, 1);
37
list_init (&cache->list);
38
cache->expire = expire;
39
cache->free_node = free_node;
40
cache->node_hash = g_hash_table_new (g_str_hash, g_str_equal);
41
cache->node_chunks = memchunk_new (node_size, max_size, FALSE);
42
cache->max_size = max_size;
50
cache_node_free (CacheNode *node)
56
cache->free_node (node);
58
memchunk_free (cache->node_chunks, node);
63
cache_node_foreach_cb (gpointer key, gpointer value, gpointer user_data)
65
cache_node_free ((CacheNode *) value);
69
cache_free (Cache *cache)
71
g_hash_table_foreach (cache->node_hash, cache_node_foreach_cb, NULL);
72
g_hash_table_destroy (cache->node_hash);
73
memchunk_destroy (cache->node_chunks);
79
cache_expire_unused (Cache *cache)
81
ListNode *node, *prev;
83
node = cache->list.tailpred;
84
while (node->prev && cache->size > cache->max_size) {
86
if (cache->expire (cache, (CacheNode *) node)) {
87
g_hash_table_remove (cache->node_hash, ((CacheNode *) node)->key);
88
list_node_unlink (node);
89
cache_node_free ((CacheNode *) node);
97
cache_node_insert (Cache *cache, const char *key)
103
if (cache->size > cache->max_size)
104
cache_expire_unused (cache);
106
node = memchunk_alloc (cache->node_chunks);
107
node->key = g_strdup (key);
110
g_hash_table_insert (cache->node_hash, node->key, node);
111
list_prepend_node (&cache->list, (ListNode *) node);
117
cache_node_lookup (Cache *cache, const char *key, gboolean use)
121
node = g_hash_table_lookup (cache->node_hash, key);
123
list_node_unlink ((ListNode *) node);
124
list_prepend_node (&cache->list, (ListNode *) node);
131
cache_node_expire (CacheNode *node)
136
g_hash_table_remove (cache->node_hash, node->key);
137
list_node_unlink ((ListNode *) node);
138
cache_node_free (node);