void process_blocking_resp( blocking_child * c ) { blocking_pipe_header * resp; void * data; #ifdef USE_WORK_THREAD do { #endif resp = receive_blocking_resp_internal(c); if (NULL != resp) { DEBUG_REQUIRE(BLOCKING_RESP_MAGIC == resp->magic_sig); data = (char *)resp + sizeof(*resp); intres_req_pending--; (*resp->done_func)(resp->rtype, resp->context, resp->octets - sizeof(*resp), data); free(resp); } #ifdef USE_WORK_THREAD } while (NULL != resp); #endif if (!worker_per_query && 0 == intres_req_pending) intres_timeout_req(CHILD_MAX_IDLE); else if (worker_per_query) req_child_exit(c); }
void process_blocking_resp( blocking_child * c ) { blocking_pipe_header * resp; void * data; /* * On Windows send_blocking_resp_internal() may signal the * blocking_response_ready event multiple times while we're * processing a response, so always consume all available * responses before returning to test the event again. */ #ifdef WORK_THREAD do { #endif resp = receive_blocking_resp_internal(c); if (NULL != resp) { DEBUG_REQUIRE(BLOCKING_RESP_MAGIC == resp->magic_sig); data = (char *)resp + sizeof(*resp); intres_req_pending--; (*resp->done_func)(resp->rtype, resp->context, resp->octets - sizeof(*resp), data); free(resp); } #ifdef WORK_THREAD } while (NULL != resp); #endif if (!worker_per_query && 0 == intres_req_pending) intres_timeout_req(CHILD_MAX_IDLE); else if (worker_per_query) req_child_exit(c); }