43 static uint32_t flow_spare_pool_flow_cnt = 0;
44 static uint32_t flow_spare_pool_block_size = 100;
52 size = flow_spare_pool_flow_cnt;
69 for (uint32_t i = p->
queue.
len; i < flow_spare_pool_block_size; i++)
80 static void Validate(
FlowSparePool *top,
const uint32_t target)
97 assert(cnt == target);
104 if (flow_spare_pool == NULL) {
105 flow_spare_pool = FlowSpareGetPool();
110 if (flow_spare_pool->
queue.
len >= flow_spare_pool_block_size) {
113 p->
next = flow_spare_pool;
118 flow_spare_pool_flow_cnt++;
131 if (flow_spare_pool == NULL || flow_spare_pool_flow_cnt == 0) {
138 if (flow_spare_pool->
queue.
len >= flow_spare_pool_block_size || flow_spare_pool->
next == NULL) {
140 flow_spare_pool = p->
next;
142 flow_spare_pool_flow_cnt -= p->
queue.
len;
144 Validate(flow_spare_pool, flow_spare_pool_flow_cnt);
152 }
else if (flow_spare_pool->
next != NULL) {
156 flow_spare_pool_flow_cnt -= p->
queue.
len;
158 Validate(flow_spare_pool, flow_spare_pool_flow_cnt);
176 uint32_t to_remove = (uint32_t)(todo * -1) / 10;
178 if (to_remove < flow_spare_pool_block_size)
185 flow_spare_pool = p->
next;
186 flow_spare_pool_flow_cnt -= p->
queue.
len;
199 }
else if (todo > 0) {
202 uint32_t blocks = ((uint32_t)todo / flow_spare_pool_block_size) + 1;
204 uint32_t flow_cnt = 0;
205 for (uint32_t cnt = 0; cnt < blocks; cnt++) {
210 const bool ok = FlowSparePoolUpdateBlock(p);
227 if (flow_spare_pool == NULL) {
228 flow_spare_pool =
head;
229 }
else if (
tail != NULL) {
237 flow_spare_pool_flow_cnt += flow_cnt;
239 Validate(flow_spare_pool, flow_spare_pool_flow_cnt);
254 FlowSparePoolUpdateBlock(p);
258 p->
next = flow_spare_pool;
260 flow_spare_pool_flow_cnt = cnt;
275 flow_spare_pool_flow_cnt -= cnt;
280 flow_spare_pool = NULL;