From: Wouter Wijngaards Date: Mon, 28 Jan 2008 15:57:27 +0000 (+0000) Subject: libevent compatibility. X-Git-Tag: release-0.9~31 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=be483a3bfb02e27eca46949e39671c5dc7925db8;p=thirdparty%2Funbound.git libevent compatibility. git-svn-id: file:///svn/unbound/trunk@909 be551aaa-1e26-0410-a405-d3ace91eadb9 --- diff --git a/doc/Changelog b/doc/Changelog index 4ab938aeb..21c6bd07d 100644 --- a/doc/Changelog +++ b/doc/Changelog @@ -10,6 +10,8 @@ a super-rnd can be passed at init to chain init random states. - test also does lock checks if available. - protect config access in libworker_setup(). + - libevent doesn't like comm_base_exit outside of runloop. + - close fds after removing commpoints only (for epoll, kqueue). 25 January 2008: Wouter - added tpkg for asynclook and library use. diff --git a/libunbound/worker.c b/libunbound/worker.c index 6b55b1d58..80b17c0f8 100644 --- a/libunbound/worker.c +++ b/libunbound/worker.c @@ -290,7 +290,6 @@ libworker_dobg(void* arg) ctx->rrpipe[0] = -1; } #endif - log_info("dobg start"); if(!w) { log_err("libunbound bg worker init failed, nomem"); return NULL; @@ -313,9 +312,9 @@ libworker_dobg(void* arg) fd = ctx->rrpipe[1]; ctx->rrpipe[1] = -1; m = UB_LIBCMD_QUIT; + libworker_delete(w); close(ctx->qqpipe[0]); ctx->qqpipe[0] = -1; - libworker_delete(w); (void)libworker_write_msg(fd, (uint8_t*)&m, (uint32_t)sizeof(m), 0); close(fd); return NULL; @@ -452,14 +451,11 @@ libworker_enter_result(struct ub_val_result* res, ldns_buffer* buf, res->bogus = 1; } -/** callback with fg results */ +/** fillup fg results */ static void -libworker_fg_done_cb(void* arg, int rcode, ldns_buffer* buf, enum sec_status s) +libworker_fillup_fg(struct ctx_query* q, int rcode, ldns_buffer* buf, + enum sec_status s) { - struct ctx_query* q = (struct ctx_query*)arg; - /* fg query is done; exit comm base */ - comm_base_exit(q->w->base); - if(rcode != 0) { q->res->rcode = rcode; q->msg_security = s; @@ -479,6 +475,17 @@ libworker_fg_done_cb(void* arg, int rcode, ldns_buffer* buf, enum sec_status s) libworker_enter_result(q->res, buf, q->w->env->scratch, s); } +/** callback with fg results */ +static void +libworker_fg_done_cb(void* arg, int rcode, ldns_buffer* buf, enum sec_status s) +{ + struct ctx_query* q = (struct ctx_query*)arg; + /* fg query is done; exit comm base */ + comm_base_exit(q->w->base); + + libworker_fillup_fg(q, rcode, buf, s); +} + /** setup qinfo and edns */ static int setup_qinfo_edns(struct libworker* w, struct ctx_query* q, @@ -525,7 +532,7 @@ int libworker_fg(struct ub_val_ctx* ctx, struct ctx_query* q) ldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags); if(local_zones_answer(ctx->local_zones, &qinfo, &edns, w->back->udp_buff, w->env->scratch)) { - libworker_fg_done_cb(q, LDNS_RCODE_NOERROR, + libworker_fillup_fg(q, LDNS_RCODE_NOERROR, w->back->udp_buff, sec_status_insecure); libworker_delete(w); free(qinfo.qname);