~vcs-imports/gmime/master

« back to all changes in this revision

Viewing changes to gmime/cache.c

  • Committer: Jeffrey Stedfast
  • Author(s): Jeffrey Stedfast
  • Date: 2004-02-27 01:25:58 UTC
  • Revision ID: git-v1:2ca4d3eaca7cc0ce213eb8d6fe2ccb935872a007
Moved here from gmime/

2004-02-26  Jeffrey Stedfast  <fejj@ximian.com>

        * util/*.[c,h]: Moved here from gmime/

        * gmime/*.h: Fixed #includes

        * gmime/cache.[c,h]: Moved to util/

        * gmime/gtrie.[c,h]: Moved to util/

        * gmime/list.[c,h]: Moved to util/

        * gmime/md5-utils.[c,h]: Moved to util/

        * gmime/memchunk.[c,h]: Moved to util/

        * gmime/url-scanner.[c,h]: Moved to util/

        * gmime/gmime-parser.c: Don't use gobject macro casts.

        * gmime/gmime-filter-md5.c: Move the MD5Context into a private
        structure so that we don't need to install md5-utils.h

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
 
/*
3
 
 *  Authors: Jeffrey Stedfast <fejj@ximian.com>
4
 
 *
5
 
 *  Copyright 2003-2004 Ximian, Inc. (www.ximian.com)
6
 
 *
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.
11
 
 *
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.
16
 
 *
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.
20
 
 *
21
 
 */
22
 
 
23
 
 
24
 
#ifdef HAVE_CONFIG_H
25
 
#include <config.h>
26
 
#endif
27
 
 
28
 
#include "cache.h"
29
 
 
30
 
 
31
 
Cache *
32
 
cache_new (CacheNodeExpireFunc expire, CacheNodeFreeFunc free_node, unsigned int node_size, unsigned int max_size)
33
 
{
34
 
        Cache *cache;
35
 
        
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;
43
 
        cache->size = 0;
44
 
        
45
 
        return cache;
46
 
}
47
 
 
48
 
 
49
 
static void
50
 
cache_node_free (CacheNode *node)
51
 
{
52
 
        Cache *cache;
53
 
        
54
 
        cache = node->cache;
55
 
        
56
 
        cache->free_node (node);
57
 
        g_free (node->key);
58
 
        memchunk_free (cache->node_chunks, node);
59
 
}
60
 
 
61
 
 
62
 
static void
63
 
cache_node_foreach_cb (gpointer key, gpointer value, gpointer user_data)
64
 
{
65
 
        cache_node_free ((CacheNode *) value);
66
 
}
67
 
 
68
 
void
69
 
cache_free (Cache *cache)
70
 
{
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);
74
 
        g_free (cache);
75
 
}
76
 
 
77
 
 
78
 
void
79
 
cache_expire_unused (Cache *cache)
80
 
{
81
 
        ListNode *node, *prev;
82
 
        
83
 
        node = cache->list.tailpred;
84
 
        while (node->prev && cache->size > cache->max_size) {
85
 
                prev = node->prev;
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);
90
 
                        cache->size--;
91
 
                }
92
 
                node = prev;
93
 
        }
94
 
}
95
 
 
96
 
CacheNode *
97
 
cache_node_insert (Cache *cache, const char *key)
98
 
{
99
 
        CacheNode *node;
100
 
        
101
 
        cache->size++;
102
 
        
103
 
        if (cache->size > cache->max_size)
104
 
                cache_expire_unused (cache);
105
 
        
106
 
        node = memchunk_alloc (cache->node_chunks);
107
 
        node->key = g_strdup (key);
108
 
        node->cache = cache;
109
 
        
110
 
        g_hash_table_insert (cache->node_hash, node->key, node);
111
 
        list_prepend_node (&cache->list, (ListNode *) node);
112
 
        
113
 
        return node;
114
 
}
115
 
 
116
 
CacheNode *
117
 
cache_node_lookup (Cache *cache, const char *key, gboolean use)
118
 
{
119
 
        CacheNode *node;
120
 
        
121
 
        node = g_hash_table_lookup (cache->node_hash, key);
122
 
        if (node && use) {
123
 
                list_node_unlink ((ListNode *) node);
124
 
                list_prepend_node (&cache->list, (ListNode *) node);
125
 
        }
126
 
        
127
 
        return node;
128
 
}
129
 
 
130
 
void
131
 
cache_node_expire (CacheNode *node)
132
 
{
133
 
        Cache *cache;
134
 
        
135
 
        cache = node->cache;
136
 
        g_hash_table_remove (cache->node_hash, node->key);
137
 
        list_node_unlink ((ListNode *) node);
138
 
        cache_node_free (node);
139
 
        cache->size--;
140
 
}