Last active
April 7, 2024 17:28
-
-
Save rlapz/008e3856a1c85f4ceadcd35ef30341fa to your computer and use it in GitHub Desktop.
memory pool: fast allocate & deallocate a single item memory
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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); | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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