1cafe7743SAsim Jamshed #include "debug.h"
276404edcSAsim Jamshed #include <stdio.h>
376404edcSAsim Jamshed #include <stdlib.h>
476404edcSAsim Jamshed #include <string.h>
576404edcSAsim Jamshed #include <assert.h>
676404edcSAsim Jamshed #include <math.h>
776404edcSAsim Jamshed #include <netinet/in.h>
876404edcSAsim Jamshed #include <arpa/inet.h>
976404edcSAsim Jamshed #include <sys/queue.h>
1076404edcSAsim Jamshed #include "key_value_store.h"
1176404edcSAsim Jamshed #include "scalable_event.h"
1276404edcSAsim Jamshed
1376404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
1476404edcSAsim Jamshed kvs_t *
kvs_create(int num_buckets,int num_entries)1576404edcSAsim Jamshed kvs_create(int num_buckets, int num_entries)
1676404edcSAsim Jamshed {
1776404edcSAsim Jamshed int i;
1876404edcSAsim Jamshed kvs_t *ht = calloc(1, sizeof(kvs_t));
1976404edcSAsim Jamshed if (!ht)
2076404edcSAsim Jamshed return NULL;
2176404edcSAsim Jamshed
2276404edcSAsim Jamshed ht->num_buckets = num_buckets;
2376404edcSAsim Jamshed ht->num_entries = num_entries;
2476404edcSAsim Jamshed
2576404edcSAsim Jamshed /* init the tables */
2676404edcSAsim Jamshed if (!(ht->kvs_table = calloc(num_buckets, sizeof(kvs_bucket_head)))) {
2776404edcSAsim Jamshed free(ht);
2876404edcSAsim Jamshed return NULL;
2976404edcSAsim Jamshed }
3076404edcSAsim Jamshed for (i = 0; i < num_buckets; i++)
3176404edcSAsim Jamshed TAILQ_INIT(&ht->kvs_table[i]);
3276404edcSAsim Jamshed
3376404edcSAsim Jamshed if (!(ht->kvs_cont = calloc(num_entries, sizeof(struct kvs_entry)))) {
3476404edcSAsim Jamshed free(ht->kvs_table);
3576404edcSAsim Jamshed free(ht);
3676404edcSAsim Jamshed return NULL;
3776404edcSAsim Jamshed }
3876404edcSAsim Jamshed TAILQ_INIT(&ht->kvs_free);
3976404edcSAsim Jamshed for (i = 0; i < num_entries; i++)
4076404edcSAsim Jamshed TAILQ_INSERT_TAIL(&ht->kvs_free, &ht->kvs_cont[i], link);
4176404edcSAsim Jamshed
4276404edcSAsim Jamshed return ht;
4376404edcSAsim Jamshed }
4476404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
4576404edcSAsim Jamshed void
kvs_destroy(kvs_t * ht)4676404edcSAsim Jamshed kvs_destroy(kvs_t *ht)
4776404edcSAsim Jamshed {
4876404edcSAsim Jamshed free(ht->kvs_table);
4976404edcSAsim Jamshed free(ht->kvs_cont);
5076404edcSAsim Jamshed free(ht);
5176404edcSAsim Jamshed }
5276404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
5376404edcSAsim Jamshed int
kvs_insert(kvs_t * ht,_key_t const key,void * const value)5476404edcSAsim Jamshed kvs_insert(kvs_t *ht, _key_t const key, void * const value)
5576404edcSAsim Jamshed {
56cafe7743SAsim Jamshed #ifdef DBGMSG
57*8176a49fSAsim Jamshed __PREPARE_DBGLOGGING();
58cafe7743SAsim Jamshed #endif
5976404edcSAsim Jamshed /* create an entry*/
6076404edcSAsim Jamshed int idx;
6176404edcSAsim Jamshed
6276404edcSAsim Jamshed assert(value);
6376404edcSAsim Jamshed
6476404edcSAsim Jamshed assert(ht);
6576404edcSAsim Jamshed assert(ht->kvs_count <= ht->num_entries);
6676404edcSAsim Jamshed
6776404edcSAsim Jamshed if (kvs_search(ht, key))
6876404edcSAsim Jamshed return -1;
6976404edcSAsim Jamshed
7076404edcSAsim Jamshed idx = key % ht->num_buckets;
7176404edcSAsim Jamshed assert(idx >=0 && idx < ht->num_buckets);
7276404edcSAsim Jamshed
7376404edcSAsim Jamshed /* get a container */
7476404edcSAsim Jamshed struct kvs_entry *ent;
7576404edcSAsim Jamshed if (!(ent = TAILQ_FIRST(&ht->kvs_free)))
7676404edcSAsim Jamshed return -1;
7776404edcSAsim Jamshed TAILQ_REMOVE(&ht->kvs_free, ent, link);
7876404edcSAsim Jamshed
7976404edcSAsim Jamshed /* put the value to the container */
8076404edcSAsim Jamshed ent->key = key;
8176404edcSAsim Jamshed ent->value = value;
8276404edcSAsim Jamshed
8376404edcSAsim Jamshed /* insert the container */
8476404edcSAsim Jamshed TAILQ_INSERT_TAIL(&ht->kvs_table[idx], ent, link);
8576404edcSAsim Jamshed ht->kvs_count++;
8676404edcSAsim Jamshed
8776404edcSAsim Jamshed TRACE_DBG("%lX inserted to 0x%p\n", key, ht);
8876404edcSAsim Jamshed
8976404edcSAsim Jamshed return 0;
9076404edcSAsim Jamshed }
9176404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
9276404edcSAsim Jamshed void *
kvs_remove(kvs_t * ht,_key_t const key)9376404edcSAsim Jamshed kvs_remove(kvs_t *ht, _key_t const key)
9476404edcSAsim Jamshed {
95cafe7743SAsim Jamshed #ifdef DBGMSG
96*8176a49fSAsim Jamshed __PREPARE_DBGLOGGING();
97cafe7743SAsim Jamshed #endif
9876404edcSAsim Jamshed struct kvs_entry *walk;
9976404edcSAsim Jamshed kvs_bucket_head *head;
10076404edcSAsim Jamshed
10176404edcSAsim Jamshed head = &ht->kvs_table[key % ht->num_buckets];
10276404edcSAsim Jamshed TAILQ_FOREACH(walk, head, link) {
10376404edcSAsim Jamshed if (key == walk->key) {
10476404edcSAsim Jamshed TAILQ_REMOVE(head, walk, link);
10576404edcSAsim Jamshed TAILQ_INSERT_TAIL(&ht->kvs_free, walk, link);
10676404edcSAsim Jamshed ht->kvs_count--;
10776404edcSAsim Jamshed
10876404edcSAsim Jamshed TRACE_DBG("%lX removed from 0x%p\n", key, ht);
10976404edcSAsim Jamshed return walk->value;
11076404edcSAsim Jamshed }
11176404edcSAsim Jamshed }
11276404edcSAsim Jamshed
11376404edcSAsim Jamshed return NULL;
11476404edcSAsim Jamshed }
11576404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
11676404edcSAsim Jamshed void *
kvs_search(kvs_t * ht,_key_t const key)11776404edcSAsim Jamshed kvs_search(kvs_t *ht, _key_t const key)
11876404edcSAsim Jamshed {
119cafe7743SAsim Jamshed #ifdef DBGMSG
120*8176a49fSAsim Jamshed __PREPARE_DBGLOGGING();
121cafe7743SAsim Jamshed #endif
12276404edcSAsim Jamshed TRACE_DBG("look for %lX from 0x%p..\n", key, ht);
12376404edcSAsim Jamshed
12476404edcSAsim Jamshed struct kvs_entry *walk;
12576404edcSAsim Jamshed kvs_bucket_head *head;
12676404edcSAsim Jamshed
12776404edcSAsim Jamshed head = &ht->kvs_table[key % ht->num_buckets];
12876404edcSAsim Jamshed TAILQ_FOREACH(walk, head, link) {
12976404edcSAsim Jamshed if (key == walk->key)
13076404edcSAsim Jamshed return walk->value;
13176404edcSAsim Jamshed }
13276404edcSAsim Jamshed
13376404edcSAsim Jamshed return NULL;
13476404edcSAsim Jamshed }
13576404edcSAsim Jamshed /*----------------------------------------------------------------------------*/
136