static void close_cb(liGnuTLSFilter *f, gpointer data) { mod_connection_ctx *conctx = data; liConnection *con = conctx->con; LI_FORCE_ASSERT(conctx->tls_filter == f); conctx->tls_filter = NULL; li_gnutls_filter_free(f); gnutls_deinit(conctx->session); if (NULL != conctx->ctx) { mod_gnutls_context_release(conctx->ctx); conctx->ctx = NULL; } if (NULL != conctx->con) { liStream *raw_out = con->con_sock.raw_out, *raw_in = con->con_sock.raw_in; LI_FORCE_ASSERT(con->con_sock.data == conctx); conctx->con = NULL; con->con_sock.data = NULL; con->con_sock.callbacks = NULL; li_stream_acquire(raw_in); li_stream_reset(raw_out); li_stream_reset(raw_in); li_stream_release(raw_in); } #ifdef USE_SNI if (NULL != conctx->sni_db_wait) { li_fetch_cancel(&conctx->sni_db_wait); } if (NULL != conctx->sni_entry) { li_fetch_entry_release(conctx->sni_entry); conctx->sni_entry = NULL; } #endif if (NULL != conctx->client_hello_stream) { li_ssl_client_hello_stream_ready(conctx->client_hello_stream); li_stream_release(conctx->client_hello_stream); conctx->client_hello_stream = NULL; } #ifdef USE_SNI if (NULL != conctx->sni_jobref) { li_job_ref_release(conctx->sni_jobref); conctx->sni_jobref = NULL; } li_job_clear(&conctx->sni_job); if (NULL != conctx->sni_server_name) { g_string_free(conctx->sni_server_name, TRUE); conctx->sni_server_name = NULL; } #endif LI_FORCE_ASSERT(NULL != conctx->sock_stream); li_iostream_safe_release(&conctx->sock_stream); }
/* run jobs for async queued jobs */ static void job_async_queue_cb(liEventBase *watcher, int events) { liJobQueue* jq = LI_CONTAINER_OF(li_event_async_from(watcher), liJobQueue, async_queue_watcher); GAsyncQueue *q = jq->async_queue; liJobRef *jobref; UNUSED(events); while (NULL != (jobref = g_async_queue_try_pop(q))) { li_job_now_ref(jobref); li_job_ref_release(jobref); } }
void li_job_stop(liJob *job) { if (NULL != job->link.data) { liJobQueue *jq = job->link.data; g_queue_unlink(&jq->queue, &job->link); job->link.data = NULL; } if (NULL != job->ref) { job->ref->job = NULL; li_job_ref_release(job->ref); job->ref = NULL; } }
void li_job_clear(liJob *job) { if (NULL != job->link.data) { liJobQueue *jq = job->link.data; g_queue_unlink(&jq->queue, &job->link); job->link.data = NULL; } job->generation = 0; if (NULL != job->ref) { job->ref->job = NULL; li_job_ref_release(job->ref); job->ref = NULL; } job->callback = NULL; }
void li_job_reset(liJob *job) { if (NULL != job->link.data) { liJobQueue *jq = job->link.data; g_queue_unlink(&jq->queue, &job->link); job->link.data = NULL; } job->generation = 0; if (NULL != job->ref) { /* keep it if refcount == 1, as we are the only reference then */ if (1 < g_atomic_int_get(&job->ref->refcount)) { li_job_ref_release(job->ref); job->ref = NULL; } } }
void li_job_queue_clear(liJobQueue *jq) { if (NULL == jq->async_queue) return; while (jq->queue.length > 0 || g_async_queue_length(jq->async_queue) > 0) { liJobRef *jobref; while (NULL != (jobref = g_async_queue_try_pop(jq->async_queue))) { li_job_now_ref(jobref); li_job_ref_release(jobref); } job_queue_run(jq, 1); } g_async_queue_unref(jq->async_queue); jq->async_queue = NULL; li_event_clear(&jq->async_queue_watcher); li_event_clear(&jq->prepare_watcher); li_event_clear(&jq->queue_watcher); }