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);
177 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;
198 }
else if (todo > 0) {
201 uint32_t blocks = ((uint32_t)todo / flow_spare_pool_block_size) + 1;
203 uint32_t flow_cnt = 0;
204 for (uint32_t cnt = 0; cnt < blocks; cnt++) {
209 const bool ok = FlowSparePoolUpdateBlock(p);
226 if (flow_spare_pool == NULL) {
227 flow_spare_pool =
head;
228 }
else if (
tail != NULL) {
236 flow_spare_pool_flow_cnt += flow_cnt;
238 Validate(flow_spare_pool, flow_spare_pool_flow_cnt);
253 FlowSparePoolUpdateBlock(p);
257 p->
next = flow_spare_pool;
259 flow_spare_pool_flow_cnt = cnt;
274 flow_spare_pool_flow_cnt -= cnt;
279 flow_spare_pool = NULL;