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 destroy_expired(h2o_socketpool_t *pool) { /* caller should lock the mutex */ uint64_t expire_before = h2o_now(pool->_interval_cb.loop) - pool->timeout; while (!h2o_linklist_is_empty(&pool->_shared.sockets)) { struct pool_entry_t *entry = H2O_STRUCT_FROM_MEMBER(struct pool_entry_t, link, pool->_shared.sockets.next); if (entry->added_at > expire_before) break; destroy_attached(entry); __sync_sub_and_fetch(&pool->_shared.count, 1); } }
void h2o_socketpool_dispose(h2o_socketpool_t *pool) { 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, 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->_interval_cb.loop != NULL) { h2o_timeout_unlink(&pool->_interval_cb.entry); h2o_timeout_dispose(pool->_interval_cb.loop, &pool->_interval_cb.timeout); } if (pool->peer.is_named) free(pool->peer.named.host.base); }
void h2o_socketpool_dispose(h2o_socketpool_t *pool) { 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, 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->_interval_cb.loop != NULL) { h2o_timeout_unlink(&pool->_interval_cb.entry); h2o_timeout_dispose(pool->_interval_cb.loop, &pool->_interval_cb.timeout); } free(pool->peer.host.base); switch (pool->type) { case H2O_SOCKETPOOL_TYPE_NAMED: free(pool->peer.named_serv.base); break; case H2O_SOCKETPOOL_TYPE_SOCKADDR: break; } }