72439361bde166d990819f130016382e254f3d2c
1 /* -*- Mode: C; tab-width: 2; c-basic-offset: 2; indent-tabs-mode: nil -*- */
11 struct list_entry
*next
;
12 struct list_entry
*prev
;
15 static struct list_entry
*root
;
18 bool initialize_storage(void) {
22 void shutdown_storage(void) {
26 void put_item(struct item
* item
) {
27 struct list_entry
* entry
= (void*)item
;
32 entry
->next
= entry
->prev
= entry
;
36 entry
->prev
= root
->prev
;
38 entry
->prev
->next
= entry
;
39 entry
->next
->prev
= entry
;
45 struct item
* get_item(const void* key
, size_t nkey
) {
46 struct list_entry
*walker
= root
;
54 if (((struct item
*)walker
)->nkey
== nkey
&&
55 memcmp(((struct item
*)walker
)->key
, key
, nkey
) == 0)
57 return (struct item
*)walker
;
60 } while (walker
!= root
);
65 struct item
* create_item(const void* key
, size_t nkey
, const void* data
,
66 size_t size
, uint32_t flags
, time_t exp
)
68 struct item
* ret
= calloc(1, sizeof(struct list_entry
));
71 ret
->key
= malloc(nkey
);
74 ret
->data
= malloc(size
);
77 if (ret
->key
== NULL
|| (size
> 0 && ret
->data
== NULL
))
85 memcpy(ret
->key
, key
, nkey
);
88 memcpy(ret
->data
, data
, size
);
100 bool delete_item(const void* key
, size_t nkey
) {
101 struct item
* item
= get_item(key
, nkey
);
106 /* remove from linked list */
107 struct list_entry
*entry
= (void*)item
;
109 if (entry
->next
== entry
)
111 /* Only one object in the list */
116 /* ensure that we don't loose track of the root, and this will
117 * change the start position for the next search ;-) */
119 entry
->prev
->next
= entry
->next
;
120 entry
->next
->prev
= entry
->prev
;
132 void flush(uint32_t when
) {
135 /* remove the complete linked list */
141 root
->prev
->next
= NULL
;
144 struct item
* tmp
= (void*)root
;
153 void update_cas(struct item
* item
) {
157 void release_item(struct item
* item
__attribute__((unused
))) {