aboutsummaryrefslogtreecommitdiffstats
path: root/hicn-light/src/hicn/core/content_store.h
diff options
context:
space:
mode:
Diffstat (limited to 'hicn-light/src/hicn/core/content_store.h')
-rw-r--r--hicn-light/src/hicn/core/content_store.h125
1 files changed, 125 insertions, 0 deletions
diff --git a/hicn-light/src/hicn/core/content_store.h b/hicn-light/src/hicn/core/content_store.h
new file mode 100644
index 000000000..1a339f494
--- /dev/null
+++ b/hicn-light/src/hicn/core/content_store.h
@@ -0,0 +1,125 @@
+#ifndef HICNLIGHT_CONTENT_STORE_H
+#define HICNLIGHT_CONTENT_STORE_H
+
+#include <hicn/base/khash.h>
+#include <hicn/base/pool.h>
+#include <hicn/core/msgbuf.h>
+#include <hicn/core/name.h>
+#include <hicn/content_store/lru.h>
+
+typedef struct {
+ msgbuf_t * message;
+ //ListLruEntry *lruEntry;
+ bool hasExpiryTimeTicks;
+ uint64_t expiryTimeTicks; // single value for both ? 0 allowed ?
+} content_store_entry_t;
+
+#define content_store_entry_message(entry) ((entry)->message)
+#define content_store_entry_has_expiry_time(entry) ((entry)->hasExpiryTimeTicks)
+#define content_store_entry_expiry_time(entry) ((entry)->expiryTimeTicks)
+
+typedef enum {
+ CONTENT_STORE_TYPE_UNDEFINED,
+ CONTENT_STORE_TYPE_LRU,
+ CONTENT_STORE_TYPE_N,
+} content_store_type_t;
+
+#define CONTENT_STORE_TYPE_VALID(type) \
+ (type != CONTENT_STORE_TYPE_UNDEFINED) && \
+ (type != CONTENT_STORE_TYPE_N)
+
+typedef struct {
+ /* The maximum allowed expiry time (will never be exceeded). */
+ uint64_t max_expiry_time; // XXX part of lru ?
+} content_store_options_t;
+
+typedef union {
+ content_store_lru_stats_t lru;
+} content_store_stats_t;
+
+// XXX TODO
+#define name_hash(name) (name_HashCode(name))
+#define name_hash_eq(a, b) (name_hash(b) - name_hash(a))
+
+KHASH_INIT(cs_name, const Name *, unsigned, 0, name_hash, name_hash_eq);
+
+typedef struct {
+ content_store_type_t type;
+
+ // XXX TODO api to dynamically set max size
+ content_store_entry_t * entries; // pool
+
+ kh_cs_name_t * index_by_name;
+
+ void * index_by_expiry_time;
+ //ListTimeOrdered *indexByExpirationTime;
+
+
+ void * data; // per cs type data
+ void * options;
+ content_store_stats_t stats;
+} content_store_t;
+
+content_store_t * content_store_create(content_store_type_t type, size_t max_elts);
+
+void content_store_free(content_store_t * cs);
+
+void content_store_clear(content_store_t * cs);
+
+msgbuf_t * content_store_match(content_store_t * cs, msgbuf_t * msgbuf, uint64_t now);
+
+void content_store_add(content_store_t * cs, msgbuf_t * msgbuf, uint64_t now);
+
+void content_store_remove_entry(content_store_t * cs, content_store_entry_t * entry);
+
+bool content_store_remove(content_store_t * cs, msgbuf_t * msgbuf);
+
+#define content_store_size(content_store) (pool_elts(cs->entries))
+
+void content_store_purge_entry(content_store_t * cs, content_store_entry_t * entry);
+
+typedef struct {
+
+ const char * name;
+
+ void (*initialize)(content_store_t * cs);
+
+ void (*finalize)(content_store_t * cs);
+
+ /**
+ * Place a Message representing a ContentObject into the ContentStore. If
+ * necessary to make room, remove expired content or content that has exceeded
+ * the Recommended Cache Time.
+ *
+ * @param storeImpl - a pointer to this ContentStoreInterface instance.
+ * @param content - a pointer to a `Message` to place in the store.
+ * @param currentTimeTicks - the current time, in hicn-light ticks, since the
+ * UTC epoch.
+ */
+ // XXX Do we always get now before adding ?
+ bool (*add_entry)(content_store_t * cs, content_store_entry_t * entry);
+
+ /**
+ * The function to call to remove content from the ContentStore.
+ * It will Release any references that were created when the content was
+ * placed into the ContentStore.
+ *
+ * @param storeImpl - a pointer to this ContentStoreInterface instance.
+ * @param content - a pointer to a `Message` to remove from the store.
+ */
+ void (*remove_entry)(content_store_t * cs, content_store_entry_t * entry);
+
+} content_store_ops_t;
+
+extern const content_store_ops_t * const content_store_vft[];
+
+#define DECLARE_CONTENT_STORE(NAME) \
+ const content_store_ops_t content_store_ ## NAME = { \
+ .name = #NAME, \
+ .initialize = content_store_ ## NAME ## _initialize, \
+ .finalize = content_store_ ## NAME ## _finalize, \
+ .add_entry = content_store_ ## NAME ## _add_entry, \
+ .remove_entry = content_store_ ## NAME ## _remove_entry, \
+ }
+
+#endif /* HICNLIGHT_CONTENT_STORE_H */