docs/Writerside/topics/mempool.h.md

Fri, 07 Feb 2025 17:55:28 +0100

author
Mike Becker <universe@uap-core.de>
date
Fri, 07 Feb 2025 17:55:28 +0100
branch
docs/3.1
changeset 1168
d92124c8db73
parent 1146
151c057faf7c
permissions
-rw-r--r--

add mempool documentation

relates to #451

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Memory Pool
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 A memory pool is providing an allocator implementation that automatically deallocates the memory upon its destruction.
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 It also allows you to register destructor functions for the allocated memory, which are automatically called before
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 the memory is deallocated.
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
6
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
7 Additionally, you may also register _independent_ destructor functions.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
8 This can be useful, for example, when some library allocates memory that you wish to destroy when the memory pool gets destroyed.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
9
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
10 A memory pool can be used with all UCX features that support the use of an [allocator](allocator.h.md).
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
11 For example, the UCX [string](string.h.md) functions provide several variants suffixed with `_a` for that purpose.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
12
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
13 ## Overview
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
14
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
15 ```C
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
16 CxMempool *cxMempoolCreate(size_t capacity, cx_destructor_func fnc);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
17
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
18 CxMempool *cxMempoolCreateSimple(size_t capacity);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
19
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
20 void cxMempoolFree(CxMempool *pool);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
21
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
22 void cxMempoolSetDestructor(void *memory, cx_destructor_func fnc);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
23
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
24 void cxMempoolRemoveDestructor(void *memory);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
25
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
26 int cxMempoolRegister(CxMempool *pool, void *memory,
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
27 cx_destructor_func fnc);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
28 ```
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
29
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
30 ## Description
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
32 A memory pool is created with the `cxMempoolCreate()` function with a default `capacity`
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
33 and an optional default destructor function `fnc`.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
34 If specified, the default destructor function is registered for all freshly allocated memory within the pool,
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
35 as if `cxMempoolSetDestructor()` was called immediately after allocation.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
36 When you set `fnc` is to `NULL` during pool creation, or use `cxMempoolCreateSimple`, no default destructor is registered.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
37
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
38 After creating a memory pool `CxMempool *mpool`, you can access the provided allocator via `mpool->allocator`.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
39
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
40 The functions `cxMempoolSetDestructor()` and `cxMempoolRemoveDestructor()` can be used to assign a specific destructor
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
41 function to an allocated object or remove any assigned destructor function, respectively.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
42 The `memory` pointer points to the allocated object, which must have been allocated by any `CxMempool`'s provided allocator.
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
44 The `cxMempoolRegister()` function allocates a new wrapper object for `memory` with `pool`'s allocator that
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
45 will call the specified destructor function when destroyed.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
46 Usually this function returns zero except for platforms where memory allocations are likely to fail,
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
47 in which case a non-zero value is returned.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
48
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
49 ## Order of Destruction
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
50
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
51 When you call `cxMempoolFree()` the following actions are performed:
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
52
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
53 1. In any order, for each object in the pool
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
54 1. the destructor function assigned to that object is called
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
55 2. the object's memory is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
56 2. The pool memory is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
57 3. The pool structure is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
58
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
59 ## Example
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
60
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
61 The following code illustrates how the contents of a CSV file are read into pooled memory.
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 ```C
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 #include <stdio.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 #include <cx/mempool.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 #include <cx/linked_list.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 #include <cx/string.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 #include <cx/buffer.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 #include <cx/utils.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 typedef struct {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 cxstring column_a;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 cxstring column_b;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 cxstring column_c;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 } CSVData;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 int main(void) {
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
77 // create a simple pool for various different objects
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
78 CxMempool* pool = cxMempoolCreateSimple(128);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 FILE *f = fopen("test.csv", "r");
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
81 if (f == NULL) {
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 perror("Cannot open file");
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 // close the file automatically at pool destruction
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86 cxMempoolRegister(pool, f, (cx_destructor_func) fclose);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 // create a buffer using the memory pool for destruction
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
89 CxBuffer *content = cxBufferCreate(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
90 NULL, 256, pool->allocator, CX_BUFFER_AUTO_EXTEND
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
91 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 // read the file into the buffer and turn it into a string
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
94 cx_stream_copy(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
95 f, content, (cx_read_func) fread, cxBufferWriteFunc
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
96 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 fclose(f);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 cxstring contentstr = cx_strn(content->space, content->size);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
100 // split the string into lines
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
101 // use the memory pool to allocate the target array
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 cxstring* lines;
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
103 size_t lc = cx_strsplit_a(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
104 pool->allocator, contentstr, cx_str("\n"), SIZE_MAX, &lines
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
105 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 // skip the header and parse the remaining data into a linked list
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
108 // the nodes of the list shall also be allocated by the pool
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
109 CxList* datalist = cxLinkedListCreate(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
110 pool->allocator, NULL, sizeof(CSVData)
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
111 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 for (size_t i = 1 ; i < lc ; i++) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 if (lines[i].length == 0) continue;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 cxstring fields[3];
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
115 size_t fc = cx_strsplit(lines[i], cx_str(";"), 3, fields);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 if (fc != 3) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
117 fprintf(stderr, "Syntax error in line %zu.\n", i);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118 cxMempoolFree(pool);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
121 CSVData data;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
122 data.column_a = fields[0];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
123 data.column_b = fields[1];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 data.column_c = fields[2];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 cxListAdd(datalist, &data);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128 // iterate through the list and output the data
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129 CxIterator iter = cxListIterator(datalist);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 cx_foreach(CSVData*, data, iter) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
131 printf("Column A: %.*s | "
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132 "Column B: %.*s | "
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
133 "Column C: %.*s\n",
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134 (int)data->column_a.length, data->column_a.ptr,
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
135 (int)data->column_b.length, data->column_b.ptr,
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
136 (int)data->column_c.length, data->column_c.ptr
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
137 );
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140 // cleanup everything, no manual free() needed
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141 cxMempoolFree(pool);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143 return 0;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145 ```
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
146
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
147 <seealso>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
148 <category ref="apidoc">
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
149 <a href="https://ucx.sourceforge.io/api/mempool_8h.html">mempool.h</a>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
150 </category>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
151 </seealso>

mercurial