39b22cafd40740252c8b346ff7b8c70cd37ad40e
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)
23 void shutdown_storage(void)
28 void put_item(struct item
* item
)
30 struct list_entry
* entry
= (void*)item
;
36 entry
->next
= entry
->prev
= entry
;
40 entry
->prev
= root
->prev
;
42 entry
->prev
->next
= entry
;
43 entry
->next
->prev
= entry
;
49 struct item
* get_item(const void* key
, size_t nkey
)
51 struct list_entry
*walker
= root
;
60 if (((struct item
*)walker
)->nkey
== nkey
&&
61 memcmp(((struct item
*)walker
)->key
, key
, nkey
) == 0)
63 return (struct item
*)walker
;
66 } while (walker
!= root
);
71 struct item
* create_item(const void* key
, size_t nkey
, const void* data
,
72 size_t size
, uint32_t flags
, time_t exp
)
74 struct item
* ret
= calloc(1, sizeof(struct list_entry
));
78 ret
->key
= malloc(nkey
);
81 ret
->data
= malloc(size
);
84 if (ret
->key
== NULL
|| (size
> 0 && ret
->data
== NULL
))
92 memcpy(ret
->key
, key
, nkey
);
95 memcpy(ret
->data
, data
, size
);
107 bool delete_item(const void* key
, size_t nkey
)
109 struct item
* item
= get_item(key
, nkey
);
114 /* remove from linked list */
115 struct list_entry
*entry
= (void*)item
;
117 if (entry
->next
== entry
)
119 /* Only one object in the list */
124 /* ensure that we don't loose track of the root, and this will
125 * change the start position for the next search ;-) */
127 entry
->prev
->next
= entry
->next
;
128 entry
->next
->prev
= entry
->prev
;
140 void flush(uint32_t when
)
144 /* remove the complete linked list */
150 root
->prev
->next
= NULL
;
153 struct item
* tmp
= (void*)root
;
162 void update_cas(struct item
* item
)
167 void release_item(struct item
* item
__attribute__((unused
)))