void h2o_socketpool_dispose(h2o_socketpool_t *pool) { size_t i; pthread_mutex_lock(&pool->_shared.mutex); while (!h2o_linklist_is_empty(&pool->_shared.sockets)) { struct pool_entry_t *entry = H2O_STRUCT_FROM_MEMBER(struct pool_entry_t, all_link, pool->_shared.sockets.next); destroy_attached(entry); __sync_sub_and_fetch(&pool->_shared.count, 1); } pthread_mutex_unlock(&pool->_shared.mutex); pthread_mutex_destroy(&pool->_shared.mutex); if (pool->balancer != NULL) { pool->balancer->callbacks->destroy(pool->balancer); } if (pool->_ssl_ctx != NULL) SSL_CTX_free(pool->_ssl_ctx); if (pool->_interval_cb.loop != NULL) h2o_socketpool_unregister_loop(pool, pool->_interval_cb.loop); for (i = 0; i < pool->targets.size; i++) { h2o_socketpool_destroy_target(pool->targets.entries[i]); } free(pool->targets.entries); }
static void on_context_dispose(h2o_handler_t *_self, h2o_context_t *ctx) { struct rp_handler_t *self = (void *)_self; struct rp_handler_context_t *handler_ctx = h2o_context_get_handler_context(ctx, &self->super); if (handler_ctx->client_ctx != NULL) free(handler_ctx->client_ctx); h2o_socketpool_unregister_loop(self->sockpool, ctx->loop); }