Fri, 23 May 2025 12:44:24 +0200
make test-compile depend on both static and shared
the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build
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> |