/** the unit test testframe for cachedb, its module state contains
* a cache for a couple queries (in memory). */
struct testframe_moddata {
+ /** lock for mutex */
+ lock_basic_type lock;
/** key for single stored data element, NULL if none */
char* stored_key;
/** data for single stored data element, NULL if none */
static int
testframe_init(struct module_env* env, struct cachedb_env* cachedb_env)
{
+ struct testframe_moddata* d;
(void)env;
verbose(VERB_ALGO, "testframe_init");
- cachedb_env->backend_data = (void*)calloc(1,
+ d = (struct testframe_moddata*)calloc(1,
sizeof(struct testframe_moddata));
+ cachedb_env->backend_data = (void*)d;
if(!cachedb_env->backend_data) {
log_err("out of memory");
return 0;
}
+ lock_basic_init(&d->lock);
return 1;
}
verbose(VERB_ALGO, "testframe_deinit");
if(!d)
return;
+ lock_basic_destroy(&d->lock);
free(d->stored_key);
free(d->stored_data);
free(d);
cachedb_env->backend_data;
(void)env;
verbose(VERB_ALGO, "testframe_lookup of %s", key);
+ lock_basic_lock(&d->lock);
if(d->stored_key && strcmp(d->stored_key, key) == 0) {
- if(d->stored_datalen > sldns_buffer_capacity(result_buffer))
+ if(d->stored_datalen > sldns_buffer_capacity(result_buffer)) {
+ lock_basic_unlock(&d->lock);
return 0; /* too large */
+ }
verbose(VERB_ALGO, "testframe_lookup found %d bytes",
(int)d->stored_datalen);
sldns_buffer_clear(result_buffer);
sldns_buffer_write(result_buffer, d->stored_data,
d->stored_datalen);
sldns_buffer_flip(result_buffer);
+ lock_basic_unlock(&d->lock);
return 1;
}
+ lock_basic_unlock(&d->lock);
return 0;
}
struct testframe_moddata* d = (struct testframe_moddata*)
cachedb_env->backend_data;
(void)env;
+ lock_basic_lock(&d->lock);
verbose(VERB_ALGO, "testframe_store %s (%d bytes)", key, (int)data_len);
/* free old data element (if any) */
d->stored_data = memdup(data, data_len);
if(!d->stored_data) {
+ lock_basic_unlock(&d->lock);
log_err("out of memory");
return;
}
free(d->stored_data);
d->stored_data = NULL;
d->stored_datalen = 0;
+ lock_basic_unlock(&d->lock);
return;
}
+ lock_basic_unlock(&d->lock);
/* (key,data) successfully stored */
}