Project

General

Profile

Statistics
| Branch: | Revision:

root / mainbox / cache.c @ cc7646f9

History | View | Annotate | Download (1.53 KB)

1
#include "cache.h"
2
#include "log.h"
3
#include <stdlib.h>
4

    
5
struct entry_t {
6
  unsigned int key;
7
  unsigned int value;
8
  time_t retrieved;
9
  struct entry_t *next;
10
};
11

    
12
struct entry_t *cache[CACHE_SIZE];
13

    
14
void cache_foreach(cache_func f) {
15
  struct entry_t *entry;
16
  int i;
17

    
18
  for (i = 0; i < CACHE_SIZE; i++) {
19
    for (entry = cache[i]; entry; entry = entry->next)
20
      f(entry->key);
21
  }
22
}
23

    
24
void cache_clear() {
25
  struct entry_t *entry, *next;
26
  int i;
27

    
28
  for (i = 0; i < CACHE_SIZE; i++) {
29
    for (entry = cache[i]; entry; entry = next) {
30
      next = entry->next;
31
      free(entry);
32
    }
33
    cache[i] = NULL;
34
  }
35
}
36

    
37
struct entry_t *cache_find(unsigned int key) {
38
  struct entry_t *entry;
39

    
40
  for (entry = cache[key % CACHE_SIZE]; entry; entry = entry->next) {
41
    if (entry->key == key)
42
      return entry;
43
  }
44

    
45
  return NULL;
46
}
47

    
48
void cache_add(unsigned int key, unsigned int value) {
49
  struct entry_t *entry;
50
  int i;
51

    
52
  entry = malloc(sizeof(struct entry_t));
53
  if (!entry) {
54
    log_print("ERROR: Out of memory; clearing cache");
55
    cache_clear();
56
    return;
57
  }
58

    
59
  i = key % CACHE_SIZE;
60
  entry->key = key;
61
  entry->value = value;
62
  entry->next = cache[i];
63
  cache[i] = entry;
64
}
65

    
66
int cache_lookup(unsigned int key, unsigned int *value) {
67
  struct entry_t *entry;
68
  
69
  entry = cache_find(key);
70
  if (entry) {
71
    *value = entry->value;
72
    return 1;
73
  } else
74
    return 0;
75
}
76

    
77
void cache_update(unsigned int key, unsigned int value) {
78
  struct entry_t *entry;
79

    
80
  entry = cache_find(key);
81
  if (entry)
82
    entry->value = value;
83
  else
84
    cache_add(key, value);
85
}