static void delete_channel(ChannelNP * c) { trace(LOG_PROTOCOL, "Deleting channel %#lx", c); assert(c->lock_cnt == 0); assert(c->out_flush_cnt == 0); assert(c->magic == CHANNEL_MAGIC); assert(c->read_pending == 0); assert(c->ibuf.handling_msg != HandleMsgTriggered); channel_clear_broadcast_group(&c->chan); if (c->np_socket >= 0) { nopoll_conn_close(c->np_socket); c->np_socket = NULL; } list_remove(&c->chan.chanlink); if (list_is_empty(&channel_root) && list_is_empty(&channel_server_root)) shutdown_set_stopped(&channel_shutdown); c->magic = 0; #if ENABLE_OutputQueue output_queue_clear(&c->out_queue); #endif /* ENABLE_OutputQueue */ #if ENABLE_Splice close(c->pipefd[0]); close(c->pipefd[1]); #endif /* ENABLE_Splice */ output_queue_free_obuf(c->obuf); loc_free(c->ibuf.buf); loc_free(c->chan.peer_name); loc_free(c); }
static void worker_thread_exit(void * x) { WorkerThread * wt = (WorkerThread *)x; check_error(pthread_cond_destroy(&wt->cond)); pthread_join(wt->thread, NULL); check_error(pthread_mutex_lock(&wtlock)); if (--wtrunning_count == 0) shutdown_set_stopped(&async_shutdown); trace(LOG_ASYNCREQ, "worker_thread_exit %p running threads %d", wt, wtrunning_count); check_error(pthread_mutex_unlock(&wtlock)); loc_free(wt); }
static void server_close(ChannelServer * serv) { ServerNP * s = server2np(serv); assert(is_dispatch_thread()); if (s->sock < 0) return; list_remove(&s->serv.servlink); if (list_is_empty(&channel_root) && list_is_empty(&channel_server_root)) shutdown_set_stopped(&channel_shutdown); list_remove(&s->servlink); peer_server_free(s->serv.ps); nopoll_conn_close(s->np_sock); nopoll_ctx_unref(s->np_ctx); s->sock = -1; }
static void delete_channel(ChannelPIPE * c) { trace(LOG_PROTOCOL, "Deleting channel %#lx", c); assert(c->lock_cnt == 0); assert(c->out_flush_cnt == 0); assert(c->magic == CHANNEL_MAGIC); assert(c->read_pending == 0); assert(c->ibuf.handling_msg != HandleMsgTriggered); assert(output_queue_is_empty(&c->out_queue)); output_queue_clear(&c->out_queue); channel_clear_broadcast_group(&c->chan); close_input_pipe(c); list_remove(&c->chan.chanlink); if (list_is_empty(&channel_root) && list_is_empty(&channel_server_root)) shutdown_set_stopped(&channel_shutdown); c->magic = 0; loc_free(c->ibuf.buf); loc_free(c->chan.peer_name); loc_free(c); }