13void pc_sockpool_init(SockPool *p, SockSlot *slots,
size_t n)
21 for (
size_t i = 0; i < p->n; i++)
23 p->slots[i].in_use =
false;
25 p->slots[i].last_used = 0;
29SockAcq pc_sockpool_acquire(SockPool *p, uint32_t
id, uint32_t now,
size_t *idx, uint32_t *evicted_id)
31 if (!p || !p->slots || p->n == 0)
33 return SockAcq::SOCK_ACQ_FAIL;
37 for (
size_t i = 0; i < p->n; i++)
39 if (!p->slots[i].in_use)
41 p->slots[i].in_use =
true;
43 p->slots[i].last_used = now;
48 return SockAcq::SOCK_ACQ_FREE;
54 for (
size_t i = 1; i < p->n; i++)
56 if (p->slots[i].last_used < p->slots[lru].last_used)
63 *evicted_id = p->slots[lru].id;
65 p->slots[lru].id = id;
66 p->slots[lru].last_used = now;
71 return SockAcq::SOCK_ACQ_RECYCLED;
74void pc_sockpool_touch(SockPool *p,
size_t idx, uint32_t now)
76 if (!p || !p->slots || idx >= p->n)
80 if (p->slots[idx].in_use)
82 p->slots[idx].last_used = now;
86bool pc_sockpool_release(SockPool *p,
size_t idx)
88 if (!p || !p->slots || idx >= p->n || !p->slots[idx].in_use)
92 p->slots[idx].in_use =
false;
96bool pc_sockpool_find(
const SockPool *p, uint32_t
id,
size_t *idx)
102 for (
size_t i = 0; i < p->n; i++)
104 if (p->slots[i].in_use && p->slots[i].id ==
id)
116size_t pc_sockpool_in_use(
const SockPool *p)
123 for (
size_t i = 0; i < p->n; i++)
125 if (p->slots[i].in_use)
Dynamic socket recycling: an LRU connection-slot pool (PC_ENABLE_SOCKPOOL).