Thu, 30 Oct 2025 19:26:47 +0100
add tests for cxListDifference() - resolves #751
| 1143 
0559812df10c
assign proper names to the documentation topics
 Mike Becker <universe@uap-core.de> parents: 
1142diff
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: 
1146diff
changeset | 6 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 7 | Additionally, you may also register _independent_ destructor functions. | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
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: 
1146diff
changeset | 9 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
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: 
1146diff
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: 
1146diff
changeset | 12 | |
| 1281 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 13 | ## Basic Memory Management | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 14 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 15 | ```C | 
| 1174 
ee473780cc0d
add missing documentation about what header to include
 Mike Becker <universe@uap-core.de> parents: 
1168diff
changeset | 16 | #include <cx/mempool.h> | 
| 
ee473780cc0d
add missing documentation about what header to include
 Mike Becker <universe@uap-core.de> parents: 
1168diff
changeset | 17 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 18 | enum cx_mempool_type { | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 19 | CX_MEMPOOL_TYPE_SIMPLE, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 20 | CX_MEMPOOL_TYPE_ADVANCED, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 21 | CX_MEMPOOL_TYPE_PURE, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 22 | }; | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 23 | |
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 24 | CxMempool *cxMempoolCreate(size_t capacity, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 25 | enum cx_mempool_type type); | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 26 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 27 | CxMempool *cxMempoolCreateSimple(size_t capacity); | 
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 28 | CxMempool *cxMempoolCreateAdvanced(size_t capacity); | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 29 | CxMempool *cxMempoolCreatePure(size_t capacity); | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 30 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 31 | void cxMempoolFree(CxMempool *pool); | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 32 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 33 | void cxMempoolGlobalDestructor(CxMempool *pool, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 34 | cx_destructor_func fnc); | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 35 | |
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 36 | void cxMempoolGlobalDestructor2(CxMempool *pool, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 37 | cx_destructor_func2 fnc, void *data); | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 38 | |
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 39 | void cxMempoolSetDestructor(void *memory, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 40 | cx_destructor_func fnc); | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 41 | |
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 42 | void cxMempoolSetDestructor2(void *memory, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 43 | cx_destructor_func fnc, void *data); | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 44 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 45 | void cxMempoolRemoveDestructor(void *memory); | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 46 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 47 | void cxMempoolRemoveDestructor2(void *memory); | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 48 | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 49 | int cxMempoolRegister(CxMempool *pool, void *memory, | 
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 50 | cx_destructor_func fnc); | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 51 | |
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 52 | int cxMempoolRegister2(CxMempool *pool, void *memory, | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 53 | cx_destructor_func fnc, void *data); | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 54 | ``` | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 55 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
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: 
1146diff
changeset | 58 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
changeset | 64 | custom destructors with the allocated memory. | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 65 | |
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
changeset | 67 | >{style="note"} | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 68 | |
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1146diff
changeset | 72 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
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: 
1146diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
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: 
1146diff
changeset | 85 | in which case a non-zero value is returned. | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 86 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
changeset | 88 | > regardless of the pool's type. | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
changeset | 90 | > | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
changeset | 92 | |
| 1281 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 93 | ### Order of Destruction | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 94 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 95 | When you call `cxMempoolFree()` the following actions are performed: | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 96 | |
| 1325 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1146diff
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: 
1298diff
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: 
1298diff
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: 
1298diff
changeset | 101 | 4. the object's memory is deallocated | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
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: 
1298diff
changeset | 103 | 3. The pool memory is deallocated | 
| 
20caf6efaf07
improve mempool destructor support (3/3)
 Mike Becker <universe@uap-core.de> parents: 
1298diff
changeset | 104 | 4. The pool structure is deallocated | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 105 | |
| 1281 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 106 | ## Transfer Memory | 
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 107 | |
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 108 | ```C | 
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 109 | #include <cx/mempool.h> | 
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 110 | |
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 111 | int cxMempoolTransfer(CxMempool *source, CxMempool *dest); | 
| 1283 
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1282diff
changeset | 112 | |
| 
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1282diff
changeset | 113 | int cxMempoolTransferObject(CxMempool *source, CxMempool *dest, | 
| 
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1282diff
changeset | 114 | const void *obj); | 
| 1281 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 115 | ``` | 
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 116 | |
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
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: 
1174diff
changeset | 118 | |
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
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: 
1174diff
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: 
1174diff
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: 
1174diff
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: 
1174diff
changeset | 123 | |
| 1283 
89935fea4b7c
add cxMempoolTransferObject() - resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1282diff
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: 
1298diff
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: 
1298diff
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: 
1282diff
changeset | 127 | |
| 1329 
343eac5ac824
add base allocator to mempool
 Mike Becker <universe@uap-core.de> parents: 
1325diff
changeset | 128 | The functions return zero when the transfer was successful, and non-zero under one of the following error conditions: | 
| 
343eac5ac824
add base allocator to mempool
 Mike Becker <universe@uap-core.de> parents: 
1325diff
changeset | 129 | - a necessary memory allocation was not possible | 
| 
343eac5ac824
add base allocator to mempool
 Mike Becker <universe@uap-core.de> parents: 
1325diff
changeset | 130 | - the `source` and `dest` pointers point to the same pool | 
| 
343eac5ac824
add base allocator to mempool
 Mike Becker <universe@uap-core.de> parents: 
1325diff
changeset | 131 | - the pools have a different type (simple, advanced, pure) | 
| 
343eac5ac824
add base allocator to mempool
 Mike Becker <universe@uap-core.de> parents: 
1325diff
changeset | 132 | - the pools have different base allocators (i.e. `cxDefaultAllocator` changed between creation of the pools) | 
| 
343eac5ac824
add base allocator to mempool
 Mike Becker <universe@uap-core.de> parents: 
1325diff
changeset | 133 | |
| 
343eac5ac824
add base allocator to mempool
 Mike Becker <universe@uap-core.de> parents: 
1325diff
changeset | 134 | In case of an error, no memory is transferred and both pools remain unchanged and are in a valid state. | 
| 1281 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 135 | |
| 
45746a08c59e
add cxMempoolTransfer() - partially resolves #640
 Mike Becker <universe@uap-core.de> parents: 
1174diff
changeset | 136 | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 137 | ## Example | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 138 | |
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 139 | The following code illustrates how the contents of a CSV file are read into pooled memory. | 
| 1141 | 140 | ```C | 
| 141 | #include <stdio.h> | |
| 142 | #include <cx/mempool.h> | |
| 143 | #include <cx/linked_list.h> | |
| 144 | #include <cx/string.h> | |
| 145 | #include <cx/buffer.h> | |
| 146 | #include <cx/utils.h> | |
| 147 | ||
| 148 | typedef struct { | |
| 149 | cxstring column_a; | |
| 150 | cxstring column_b; | |
| 151 | cxstring column_c; | |
| 152 | } CSVData; | |
| 153 | ||
| 154 | int main(void) { | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 155 | // create a simple pool for various different objects | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 156 | CxMempool* pool = cxMempoolCreateSimple(128); | 
| 1141 | 157 | |
| 158 | FILE *f = fopen("test.csv", "r"); | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 159 | if (f == NULL) { | 
| 1141 | 160 | perror("Cannot open file"); | 
| 161 | return 1; | |
| 162 | } | |
| 163 | // close the file automatically at pool destruction | |
| 164 | cxMempoolRegister(pool, f, (cx_destructor_func) fclose); | |
| 165 | ||
| 166 | // create a buffer using the memory pool for destruction | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 167 | CxBuffer *content = cxBufferCreate( | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 168 | NULL, 256, pool->allocator, CX_BUFFER_AUTO_EXTEND | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 169 | ); | 
| 1141 | 170 | |
| 171 | // read the file into the buffer and turn it into a string | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 172 | cx_stream_copy( | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 173 | f, content, (cx_read_func) fread, cxBufferWriteFunc | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 174 | ); | 
| 1141 | 175 | fclose(f); | 
| 176 | cxstring contentstr = cx_strn(content->space, content->size); | |
| 177 | ||
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 178 | // split the string into lines | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 179 | // use the memory pool to allocate the target array | 
| 1141 | 180 | cxstring* lines; | 
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 181 | size_t lc = cx_strsplit_a( | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 182 | pool->allocator, contentstr, cx_str("\n"), SIZE_MAX, &lines | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 183 | ); | 
| 1141 | 184 | |
| 185 | // skip the header and parse the remaining data into a linked list | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 186 | // the nodes of the list shall also be allocated by the pool | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 187 | CxList* datalist = cxLinkedListCreate( | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 188 | pool->allocator, NULL, sizeof(CSVData) | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 189 | ); | 
| 1141 | 190 | for (size_t i = 1 ; i < lc ; i++) { | 
| 191 | if (lines[i].length == 0) continue; | |
| 192 | cxstring fields[3]; | |
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 193 | size_t fc = cx_strsplit(lines[i], cx_str(";"), 3, fields); | 
| 1141 | 194 | if (fc != 3) { | 
| 195 | fprintf(stderr, "Syntax error in line %zu.\n", i); | |
| 196 | cxMempoolFree(pool); | |
| 197 | return 1; | |
| 198 | } | |
| 199 | CSVData data; | |
| 200 | data.column_a = fields[0]; | |
| 201 | data.column_b = fields[1]; | |
| 202 | data.column_c = fields[2]; | |
| 203 | cxListAdd(datalist, &data); | |
| 204 | } | |
| 205 | ||
| 206 | // iterate through the list and output the data | |
| 207 | CxIterator iter = cxListIterator(datalist); | |
| 208 | cx_foreach(CSVData*, data, iter) { | |
| 1298 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1283diff
changeset | 209 | printf("Column A: %" CX_PRIstr " | " | 
| 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1283diff
changeset | 210 | "Column B: %" CX_PRIstr " | " | 
| 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1283diff
changeset | 211 | "Column C: %" CX_PRIstr "\n", | 
| 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1283diff
changeset | 212 | CX_SFMT(data->column_a), | 
| 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1283diff
changeset | 213 | CX_SFMT(data->column_b), | 
| 
0597f1f20ea9
use new string formatting macros in documentation
 Mike Becker <universe@uap-core.de> parents: 
1283diff
changeset | 214 | CX_SFMT(data->column_c) | 
| 1141 | 215 | ); | 
| 216 | } | |
| 217 | ||
| 218 | // cleanup everything, no manual free() needed | |
| 219 | cxMempoolFree(pool); | |
| 220 | ||
| 221 | return 0; | |
| 222 | } | |
| 223 | ``` | |
| 224 | ||
| 1168 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 225 | <seealso> | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 226 | <category ref="apidoc"> | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 227 | <a href="https://ucx.sourceforge.io/api/mempool_8h.html">mempool.h</a> | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 228 | </category> | 
| 
d92124c8db73
add mempool documentation
 Mike Becker <universe@uap-core.de> parents: 
1146diff
changeset | 229 | </seealso> |