Lines Matching defs:w
88 static void handle_newq(struct libworker* w, uint8_t* buf, uint32_t len);
92 libworker_delete_env(struct libworker* w)
94 if(w->env) {
95 outside_network_quit_prepare(w->back);
96 mesh_delete(w->env->mesh);
97 context_release_alloc(w->ctx, w->env->alloc,
98 !w->is_bg || w->is_bg_thread);
99 sldns_buffer_free(w->env->scratch_buffer);
100 regional_destroy(w->env->scratch);
101 ub_randfree(w->env->rnd);
102 free(w->env);
105 SSL_CTX_free(w->sslctx);
107 outside_network_delete(w->back);
112 libworker_delete(struct libworker* w)
114 if(!w) return;
115 libworker_delete_env(w);
116 comm_base_delete(w->base);
117 free(w);
121 libworker_delete_event(struct libworker* w)
123 if(!w) return;
124 libworker_delete_env(w);
125 comm_base_delete_no_base(w->base);
126 free(w);
133 struct libworker* w = (struct libworker*)calloc(1, sizeof(*w));
137 if(!w) return NULL;
138 w->is_bg = is_bg;
139 w->ctx = ctx;
140 w->env = (struct module_env*)malloc(sizeof(*w->env));
141 if(!w->env) {
142 free(w);
145 *w->env = *ctx->env;
146 w->env->alloc = context_obtain_alloc(ctx, !w->is_bg || w->is_bg_thread);
147 if(!w->env->alloc) {
148 libworker_delete(w);
151 w->thread_num = w->env->alloc->thread_num;
152 alloc_set_id_cleanup(w->env->alloc, &libworker_alloc_cleanup, w);
153 if(!w->is_bg || w->is_bg_thread) {
156 w->env->scratch = regional_create_custom(cfg->msg_buffer_size);
157 w->env->scratch_buffer = sldns_buffer_new(cfg->msg_buffer_size);
159 w->sslctx = connect_sslctx_create(NULL, NULL,
161 if(!w->sslctx) {
163 sldns_buffer_free(w->env->scratch_buffer);
164 w->env->scratch_buffer = NULL;
167 if(!w->is_bg || w->is_bg_thread) {
170 if(!w->env->scratch || !w->env->scratch_buffer) {
171 libworker_delete(w);
174 w->env->worker = (struct worker*)w;
175 w->env->probe_timer = NULL;
176 if(!w->is_bg || w->is_bg_thread) {
179 if(!(w->env->rnd = ub_initstate(ctx->seed_rnd))) {
180 if(!w->is_bg || w->is_bg_thread) {
183 libworker_delete(w);
186 if(!w->is_bg || w->is_bg_thread) {
199 hash_set_raninit((uint32_t)ub_random(w->env->rnd));
204 w->base = comm_base_create_event(eb);
205 else w->base = comm_base_create(0);
206 if(!w->base) {
207 libworker_delete(w);
210 w->env->worker_base = w->base;
211 if(!w->is_bg || w->is_bg_thread) {
216 if(!w->is_bg || w->is_bg_thread) {
219 libworker_delete(w);
222 w->back = outside_network_create(w->base, cfg->msg_buffer_size,
226 w->env->infra_cache, w->env->rnd, cfg->use_caps_bits_for_id,
228 cfg->outgoing_tcp_mss, &libworker_alloc_cleanup, w,
229 cfg->do_udp || cfg->udp_upstream_without_downstream, w->sslctx,
233 w->env->outnet = w->back;
234 if(!w->is_bg || w->is_bg_thread) {
238 if(!w->back) {
239 libworker_delete(w);
242 w->env->mesh = mesh_create(&ctx->mods, w->env);
243 if(!w->env->mesh) {
244 libworker_delete(w);
247 w->env->send_query = &libworker_send_query;
248 w->env->detach_subs = &mesh_detach_subs;
249 w->env->attach_sub = &mesh_attach_sub;
250 w->env->add_sub = &mesh_add_sub;
251 w->env->kill_sub = &mesh_state_delete;
252 w->env->detect_cycle = &mesh_detect_cycle;
253 comm_base_timept(w->base, &w->env->now, &w->env->now_tv);
255 return w;
266 handle_cancel(struct libworker* w, uint8_t* buf, uint32_t len)
269 if(w->is_bg_thread) {
270 lock_basic_lock(&w->ctx->cfglock);
271 q = context_deserialize_cancel(w->ctx, buf, len);
272 lock_basic_unlock(&w->ctx->cfglock);
274 q = context_deserialize_cancel(w->ctx, buf, len);
287 libworker_do_cmd(struct libworker* w, uint8_t* msg, uint32_t len)
299 comm_base_exit(w->base);
302 handle_newq(w, msg, len);
305 handle_cancel(w, msg, len);
315 struct libworker* w = (struct libworker*)arg;
320 comm_base_exit(w->base);
323 libworker_do_cmd(w, msg, len); /* also frees the buf */
332 struct libworker* w = (struct libworker*)arg;
334 if(!w) {
338 ctx = w->ctx;
339 log_thread_set(&w->thread_num);
342 w->is_bg_thread = 0;
347 if(!tube_setup_bg_listen(ctx->qq_pipe, w->base,
348 libworker_handle_control_cmd, w)) {
352 if(!tube_setup_bg_write(ctx->rr_pipe, w->base)) {
358 comm_base_dispatch(w->base);
362 w->want_quit = 1;
363 tube_remove_bg_listen(w->ctx->qq_pipe);
364 tube_remove_bg_write(w->ctx->rr_pipe);
365 libworker_delete(w);
378 struct libworker* w;
383 w = libworker_setup(ctx, 1, NULL);
384 if(!w) return UB_NOMEM;
385 w->is_bg_thread = 1;
386 ctx->thread_worker = w;
388 w->thread_num = 1; /* for nicer DEBUG checklocks */
390 ub_thread_create(&ctx->bg_tid, libworker_dobg, w);
399 w = libworker_setup(ctx, 1, NULL);
400 if(!w) fatal_exit("out of memory");
404 (void)libworker_dobg(w);
562 libworker_enter_result(q->res, buf, q->w->env->scratch, s);
571 comm_base_exit(q->w->base);
578 setup_qinfo_edns(struct libworker* w, struct ctx_query* q,
598 if(sldns_buffer_capacity(w->back->udp_buff) < 65535)
600 w->back->udp_buff);
607 struct libworker* w = libworker_setup(ctx, 0, NULL);
611 if(!w)
613 if(!setup_qinfo_edns(w, q, &qinfo, &edns)) {
614 libworker_delete(w);
619 q->w = w;
621 sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
622 sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
623 if(local_zones_answer(ctx->local_zones, w->env, &qinfo, &edns,
624 w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
626 regional_free_all(w->env->scratch);
628 w->back->udp_buff, sec_status_insecure, NULL, 0);
629 libworker_delete(w);
634 w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
635 regional_free_all(w->env->scratch);
637 w->back->udp_buff, sec_status_insecure, NULL, 0);
638 libworker_delete(w);
643 if(!mesh_new_callback(w->env->mesh, &qinfo, qflags, &edns,
644 w->back->udp_buff, qid, libworker_fg_done_cb, q, 0)) {
651 comm_base_dispatch(w->base);
653 libworker_delete(w);
667 struct ub_ctx* ctx = q->w->ctx;
689 struct libworker* w = ctx->event_worker;
693 if(!w)
695 if(!setup_qinfo_edns(w, q, &qinfo, &edns))
699 q->w = w;
701 sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
702 sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
703 if(local_zones_answer(ctx->local_zones, w->env, &qinfo, &edns,
704 w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
706 regional_free_all(w->env->scratch);
709 w->back->udp_buff, sec_status_insecure, NULL, 0);
713 w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
714 regional_free_all(w->env->scratch);
717 w->back->udp_buff, sec_status_insecure, NULL, 0);
723 if(!mesh_new_callback(w->env->mesh, &qinfo, qflags, &edns,
724 w->back->udp_buff, qid, libworker_event_done_cb, q, 0)) {
734 add_bg_result(struct libworker* w, struct ctx_query* q, sldns_buffer* pkt,
740 if(w->want_quit) {
745 if(w->is_bg_thread) {
746 lock_basic_lock(&w->ctx->cfglock);
761 lock_basic_unlock(&w->ctx->cfglock);
767 (void)rbtree_delete(&w->ctx->queries, q->node.key);
768 w->ctx->num_async--;
776 if(!tube_queue_item(w->ctx->rr_pipe, msg, len)) {
788 if(q->cancelled || q->w->back->want_to_quit) {
789 if(q->w->is_bg_thread) {
791 struct ub_ctx* ctx = q->w->ctx;
803 buf = q->w->env->scratch_buffer;
808 add_bg_result(q->w, q, buf, UB_NOERROR, why_bogus, was_ratelimited);
814 handle_newq(struct libworker* w, uint8_t* buf, uint32_t len)
820 if(w->is_bg_thread) {
821 lock_basic_lock(&w->ctx->cfglock);
822 q = context_lookup_new_query(w->ctx, buf, len);
823 lock_basic_unlock(&w->ctx->cfglock);
825 q = context_deserialize_new_query(w->ctx, buf, len);
832 if(!setup_qinfo_edns(w, q, &qinfo, &edns)) {
833 add_bg_result(w, q, NULL, UB_SYNTAX, NULL, 0);
839 sldns_buffer_write_u16_at(w->back->udp_buff, 0, qid);
840 sldns_buffer_write_u16_at(w->back->udp_buff, 2, qflags);
841 if(local_zones_answer(w->ctx->local_zones, w->env, &qinfo, &edns,
842 w->back->udp_buff, w->env->scratch, NULL, NULL, 0, NULL, 0,
844 regional_free_all(w->env->scratch);
846 add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL, 0);
850 if(w->ctx->env->auth_zones && auth_zones_answer(w->ctx->env->auth_zones,
851 w->env, &qinfo, &edns, NULL, w->back->udp_buff, w->env->scratch)) {
852 regional_free_all(w->env->scratch);
854 add_bg_result(w, q, w->back->udp_buff, UB_NOERROR, NULL, 0);
858 q->w = w;
860 if(!mesh_new_callback(w->env->mesh, &qinfo, qflags, &edns,
861 w->back->udp_buff, qid, libworker_bg_done_cb, q, 0)) {
862 add_bg_result(w, q, NULL, UB_NOMEM, NULL, 0);
869 struct libworker* w = (struct libworker*)arg;
870 slabhash_clear(&w->env->rrset_cache->table);
871 slabhash_clear(w->env->msg_cache);
881 struct libworker* w = (struct libworker*)q->env->worker;
887 e->qsent = outnet_serviced_query(w->back, qinfo, flags, dnssec,
890 libworker_handle_service_reply, e, w->back->udp_buff, q->env,