void li_connection_free(liConnection *con) { LI_FORCE_ASSERT(NULL == con->con_sock.data); LI_FORCE_ASSERT(LI_CON_STATE_DEAD == con->state); con->response_headers_sent = FALSE; con->expect_100_cont = FALSE; con->out_has_all_data = FALSE; li_server_socket_release(con->srv_sock); con->srv_sock = NULL; g_string_free(con->info.remote_addr_str, TRUE); li_sockaddr_clear(&con->info.remote_addr); g_string_free(con->info.local_addr_str, TRUE); li_sockaddr_clear(&con->info.local_addr); li_vrequest_free(con->mainvr); li_http_request_parser_clear(&con->req_parser_ctx); con->info.keep_alive = TRUE; if (con->keep_alive_data.link && con->wrk) { g_queue_delete_link(&con->wrk->keep_alive_queue, con->keep_alive_data.link); con->keep_alive_data.link = NULL; } con->keep_alive_data.timeout = 0; con->keep_alive_data.max_idle = 0; li_event_clear(&con->keep_alive_data.watcher); /* remove from timeout queue */ li_waitqueue_remove(&con->wrk->io_timeout_queue, &con->io_timeout_elem); li_job_clear(&con->job_reset); g_slice_free(liConnection, con); }
static void progress_hashtable_free_callback(gpointer data) { mod_progress_node *node = data; mod_progress_worker_data *wd = node->worker_data; if (node->vr) { g_ptr_array_index(node->vr->plugin_ctx, wd->pd->p->id) = NULL; } li_waitqueue_remove(&wd->timeout_queue, &(node->timeout_queue_elem)); g_free(node->id); g_slice_free(mod_progress_node, node); }
static void li_connection_reset2(liConnection *con) { con->response_headers_sent = FALSE; con->expect_100_cont = FALSE; con->out_has_all_data = FALSE; con_iostream_close(con); li_server_socket_release(con->srv_sock); con->srv_sock = NULL; con->info.is_ssl = FALSE; con->info.aborted = FALSE; con->info.out_queue_length = 0; li_stream_reset(&con->in); li_stream_reset(&con->out); li_vrequest_reset(con->mainvr, FALSE); li_http_request_parser_reset(&con->req_parser_ctx); g_string_truncate(con->info.remote_addr_str, 0); li_sockaddr_clear(&con->info.remote_addr); g_string_truncate(con->info.local_addr_str, 0); li_sockaddr_clear(&con->info.local_addr); con->info.keep_alive = TRUE; if (con->keep_alive_data.link) { g_queue_delete_link(&con->wrk->keep_alive_queue, con->keep_alive_data.link); con->keep_alive_data.link = NULL; } con->keep_alive_data.timeout = 0; con->keep_alive_data.max_idle = 0; li_event_stop(&con->keep_alive_data.watcher); con->keep_alive_requests = 0; /* reset stats */ con->info.stats.bytes_in = G_GUINT64_CONSTANT(0); con->info.stats.bytes_in_5s = G_GUINT64_CONSTANT(0); con->info.stats.bytes_in_5s_diff = G_GUINT64_CONSTANT(0); con->info.stats.bytes_out = G_GUINT64_CONSTANT(0); con->info.stats.bytes_out_5s = G_GUINT64_CONSTANT(0); con->info.stats.bytes_out_5s_diff = G_GUINT64_CONSTANT(0); con->info.stats.last_avg = 0; /* remove from timeout queue */ li_waitqueue_remove(&con->wrk->io_timeout_queue, &con->io_timeout_elem); li_job_reset(&con->job_reset); }
void li_throttle_free(liWorker *wrk, liThrottleState *state) { guint i, len; assert(NULL != wrk); if (NULL == state) return; for (i = 0, len = state->pools->len; i < len; ++i) { liThrottlePoolState *pstate = g_ptr_array_index(state->pools, i); throttle_unregister(&pstate->pool->workers[wrk->ndx], pstate); li_throttle_pool_release(pstate->pool, wrk->srv); g_slice_free(liThrottlePoolState, pstate); } g_ptr_array_free(state->pools, TRUE); li_waitqueue_remove(&wrk->throttle_queue, &state->wqueue_elem); g_slice_free(liThrottleState, state); }
void li_connection_update_io_wait(liConnection *con) { liWorker *wrk = con->wrk; gboolean want_timeout = FALSE; gboolean stopping = wrk->wait_for_stop_connections.active; switch (con->state) { case LI_CON_STATE_DEAD: case LI_CON_STATE_CLOSE: /* only a temporary state before DEAD */ want_timeout = FALSE; break; case LI_CON_STATE_KEEP_ALIVE: want_timeout = stopping; break; case LI_CON_STATE_REQUEST_START: want_timeout = TRUE; break; case LI_CON_STATE_READ_REQUEST_HEADER: want_timeout = TRUE; break; case LI_CON_STATE_HANDLE_MAINVR: /* want timeout while we're still reading request body */ want_timeout = stopping || !con->in.out->is_closed; break; case LI_CON_STATE_WRITE: want_timeout = TRUE; break; case LI_CON_STATE_UPGRADED: want_timeout = stopping; break; } if (want_timeout == con->io_timeout_elem.queued) return; if (want_timeout) { li_waitqueue_push(&wrk->io_timeout_queue, &con->io_timeout_elem); } else { li_waitqueue_remove(&wrk->io_timeout_queue, &con->io_timeout_elem); } }