docs/Writerside/topics/mempool.h.md

Sun, 09 Feb 2025 22:03:52 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 09 Feb 2025 22:03:52 +0100
branch
docs/3.1
changeset 1174
ee473780cc0d
parent 1168
d92124c8db73
permissions
-rw-r--r--

add missing documentation about what header to include

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
1174
ee473780cc0d add missing documentation about what header to include
Mike Becker <universe@uap-core.de>
parents: 1168
diff changeset
16 #include <cx/mempool.h>
ee473780cc0d add missing documentation about what header to include
Mike Becker <universe@uap-core.de>
parents: 1168
diff changeset
17
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
18 CxMempool *cxMempoolCreate(size_t capacity, cx_destructor_func fnc);
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 CxMempool *cxMempoolCreateSimple(size_t capacity);
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 cxMempoolFree(CxMempool *pool);
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 cxMempoolSetDestructor(void *memory, cx_destructor_func fnc);
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 void cxMempoolRemoveDestructor(void *memory);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
27
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
28 int cxMempoolRegister(CxMempool *pool, void *memory,
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
29 cx_destructor_func fnc);
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
30 ```
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
31
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
32 ## Description
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
34 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
35 and an optional default destructor function `fnc`.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
36 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
37 as if `cxMempoolSetDestructor()` was called immediately after allocation.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
38 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
39
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
40 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
41
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
42 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
43 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
44 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
45
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
46 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
47 will call the specified destructor function when destroyed.
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
48 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
49 in which case a non-zero value is returned.
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 ## Order of Destruction
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 When you call `cxMempoolFree()` the following actions are performed:
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
54
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
55 1. In any order, for each object in the pool
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
56 1. the destructor function assigned to that object is called
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
57 2. the object's memory is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
58 2. The pool memory is deallocated
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
59 3. The pool structure is deallocated
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 ## Example
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
62
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
63 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
64 ```C
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 #include <stdio.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 #include <cx/mempool.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 #include <cx/linked_list.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 #include <cx/string.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 #include <cx/buffer.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 #include <cx/utils.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 typedef struct {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 cxstring column_a;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 cxstring column_b;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 cxstring column_c;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 } CSVData;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 int main(void) {
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
79 // create a simple pool for various different objects
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
80 CxMempool* pool = cxMempoolCreateSimple(128);
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 FILE *f = fopen("test.csv", "r");
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
83 if (f == NULL) {
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 perror("Cannot open file");
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 // close the file automatically at pool destruction
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 cxMempoolRegister(pool, f, (cx_destructor_func) fclose);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 // create a buffer using the memory pool for destruction
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
91 CxBuffer *content = cxBufferCreate(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
92 NULL, 256, pool->allocator, CX_BUFFER_AUTO_EXTEND
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
93 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 // 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
96 cx_stream_copy(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
97 f, content, (cx_read_func) fread, cxBufferWriteFunc
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
98 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 fclose(f);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 cxstring contentstr = cx_strn(content->space, content->size);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
102 // split the string into lines
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
103 // use the memory pool to allocate the target array
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
104 cxstring* lines;
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
105 size_t lc = cx_strsplit_a(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
106 pool->allocator, contentstr, cx_str("\n"), SIZE_MAX, &lines
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
107 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 // 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
110 // 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
111 CxList* datalist = cxLinkedListCreate(
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
112 pool->allocator, NULL, sizeof(CSVData)
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
113 );
1141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 for (size_t i = 1 ; i < lc ; i++) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 if (lines[i].length == 0) continue;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 cxstring fields[3];
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
117 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
118 if (fc != 3) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 fprintf(stderr, "Syntax error in line %zu.\n", i);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 cxMempoolFree(pool);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
121 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
122 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
123 CSVData data;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 data.column_a = fields[0];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 data.column_b = fields[1];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 data.column_c = fields[2];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127 cxListAdd(datalist, &data);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 // iterate through the list and output the data
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
131 CxIterator iter = cxListIterator(datalist);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132 cx_foreach(CSVData*, data, iter) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
133 printf("Column A: %.*s | "
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134 "Column B: %.*s | "
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
135 "Column C: %.*s\n",
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
136 (int)data->column_a.length, data->column_a.ptr,
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
137 (int)data->column_b.length, data->column_b.ptr,
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 (int)data->column_c.length, data->column_c.ptr
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 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142 // cleanup everything, no manual free() needed
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143 cxMempoolFree(pool);
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 return 0;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
146 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
147 ```
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148
1168
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
149 <seealso>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
150 <category ref="apidoc">
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
151 <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
152 </category>
d92124c8db73 add mempool documentation
Mike Becker <universe@uap-core.de>
parents: 1146
diff changeset
153 </seealso>

mercurial