42 static uint32_t flow_spare_pool_flow_cnt = 0;
43 static uint32_t flow_spare_pool_block_size = 100;
51 size = flow_spare_pool_flow_cnt;
68 for (uint32_t i = p->
queue.
len; i < flow_spare_pool_block_size; i++)
79 static void Validate(
FlowSparePool *top,
const uint32_t target)
96 assert(cnt == target);
103 if (flow_spare_pool == NULL) {
104 flow_spare_pool = FlowSpareGetPool();
109 if (flow_spare_pool->
queue.
len >= flow_spare_pool_block_size) {
112 p->
next = flow_spare_pool;
117 flow_spare_pool_flow_cnt++;
130 if (flow_spare_pool == NULL || flow_spare_pool_flow_cnt == 0) {
137 if (flow_spare_pool->
queue.
len >= flow_spare_pool_block_size || flow_spare_pool->
next == NULL) {
139 flow_spare_pool = p->
next;
141 flow_spare_pool_flow_cnt -= p->
queue.
len;
143 Validate(flow_spare_pool, flow_spare_pool_flow_cnt);
151 }
else if (flow_spare_pool->
next != NULL) {
155 flow_spare_pool_flow_cnt -= p->
queue.
len;
157 Validate(flow_spare_pool, flow_spare_pool_flow_cnt);
175 uint32_t to_remove = (uint32_t)(todo * -1) / 10;
177 if (to_remove < flow_spare_pool_block_size)
184 flow_spare_pool = p->
next;
185 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;