Skip to content

Instantly share code, notes, and snippets.

@rlapz
Last active April 7, 2024 17:28
Show Gist options
  • Select an option

  • Save rlapz/008e3856a1c85f4ceadcd35ef30341fa to your computer and use it in GitHub Desktop.

Select an option

Save rlapz/008e3856a1c85f4ceadcd35ef30341fa to your computer and use it in GitHub Desktop.
memory pool: fast allocate & deallocate a single item memory
#include <errno.h>
#include "mempool.h"
int
mempool_init(MemPool *m, size_t nmemb, size_t size)
{
m->nmemb = nmemb;
m->head = NULL;
for (size_t i = 0; i < size; i++) {
MemPoolNode *const node = malloc(sizeof(MemPoolNode) * nmemb);
if (node == NULL)
goto err;
node->next = m->head;
m->head = node;
}
return 0;
err:
mempool_deinit(m);
return -ENOMEM;
}
void
mempool_deinit(MemPool *m)
{
MemPoolNode *head = m->head;
while (head != NULL) {
MemPoolNode *const next = head->next;
free(head);
head = next;
}
m->head = NULL;
}
void *
mempool_alloc(MemPool *m)
{
MemPoolNode *head = m->head;
if (head != NULL) {
m->head = head->next;
} else {
head = malloc(sizeof(MemPoolNode) * m->nmemb);
if (head == NULL)
return NULL;
}
return &head->data;
}
void
mempool_reserve(MemPool *m, void *mem)
{
// not tested yet!
const typeof(((MemPoolNode *)0)->data) *ptr = mem;
MemPoolNode *const node = (MemPoolNode *)(((char *)ptr) - offsetof(MemPoolNode, data));
//MemPoolNode *const node = (MemPoolNode *)(((char *)mem) - sizeof(MemPoolNode));
node->next = m->head;
m->head = node;
}
void
mempool_free(MemPool *m, void *mem)
{
(void)m;
MemPoolNode *const node = (MemPoolNode *)(((char *)mem) - sizeof(MemPoolNode));
free(node);
}
#ifndef __MEMPOOL_H__
#define __MEMPOOL_H__
#include <stdlib.h>
typedef struct mempool_node {
struct mempool_node *next;
char data[];
} MemPoolNode;
typedef struct {
size_t nmemb;
MemPoolNode *head;
} MemPool;
int mempool_init(MemPool *m, size_t nmemb, size_t size);
void mempool_deinit(MemPool *m);
void *mempool_alloc(MemPool *m);
void mempool_reserve(MemPool *m, void *mem);
void mempool_free(MemPool *m, void *mem);
#endif
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment