32#if defined(__cplusplus) && defined(_WIN32)
34using std::atomic_size_t;
46#define BUFFER_POOL_MAX_BYTES (337 * 1024 * 1024)
49#define BUFFER_POOL_SHRINK_DELAY_MS 5000
52#define BUFFER_POOL_MIN_SIZE 64
55#define BUFFER_POOL_MAX_SINGLE_SIZE (4 * 1024 * 1024)
58#define BUFFER_POOL_MAGIC 0xBF00B001U
60#define BUFFER_POOL_MAGIC_FALLBACK 0xBF00FA11U
177#define POOL_ALLOC(size) buffer_pool_alloc(NULL, (size))
178#define POOL_FREE(data, size) buffer_pool_free(NULL, (data), (size))
buffer_pool_t * buffer_pool_get_global(void)
struct buffer_pool buffer_pool_t
Unified buffer pool with lock-free fast path.
void buffer_pool_shrink(buffer_pool_t *pool)
Force shrink the pool (free old unused buffers)
void buffer_pool_destroy(buffer_pool_t *pool)
Destroy a buffer pool and free all memory.
void buffer_pool_cleanup_global(void)
void buffer_pool_log_stats(buffer_pool_t *pool, const char *name)
Log pool statistics.
void buffer_pool_free(buffer_pool_t *pool, void *data, size_t size)
Free a buffer back to the pool (lock-free)
buffer_pool_t * buffer_pool_create(size_t max_bytes, uint64_t shrink_delay_ms)
Create a new buffer pool.
void buffer_pool_get_stats(buffer_pool_t *pool, size_t *current_bytes, size_t *used_bytes, size_t *free_bytes)
Get pool statistics (atomic reads)
void * buffer_pool_alloc(buffer_pool_t *pool, size_t size)
Allocate a buffer from the pool (lock-free fast path)
void buffer_pool_init_global(void)
struct buffer_node buffer_node_t
Node header embedded before user data.
unsigned long long uint64_t
Cross-platform mutex interface for ascii-chat.
Node header embedded before user data.
uint32_t _pad
Padding for alignment.
uint32_t magic
Magic to identify pooled buffers.
size_t size
Size of user data portion.
_Atomic(uint64_t) returned_at_ms
Timestamp when returned to free list.
struct buffer_pool * pool
Owning pool (for free)
_Atomic(struct buffer_node *) next
Next in free list (atomic for lock-free)
Unified buffer pool with lock-free fast path.
size_t max_bytes
Maximum total bytes allowed.
_Atomic(uint64_t) hits
Allocations from free list.
_Atomic(size_t) peak_pool_bytes
Peak bytes in pool.
_Atomic(size_t) peak_bytes
Peak bytes in use.
mutex_t shrink_mutex
Only used for shrinking.
uint64_t shrink_delay_ms
Time before unused buffers freed.
_Atomic(size_t) current_bytes
Total bytes in pool.
_Atomic(size_t) used_bytes
Bytes currently in use.
_Atomic(buffer_node_t *) free_list
Lock-free stack of available buffers.
_Atomic(uint64_t) shrink_freed
Buffers freed by shrink.
_Atomic(uint64_t) returns
Buffers returned to free list.
_Atomic(uint64_t) malloc_fallbacks
Allocations that bypassed pool.
_Atomic(uint64_t) allocs
New buffer allocations.