lru_t *lru_new(int lru_size, int hash) { if (lru_size < 2) { return NULL; } if (hash < 1) { hash = 1024; } lru_t *_new = (lru_t *)malloc(sizeof(lru_t)); if ( ! _new ) { return NULL; } _new->mutex = 0; _new->size = lru_size; _new->release_data_slot = 100 * 1024 * 1024; _new->total_free_size = 0; _new->lru_head = NULL; _new->lru_tail = NULL; _new->hash = hash; _new->nodes = (node_t *) calloc(lru_size, sizeof(node_t)); if ( ! _new->nodes ) { lru_free(_new); return NULL; } int i; HASH_NNEXT (_new->nodes[lru_size - 1]) = NULL; for (i=lru_size - 1; i--;) { HASH_NNEXT (_new->nodes[i]) = &(_new->nodes[i+1]); } _new->idle = _new->nodes; _new->data_recycle = NULL; _new->barrel = (node_t **) calloc(hash, sizeof(node_t*)); if ( ! _new->barrel ) { lru_free(_new); return NULL; } return _new; }
int main(int argc, char **argv) { config_init(); int c; while (-1 != (c = getopt(argc, argv, "n:m:k:d:p:h"))) { switch(c) { case 'n': config.num = atoi(optarg); break; case 'm': config.maxbytes = ((size_t)atoi(optarg)) * 1024 * 1024; break; case 'k': config.keysize = atoi(optarg); break; case 'd': config.datasize = atoi(optarg); break; case 'p': config.hashpower = atoi(optarg); break; case 'h': usage(); return EXIT_SUCCESS; default: usage(); return EXIT_FAILURE; } } generate_key_init(); print_env(); lru *l = lru_init(config.maxbytes, config.hashpower); char *bvalue = malloc(config.datasize); memset(bvalue, 'x', config.datasize); char *key = malloc(config.keysize); memset(key, 0, config.keysize); int gnum = config.keysize - num_; generate_key_reset(); bench_start("SET"); int i; for (i = 0; i < config.num; i++) { snprintf(key, config.keysize, fmt_, gnum, generate_key(gnum), i); int r = item_set(l, key, config.keysize, bvalue, config.datasize); assert(r == 0); process_report(); } bench_stop(); print_stat(l); char *buf = malloc(config.datasize); size_t sz; generate_key_reset(); bench_start("GET"); for (i = 0; i < config.num; i++) { snprintf(key, config.keysize, fmt_, gnum, generate_key(gnum), i); int r = item_get(l, key, config.keysize, buf, config.datasize, &sz); if (!r) { assert((int)sz == config.datasize); assert(memcmp(bvalue, buf, config.datasize) == 0); } memset(buf, 0, config.datasize); process_report(); } bench_stop(); print_stat(l); generate_key_reset(); bench_start("DELETE"); for (i = 0; i < config.num; i++) { snprintf(key, config.keysize, fmt_, gnum, generate_key(gnum), i); item_delete(l, key, config.keysize); process_report(); } bench_stop(); print_stat(l); free(buf); free(bvalue); free(key); free(fmt_); free(key_); lru_free(l); /* printf("print any key to exit...\n"); getchar(); */ return EXIT_SUCCESS; }