Beispiel #1
0
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);
}
Beispiel #2
0
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);
}
Beispiel #3
0
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;
		}
	}
}
Beispiel #4
0
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);
}
Beispiel #5
0
static void core_throttle_pool_free(liServer *srv, gpointer param) {
	liThrottlePool *pool = param;

	li_throttle_pool_release(pool, srv);
}