← Back to C-Kernel-Engine Docs Doxygen Source Documentation
memory_pool.c File Reference
#include "tokenizer/memory_pool.h"
#include <stdlib.h>
#include <string.h>

Go to the source code of this file.

Functions

static size_t align_up (size_t n, size_t align)
 
void * ck_tokenizer_mempool_alloc (CKTokenizerMemPool *pool, size_t size)
 
void * ck_tokenizer_mempool_alloc_aligned (CKTokenizerMemPool *pool, size_t size, size_t align)
 
size_t ck_tokenizer_mempool_available (CKTokenizerMemPool *pool)
 
void ck_tokenizer_mempool_free (CKTokenizerMemPool *pool)
 
int ck_tokenizer_mempool_init (CKTokenizerMemPool *pool, size_t size)
 
void ck_tokenizer_mempool_reset (CKTokenizerMemPool *pool)
 
char * ck_tokenizer_mempool_strdup (CKTokenizerMemPool *pool, const char *str)
 
char * ck_tokenizer_mempool_strndup (CKTokenizerMemPool *pool, const char *str, int len)
 
size_t ck_tokenizer_mempool_used (CKTokenizerMemPool *pool)
 

Function Documentation

◆ align_up()

static size_t align_up ( size_t  n,
size_t  align 
)
static

Definition at line 37 of file memory_pool.c.

37  {
38  return (n + align - 1) & ~(align - 1);
39 }

Referenced by ck_tokenizer_mempool_alloc(), and ck_tokenizer_mempool_alloc_aligned().

◆ ck_tokenizer_mempool_alloc()

void* ck_tokenizer_mempool_alloc ( CKTokenizerMemPool pool,
size_t  size 
)

Allocate from pool.

Parameters
poolPool to allocate from
sizeSize in bytes
Returns
Pointer to allocated memory, or NULL on error

Definition at line 41 of file memory_pool.c.

41  {
42  if (!pool || !pool->memory || size == 0) {
43  return NULL;
44  }
45 
46  size = align_up(size, pool->alignment);
47 
48  if (pool->used + size > pool->size) {
49  return NULL;
50  }
51 
52  void *ptr = pool->memory + pool->used;
53  pool->used += size;
54 
55  return ptr;
56 }
static size_t align_up(size_t n, size_t align)
Definition: memory_pool.c:37

References align_up(), CKTokenizerMemPool::alignment, CKTokenizerMemPool::memory, CKTokenizerMemPool::size, and CKTokenizerMemPool::used.

Referenced by ck_tokenizer_mempool_strndup().

◆ ck_tokenizer_mempool_alloc_aligned()

void* ck_tokenizer_mempool_alloc_aligned ( CKTokenizerMemPool pool,
size_t  size,
size_t  align 
)

Allocate aligned memory from pool.

Parameters
poolPool to allocate from
sizeSize in bytes
alignAlignment (must be power of 2)
Returns
Pointer to allocated memory, or NULL on error

Definition at line 58 of file memory_pool.c.

58  {
59  if (!pool || !pool->memory || size == 0) {
60  return NULL;
61  }
62 
63  /* Validate alignment is power of 2 */
64  if (align & (align - 1)) {
65  return NULL;
66  }
67 
68  /* Align up the allocation size */
69  size = align_up(size, align);
70 
71  /* Align the current position */
72  size_t misalignment = pool->used & (align - 1);
73  size_t padding = (misalignment == 0) ? 0 : (align - misalignment);
74 
75  if (pool->used + padding + size > pool->size) {
76  return NULL;
77  }
78 
79  pool->used += padding;
80  void *ptr = pool->memory + pool->used;
81  pool->used += size;
82 
83  return ptr;
84 }

References align_up(), CKTokenizerMemPool::memory, CKTokenizerMemPool::size, and CKTokenizerMemPool::used.

◆ ck_tokenizer_mempool_available()

size_t ck_tokenizer_mempool_available ( CKTokenizerMemPool pool)

Get available bytes in pool.

Parameters
poolPool to query
Returns
Number of bytes available

Definition at line 123 of file memory_pool.c.

123  {
124  if (!pool) {
125  return 0;
126  }
127  return pool->size - pool->used;
128 }

References CKTokenizerMemPool::size, and CKTokenizerMemPool::used.

◆ ck_tokenizer_mempool_free()

void ck_tokenizer_mempool_free ( CKTokenizerMemPool pool)

Free a memory pool.

Parameters
poolPool to free

Definition at line 28 of file memory_pool.c.

28  {
29  if (pool->memory) {
30  free(pool->memory);
31  pool->memory = NULL;
32  }
33  pool->size = 0;
34  pool->used = 0;
35 }

References CKTokenizerMemPool::memory, CKTokenizerMemPool::size, and CKTokenizerMemPool::used.

Referenced by ck_tokenizer_free().

◆ ck_tokenizer_mempool_init()

int ck_tokenizer_mempool_init ( CKTokenizerMemPool pool,
size_t  size 
)

Initialize a memory pool.

Parameters
poolPool to initialize
sizePool size in bytes (0 = use default)
Returns
0 on success, -1 on error

Definition at line 11 of file memory_pool.c.

11  {
12  if (size == 0) {
14  }
15 
16  pool->memory = (char *)malloc(size);
17  if (!pool->memory) {
18  return -1;
19  }
20 
21  pool->size = size;
22  pool->used = 0;
23  pool->alignment = 8;
24 
25  return 0;
26 }
#define CK_TOKENIZER_POOL_DEFAULT_SIZE
Definition: memory_pool.h:21

References CKTokenizerMemPool::alignment, CK_TOKENIZER_POOL_DEFAULT_SIZE, CKTokenizerMemPool::memory, CKTokenizerMemPool::size, and CKTokenizerMemPool::used.

Referenced by ck_tokenizer_create().

◆ ck_tokenizer_mempool_reset()

void ck_tokenizer_mempool_reset ( CKTokenizerMemPool pool)

Reset pool (mark all memory as free).

Parameters
poolPool to reset

Definition at line 113 of file memory_pool.c.

113  {
114  if (pool) {
115  pool->used = 0;
116  }
117 }

References CKTokenizerMemPool::used.

◆ ck_tokenizer_mempool_strdup()

char* ck_tokenizer_mempool_strdup ( CKTokenizerMemPool pool,
const char *  str 
)

Allocate and copy string (strdup equivalent).

Parameters
poolPool to allocate from
strString to copy
Returns
Pointer to copied string, or NULL on error

Definition at line 86 of file memory_pool.c.

86  {
87  if (!pool || !str) {
88  return NULL;
89  }
90  return ck_tokenizer_mempool_strndup(pool, str, -1);
91 }
char * ck_tokenizer_mempool_strndup(CKTokenizerMemPool *pool, const char *str, int len)
Definition: memory_pool.c:93

References ck_tokenizer_mempool_strndup().

◆ ck_tokenizer_mempool_strndup()

char* ck_tokenizer_mempool_strndup ( CKTokenizerMemPool pool,
const char *  str,
int  len 
)

Allocate and copy string with length.

Parameters
poolPool to allocate from
strString to copy
lenLength to copy (-1 for null-terminated)
Returns
Pointer to copied string, or NULL on error

Definition at line 93 of file memory_pool.c.

93  {
94  if (!pool || !str) {
95  return NULL;
96  }
97 
98  if (len < 0) {
99  len = (int)strlen(str);
100  }
101 
102  char *copy = (char *)ck_tokenizer_mempool_alloc(pool, len + 1);
103  if (!copy) {
104  return NULL;
105  }
106 
107  memcpy(copy, str, len);
108  copy[len] = '\0';
109 
110  return copy;
111 }
void * ck_tokenizer_mempool_alloc(CKTokenizerMemPool *pool, size_t size)
Definition: memory_pool.c:41

References ck_tokenizer_mempool_alloc().

Referenced by ck_tokenizer_mempool_strdup().

◆ ck_tokenizer_mempool_used()

size_t ck_tokenizer_mempool_used ( CKTokenizerMemPool pool)

Get used bytes in pool.

Parameters
poolPool to query
Returns
Number of bytes used

Definition at line 119 of file memory_pool.c.

119  {
120  return pool ? pool->used : 0;
121 }

References CKTokenizerMemPool::used.