free(nm);
return;
}
- lock_quick_lock(&worker->daemon->local_zones->lock);
+ lock_rw_wrlock(&worker->daemon->local_zones->lock);
if((z=local_zones_find(worker->daemon->local_zones, nm, nmlen,
nmlabs, LDNS_RR_CLASS_IN))) {
/* already present in tree */
z->type = t; /* update type anyway */
lock_rw_unlock(&z->lock);
free(nm);
- lock_quick_unlock(&worker->daemon->local_zones->lock);
+ lock_rw_unlock(&worker->daemon->local_zones->lock);
send_ok(ssl);
return;
}
if(!local_zones_add_zone(worker->daemon->local_zones, nm, nmlen,
nmlabs, LDNS_RR_CLASS_IN, t)) {
- lock_quick_unlock(&worker->daemon->local_zones->lock);
+ lock_rw_unlock(&worker->daemon->local_zones->lock);
ssl_printf(ssl, "error out of memory\n");
return;
}
- lock_quick_unlock(&worker->daemon->local_zones->lock);
+ lock_rw_unlock(&worker->daemon->local_zones->lock);
send_ok(ssl);
}
struct local_zone* z;
if(!parse_arg_name(ssl, arg, &nm, &nmlen, &nmlabs))
return;
- lock_quick_lock(&worker->daemon->local_zones->lock);
+ lock_rw_wrlock(&worker->daemon->local_zones->lock);
if((z=local_zones_find(worker->daemon->local_zones, nm, nmlen,
nmlabs, LDNS_RR_CLASS_IN))) {
/* present in tree */
local_zones_del_zone(worker->daemon->local_zones, z);
}
- lock_quick_unlock(&worker->daemon->local_zones->lock);
+ lock_rw_unlock(&worker->daemon->local_zones->lock);
free(nm);
send_ok(ssl);
}
struct local_zones* zones = worker->daemon->local_zones;
struct local_zone* z;
char buf[257];
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
RBTREE_FOR(z, struct local_zone*, &zones->ztree) {
lock_rw_rdlock(&z->lock);
dname_str(z->name, buf);
local_zone_type2str(z->type));
lock_rw_unlock(&z->lock);
}
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
}
/** do the list_local_data command */
struct local_rrset* p;
char* s = (char*)sldns_buffer_begin(worker->env.scratch_buffer);
size_t slen = sldns_buffer_capacity(worker->env.scratch_buffer);
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
RBTREE_FOR(z, struct local_zone*, &zones->ztree) {
lock_rw_rdlock(&z->lock);
RBTREE_FOR(d, struct local_data*, &z->data) {
}
lock_rw_unlock(&z->lock);
}
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
}
/** tell other processes to execute the command */
return UB_SYNTAX;
}
- lock_quick_lock(&ctx->local_zones->lock);
+ lock_rw_wrlock(&ctx->local_zones->lock);
if((z=local_zones_find(ctx->local_zones, nm, nmlen, nmlabs,
LDNS_RR_CLASS_IN))) {
/* already present in tree */
lock_rw_wrlock(&z->lock);
z->type = t; /* update type anyway */
lock_rw_unlock(&z->lock);
- lock_quick_unlock(&ctx->local_zones->lock);
+ lock_rw_unlock(&ctx->local_zones->lock);
free(nm);
return UB_NOERROR;
}
if(!local_zones_add_zone(ctx->local_zones, nm, nmlen, nmlabs,
LDNS_RR_CLASS_IN, t)) {
- lock_quick_unlock(&ctx->local_zones->lock);
+ lock_rw_unlock(&ctx->local_zones->lock);
return UB_NOMEM;
}
- lock_quick_unlock(&ctx->local_zones->lock);
+ lock_rw_unlock(&ctx->local_zones->lock);
return UB_NOERROR;
}
return UB_SYNTAX;
}
- lock_quick_lock(&ctx->local_zones->lock);
+ lock_rw_wrlock(&ctx->local_zones->lock);
if((z=local_zones_find(ctx->local_zones, nm, nmlen, nmlabs,
LDNS_RR_CLASS_IN))) {
/* present in tree */
local_zones_del_zone(ctx->local_zones, z);
}
- lock_quick_unlock(&ctx->local_zones->lock);
+ lock_rw_unlock(&ctx->local_zones->lock);
free(nm);
return UB_NOERROR;
}
if(!zones)
return NULL;
rbtree_init(&zones->ztree, &local_zone_cmp);
- lock_quick_init(&zones->lock);
+ lock_rw_init(&zones->lock);
lock_protect(&zones->lock, &zones->ztree, sizeof(zones->ztree));
/* also lock protects the rbnode's in struct local_zone */
return zones;
{
if(!zones)
return;
- lock_quick_destroy(&zones->lock);
+ lock_rw_destroy(&zones->lock);
/* walk through zones and delete them all */
traverse_postorder(&zones->ztree, lzdel, NULL);
free(zones);
}
/* add to rbtree */
- lock_quick_lock(&zones->lock);
+ lock_rw_wrlock(&zones->lock);
lock_rw_wrlock(&z->lock);
if(!rbtree_insert(&zones->ztree, &z->node)) {
log_warn("duplicate local-zone");
lock_rw_unlock(&z->lock);
local_zone_delete(z);
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
return NULL;
}
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
return z;
}
return 0;
}
labs = dname_count_size_labels(rr_name, &len);
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
z = local_zones_lookup(zones, rr_name, len, labs, rr_class);
if(!z) {
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
fatal_exit("internal error: no zone for rr %s", rr);
}
lock_rw_wrlock(&z->lock);
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
free(rr_name);
r = lz_enter_rr_into_zone(z, rr);
lock_rw_unlock(&z->lock);
log_err("bad name %s", name);
return 0;
}
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
if(rbtree_search(&zones->ztree, &z.node)) {
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
free(z.name);
return 1;
}
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
free(z.name);
return 0;
}
{
struct local_zone* node, *prev = NULL, *p;
int m;
- lock_quick_lock(&zones->lock);
+ lock_rw_wrlock(&zones->lock);
RBTREE_FOR(node, struct local_zone*, &zones->ztree) {
lock_rw_wrlock(&node->lock);
node->parent = NULL;
prev = node;
lock_rw_unlock(&node->lock);
}
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
}
/** enter implicit transparent zone for local-data: without local-zone: */
return 0;
}
labs = dname_count_size_labels(rr_name, &len);
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
if(!local_zones_lookup(zones, rr_name, len, labs, rr_class)) {
if(!have_name) {
dclass = rr_class;
/* process other classes later */
free(rr_name);
have_other_classes = 1;
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
continue;
}
/* find smallest shared topdomain */
match = m;
}
} else free(rr_name);
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
}
if(have_name) {
uint8_t* n2;
void local_zones_print(struct local_zones* zones)
{
struct local_zone* z;
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
log_info("number of auth zones %u", (unsigned)zones->ztree.count);
RBTREE_FOR(z, struct local_zone*, &zones->ztree) {
lock_rw_rdlock(&z->lock);
local_zone_out(z);
lock_rw_unlock(&z->lock);
}
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
}
/** encode answer consisting of 1 rrset */
struct local_data* ld;
struct local_zone* z;
int r;
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
z = local_zones_lookup(zones, qinfo->qname,
qinfo->qname_len, labs, qinfo->qclass);
if(!z) {
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
return 0;
}
lock_rw_rdlock(&z->lock);
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
if(local_data_answer(z, qinfo, edns, buf, temp, labs, &ld)) {
lock_rw_unlock(&z->lock);
return 0;
}
labs = dname_count_size_labels(rr_name, &len);
- lock_quick_lock(&zones->lock);
+ /* could first try readlock then get writelock if zone does not exist,
+ * but we do not add enough RRs (from multiple threads) to optimize */
+ lock_rw_wrlock(&zones->lock);
z = local_zones_lookup(zones, rr_name, len, labs, rr_class);
if(!z) {
z = local_zones_add_zone(zones, rr_name, len, labs, rr_class,
local_zone_transparent);
if(!z) {
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
return 0;
}
} else {
free(rr_name);
}
lock_rw_wrlock(&z->lock);
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
r = lz_enter_rr_into_zone(z, rr);
lock_rw_unlock(&z->lock);
return r;
/* find zone */
struct local_zone* z;
struct local_data* d;
- lock_quick_lock(&zones->lock);
+ lock_rw_rdlock(&zones->lock);
z = local_zones_lookup(zones, name, len, labs, dclass);
if(!z) {
/* no such zone, we're done */
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
return;
}
lock_rw_wrlock(&z->lock);
- lock_quick_unlock(&zones->lock);
+ lock_rw_unlock(&zones->lock);
/* find the domain */
d = lz_find_node(z, name, len, labs);