11#if DETWS_ENABLE_SOCKPOOL
13void detws_sockpool_init(SockPool *p, SockSlot *slots,
size_t n)
19 for (
size_t i = 0; i < p->n; i++)
21 p->slots[i].in_use =
false;
23 p->slots[i].last_used = 0;
27SockAcq detws_sockpool_acquire(SockPool *p, uint32_t
id, uint32_t now,
size_t *idx, uint32_t *evicted_id)
29 if (!p || !p->slots || p->n == 0)
30 return SockAcq::SOCK_ACQ_FAIL;
33 for (
size_t i = 0; i < p->n; i++)
35 if (!p->slots[i].in_use)
37 p->slots[i].in_use =
true;
39 p->slots[i].last_used = now;
42 return SockAcq::SOCK_ACQ_FREE;
48 for (
size_t i = 1; i < p->n; i++)
49 if (p->slots[i].last_used < p->slots[lru].last_used)
52 *evicted_id = p->slots[lru].id;
53 p->slots[lru].id = id;
54 p->slots[lru].last_used = now;
57 return SockAcq::SOCK_ACQ_RECYCLED;
60void detws_sockpool_touch(SockPool *p,
size_t idx, uint32_t now)
62 if (!p || !p->slots || idx >= p->n)
64 if (p->slots[idx].in_use)
65 p->slots[idx].last_used = now;
68bool detws_sockpool_release(SockPool *p,
size_t idx)
70 if (!p || !p->slots || idx >= p->n || !p->slots[idx].in_use)
72 p->slots[idx].in_use =
false;
76bool detws_sockpool_find(
const SockPool *p, uint32_t
id,
size_t *idx)
80 for (
size_t i = 0; i < p->n; i++)
81 if (p->slots[i].in_use && p->slots[i].id ==
id)
90size_t detws_sockpool_in_use(
const SockPool *p)
95 for (
size_t i = 0; i < p->n; i++)
96 if (p->slots[i].in_use)
Dynamic socket recycling: an LRU connection-slot pool (DETWS_ENABLE_SOCKPOOL).