Thu, 22 May 2025 22:22:14 +0200
improve mempool destructor support (3/3)
documentation and final fixes
resolves #655
1143
0559812df10c
assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents:
1142
diff
changeset
|
1 | # Memory Pool |
1141 | 2 | |
3 | A memory pool is providing an allocator implementation that automatically deallocates the memory upon its destruction. | |
4 | It also allows you to register destructor functions for the allocated memory, which are automatically called before | |
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 | |
1281
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
13 | ## Basic Memory Management |
1168
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 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
18 | enum cx_mempool_type { |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
19 | CX_MEMPOOL_TYPE_SIMPLE, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
20 | CX_MEMPOOL_TYPE_ADVANCED, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
21 | CX_MEMPOOL_TYPE_PURE, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
22 | }; |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
23 | |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
24 | CxMempool *cxMempoolCreate(size_t capacity, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
25 | enum cx_mempool_type type); |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
26 | |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
27 | CxMempool *cxMempoolCreateSimple(size_t capacity); |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
28 | CxMempool *cxMempoolCreateAdvanced(size_t capacity); |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
29 | CxMempool *cxMempoolCreatePure(size_t capacity); |
1168
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 | void cxMempoolFree(CxMempool *pool); |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
32 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
33 | void cxMempoolGlobalDestructor(CxMempool *pool, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
34 | cx_destructor_func fnc); |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
35 | |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
36 | void cxMempoolGlobalDestructor2(CxMempool *pool, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
37 | cx_destructor_func2 fnc, void *data); |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
38 | |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
39 | void cxMempoolSetDestructor(void *memory, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
40 | cx_destructor_func fnc); |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
41 | |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
42 | void cxMempoolSetDestructor2(void *memory, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
43 | cx_destructor_func fnc, void *data); |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
44 | |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
45 | void cxMempoolRemoveDestructor(void *memory); |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
46 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
47 | void cxMempoolRemoveDestructor2(void *memory); |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
48 | |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
49 | int cxMempoolRegister(CxMempool *pool, void *memory, |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
50 | cx_destructor_func fnc); |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
51 | |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
52 | int cxMempoolRegister2(CxMempool *pool, void *memory, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
53 | cx_destructor_func fnc, void *data); |
1168
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 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
56 | A memory pool is created with the `cxMempoolCreate()` family of functions with a default `capacity`. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
57 | If `capacity` is set to zero, an implementation default is used. |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
58 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
59 | The `type` specifies how much additional data is allocated for each pooled memory block. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
60 | A simple pool reserves memory for an optional `cx_destructor_func`. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
61 | An advanced pool reserves memory for an optional `cx_destructor_func2` |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
62 | and an additional `data` pointer that will be passed to that destructor. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
63 | A pure pool does not reserve any additional data and therefore does not support registering |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
64 | custom destructors with the allocated memory. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
65 | |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
66 | > After creating a memory pool `CxMempool *mpool`, you can access the provided allocator via `mpool->allocator`. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
67 | >{style="note"} |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
68 | |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
69 | The functions `cxMempoolGlobalDestructor()` and `cxMempoolGlobalDestructor2()` can be used to specify destructor functions |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
70 | that shall be invoked for _all_ objects allocated by the pool when they are freed (see [](#order-of-destruction)). |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
71 | This is usually only useful for pools that will only contain objects of the same type. |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
72 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
73 | In _simple_ memory pools, the two functions `cxMempoolSetDestructor()` and `cxMempoolRemoveDestructor()` can be used to assign a specific destructor |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
74 | function to an allocated object or remove an assigned destructor function, respectively. |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
75 | The `memory` pointer points to the allocated object, which must have been allocated by any `CxMempool`'s provided allocator. |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
76 | For _advanced_ pools, the functions `cxMempoolSetDestructor2()` and `cxMempoolRemoveDestructor2()` do the same. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
77 | It is disallowed to use the functions with a pool of the wrong type and will most likely cause undefined behavior. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
78 | Pure pools do not allow setting destructors for individual memory blocks at all. |
1141 | 79 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
80 | The `cxMempoolRegister()` function allocates a new wrapper object for `memory` |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
81 | and makes the specified destructor function being called when the pool gets destroyed. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
82 | Alternatively, the `cxMempoolRegister2()` function can be used to register an advanced destructor and a pointer to custom data. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
83 | Be aware that the memory pointed to by the additional data pointer must remain valid until the pool gets destroyed! |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
84 | Usually these functions return zero except for platforms where memory allocations are likely to fail, |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
85 | in which case a non-zero value is returned. |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
86 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
87 | > When you register foreign memory with a pool, you can decide which destructor type you want to use, |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
88 | > regardless of the pool's type. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
89 | > That means, for example, you can use `cxMempoolReigster2()` for simple pools, `cxMempoolRegister()` for pure pools, etc. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
90 | > |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
91 | > When you use `cxMempoolReigster2()` the `data` pointer must not be `NULL` or the behavior will be undefined when the pool gets destroyed. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
92 | |
1281
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
93 | ### Order of Destruction |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
94 | |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
95 | When you call `cxMempoolFree()` the following actions are performed: |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
96 | |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
97 | 1. In any order, for each object allocated by the pool |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
98 | 1. the destructor function assigned to that object is called |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
99 | 2. the pool's global simple destructor is called |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
100 | 3. the pool's global advanced destructor is called |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
101 | 4. the object's memory is deallocated |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
102 | 2. In any order, for each registered foreign object the destructor is called |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
103 | 3. The pool memory is deallocated |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
104 | 4. The pool structure is deallocated |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
105 | |
1281
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
106 | ## Transfer Memory |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
107 | |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
108 | ```C |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
109 | #include <cx/mempool.h> |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
110 | |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
111 | int cxMempoolTransfer(CxMempool *source, CxMempool *dest); |
1283
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents:
1282
diff
changeset
|
112 | |
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents:
1282
diff
changeset
|
113 | int cxMempoolTransferObject(CxMempool *source, CxMempool *dest, |
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents:
1282
diff
changeset
|
114 | const void *obj); |
1281
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
115 | ``` |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
116 | |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
117 | Memory managed by a pool can be transferred to another pool. |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
118 | |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
119 | The function `cxMempoolTransfer()` transfers all memory managed and/or registered with the `source` pool to the `dest` pool. |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
120 | It also registers its allocator with the `dest` pool and creates a new allocator for the `source` pool. |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
121 | That means, that all references to the allocator of the `source` pool remain valid and continue to work with the `dest` pool. |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
122 | The transferred allocator will be destroyed when the `dest` pool gets destroyed. |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
123 | |
1283
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents:
1282
diff
changeset
|
124 | The function `cxMempoolTransferObject()` transfers a _single_ object managed by the `source` pool to the `dest` pool. |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
125 | In contrast to transferring an entire pool, if `obj` has a reference to `source->allocator`, it must be updated to `dest->allocator` manually. |
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
126 | It is also possible to transfer registered memory from one pool to another, this way. |
1283
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents:
1282
diff
changeset
|
127 | |
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents:
1282
diff
changeset
|
128 | The functions returns zero when the transfer was successful and non-zero if a necessary memory allocation was not possible, |
1325
20caf6efaf07
improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents:
1298
diff
changeset
|
129 | the `source` and `dest` pointers point to the same pool, or the pools have different type (simple, advanced, pure). |
1281
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
130 | In case of an error, no memory is transferred and both pools are in a valid state. |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
131 | |
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents:
1174
diff
changeset
|
132 | |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
133 | ## Example |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
134 | |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
135 | The following code illustrates how the contents of a CSV file are read into pooled memory. |
1141 | 136 | ```C |
137 | #include <stdio.h> | |
138 | #include <cx/mempool.h> | |
139 | #include <cx/linked_list.h> | |
140 | #include <cx/string.h> | |
141 | #include <cx/buffer.h> | |
142 | #include <cx/utils.h> | |
143 | ||
144 | typedef struct { | |
145 | cxstring column_a; | |
146 | cxstring column_b; | |
147 | cxstring column_c; | |
148 | } CSVData; | |
149 | ||
150 | int main(void) { | |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
151 | // create a simple pool for various different objects |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
152 | CxMempool* pool = cxMempoolCreateSimple(128); |
1141 | 153 | |
154 | FILE *f = fopen("test.csv", "r"); | |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
155 | if (f == NULL) { |
1141 | 156 | perror("Cannot open file"); |
157 | return 1; | |
158 | } | |
159 | // close the file automatically at pool destruction | |
160 | cxMempoolRegister(pool, f, (cx_destructor_func) fclose); | |
161 | ||
162 | // create a buffer using the memory pool for destruction | |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
163 | CxBuffer *content = cxBufferCreate( |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
164 | NULL, 256, pool->allocator, CX_BUFFER_AUTO_EXTEND |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
165 | ); |
1141 | 166 | |
167 | // 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
|
168 | cx_stream_copy( |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
169 | f, content, (cx_read_func) fread, cxBufferWriteFunc |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
170 | ); |
1141 | 171 | fclose(f); |
172 | cxstring contentstr = cx_strn(content->space, content->size); | |
173 | ||
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
174 | // split the string into lines |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
175 | // use the memory pool to allocate the target array |
1141 | 176 | cxstring* lines; |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
177 | size_t lc = cx_strsplit_a( |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
178 | pool->allocator, contentstr, cx_str("\n"), SIZE_MAX, &lines |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
179 | ); |
1141 | 180 | |
181 | // 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
|
182 | // 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
|
183 | CxList* datalist = cxLinkedListCreate( |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
184 | pool->allocator, NULL, sizeof(CSVData) |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
185 | ); |
1141 | 186 | for (size_t i = 1 ; i < lc ; i++) { |
187 | if (lines[i].length == 0) continue; | |
188 | cxstring fields[3]; | |
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
189 | size_t fc = cx_strsplit(lines[i], cx_str(";"), 3, fields); |
1141 | 190 | if (fc != 3) { |
191 | fprintf(stderr, "Syntax error in line %zu.\n", i); | |
192 | cxMempoolFree(pool); | |
193 | return 1; | |
194 | } | |
195 | CSVData data; | |
196 | data.column_a = fields[0]; | |
197 | data.column_b = fields[1]; | |
198 | data.column_c = fields[2]; | |
199 | cxListAdd(datalist, &data); | |
200 | } | |
201 | ||
202 | // iterate through the list and output the data | |
203 | CxIterator iter = cxListIterator(datalist); | |
204 | cx_foreach(CSVData*, data, iter) { | |
1298
0597f1f20ea9
use new string formatting macros in documentation
Mike Becker <universe@uap-core.de>
parents:
1283
diff
changeset
|
205 | printf("Column A: %" CX_PRIstr " | " |
0597f1f20ea9
use new string formatting macros in documentation
Mike Becker <universe@uap-core.de>
parents:
1283
diff
changeset
|
206 | "Column B: %" CX_PRIstr " | " |
0597f1f20ea9
use new string formatting macros in documentation
Mike Becker <universe@uap-core.de>
parents:
1283
diff
changeset
|
207 | "Column C: %" CX_PRIstr "\n", |
0597f1f20ea9
use new string formatting macros in documentation
Mike Becker <universe@uap-core.de>
parents:
1283
diff
changeset
|
208 | CX_SFMT(data->column_a), |
0597f1f20ea9
use new string formatting macros in documentation
Mike Becker <universe@uap-core.de>
parents:
1283
diff
changeset
|
209 | CX_SFMT(data->column_b), |
0597f1f20ea9
use new string formatting macros in documentation
Mike Becker <universe@uap-core.de>
parents:
1283
diff
changeset
|
210 | CX_SFMT(data->column_c) |
1141 | 211 | ); |
212 | } | |
213 | ||
214 | // cleanup everything, no manual free() needed | |
215 | cxMempoolFree(pool); | |
216 | ||
217 | return 0; | |
218 | } | |
219 | ``` | |
220 | ||
1168
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
221 | <seealso> |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
222 | <category ref="apidoc"> |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
223 | <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
|
224 | </category> |
d92124c8db73
add mempool documentation
Mike Becker <universe@uap-core.de>
parents:
1146
diff
changeset
|
225 | </seealso> |