Loading...
Searching...
No Matches
memarray.h
1/*
2 * Copyright (C) 2018 Tobias Heider <heidert@nm.ifi.lmu.de>
3 * 2020 Koen Zandberg <koen@bergzand.net>
4 *
5 * This file is subject to the terms and conditions of the GNU Lesser
6 * General Public License v2.1. See the file LICENSE in the top level
7 * directory for more details.
8 */
9
10#pragma once
11
24#include <assert.h>
25#include <stdint.h>
26#include <stddef.h>
27#include <string.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
36typedef struct {
37 void *free_data;
38 size_t size;
40
51
65void memarray_init(memarray_t *mem, void *data, size_t size, size_t num);
66
79static inline void *memarray_alloc(memarray_t *mem)
80{
81 assert(mem != NULL);
82
83 void *free = mem->free_data;
84 if (free) {
85 mem->free_data = *((void **)mem->free_data);
86 }
87 return free;
88}
89
100static inline void *memarray_calloc(memarray_t *mem)
101{
102 void *new = memarray_alloc(mem);
103 if (new) {
104 memset(new, 0, mem->size);
105 }
106 return new;
107}
108
118static inline void memarray_free(memarray_t *mem, void *ptr)
119{
120 assert((mem != NULL) && (ptr != NULL));
121
122 memcpy(ptr, &mem->free_data, sizeof(void *));
123 mem->free_data = ptr;
124}
125
141void memarray_extend(memarray_t *mem, void *data, size_t num);
142
153int memarray_reduce(memarray_t *mem, void *data, size_t num);
154
163
164#ifdef __cplusplus
165}
166#endif
167
168
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Definition assert.h:135
void free(void *ptr)
This is a no-op.
static void * memarray_alloc(memarray_t *mem)
Allocate memory chunk in memarray pool.
Definition memarray.h:79
void memarray_init(memarray_t *mem, void *data, size_t size, size_t num)
Initialize memarray pool with free list.
size_t memarray_available(memarray_t *mem)
Returns the number of blocks available.
static void * memarray_calloc(memarray_t *mem)
Allocate and clear memory chunk in memarray pool.
Definition memarray.h:100
int memarray_reduce(memarray_t *mem, void *data, size_t num)
Reduce the memarray space, subtracting the memory pool.
static void memarray_free(memarray_t *mem, void *ptr)
Free memory chunk in memarray pool.
Definition memarray.h:118
struct memarray_element memarray_element_t
Memory pool element.
void memarray_extend(memarray_t *mem, void *data, size_t num)
Extend the memarray with a new memory region.
Memory pool element.
Definition memarray.h:48
struct memarray_element * next
Pointer to the next element.
Definition memarray.h:49
Memory pool.
Definition memarray.h:36
void * free_data
memory pool data / head of the free list
Definition memarray.h:37
size_t size
size of single list element
Definition memarray.h:38