static void free_ip_pool(liServer *srv, throttle_ip_pools *pools, liSocketAddress *remote_addr) { refcounted_pool_entry *entry; switch (remote_addr->addr->plain.sa_family) { case AF_INET: case AF_INET6: break; default: return; } g_mutex_lock(pools->lock); if (remote_addr->addr->plain.sa_family == AF_INET) { entry = li_radixtree_lookup_exact(pools->ipv4_pools, &remote_addr->addr->ipv4.sin_addr.s_addr, pools->masklen_ipv4); } else { entry = li_radixtree_lookup_exact(pools->ipv6_pools, &remote_addr->addr->ipv6.sin6_addr.s6_addr, pools->masklen_ipv6); } LI_FORCE_ASSERT(NULL != entry); LI_FORCE_ASSERT(g_atomic_int_get(&entry->refcount) > 0); if (g_atomic_int_dec_and_test(&entry->refcount)) { if (remote_addr->addr->plain.sa_family == AF_INET) { li_radixtree_remove(pools->ipv4_pools, &remote_addr->addr->ipv4.sin_addr.s_addr, pools->masklen_ipv4); } else { li_radixtree_remove(pools->ipv6_pools, &remote_addr->addr->ipv6.sin6_addr.s6_addr, pools->masklen_ipv6); } li_throttle_pool_release(entry->pool, srv); g_slice_free(refcounted_pool_entry, entry); } g_mutex_unlock(pools->lock); ip_pools_free(pools); }
static void throttle_prepare(liServer *srv, gpointer data, gboolean aborted) { liThrottlePool *pool = data; if (!aborted) { guint i, len = srv->worker_count; pool->workers = g_slice_alloc0(sizeof(liThrottlePoolWorkerState) * len); for (i = 0; i < len; ++i) { liThrottlePoolWorkerState *pwstate = &pool->workers[i]; pwstate->last_rearm = pool->last_rearm; pwstate->magazine = pool->burst / len; } } li_throttle_pool_release(pool, srv); }
void li_throttle_remove_pool(liWorker *wrk, liThrottleState *state, liThrottlePool *pool) { guint i, len; assert(NULL != wrk); if (NULL == state || NULL == pool) return; for (i = 0, len = state->pools->len; i < len; ++i) { liThrottlePoolState *pstate = g_ptr_array_index(state->pools, i); if (pstate->pool == pool) { throttle_unregister(&pool->workers[wrk->ndx], pstate); g_ptr_array_remove_index_fast(state->pools, i); li_throttle_pool_release(pool, wrk->srv); g_slice_free(liThrottlePoolState, pstate); return; } } }
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); }
static void core_throttle_pool_free(liServer *srv, gpointer param) { liThrottlePool *pool = param; li_throttle_pool_release(pool, srv); }