docs/Writerside/topics/mempool.h.md

Fri, 23 May 2025 12:44:24 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 23 May 2025 12:44:24 +0200
changeset 1327
ed75dc1db503
parent 1325
20caf6efaf07
child 1329
343eac5ac824
permissions
-rw-r--r--

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
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
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
136 ```C
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
137 #include <stdio.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 #include <cx/mempool.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139 #include <cx/linked_list.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140 #include <cx/string.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141 #include <cx/buffer.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
142 #include <cx/utils.h>
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 typedef struct {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145 cxstring column_a;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
146 cxstring column_b;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
147 cxstring column_c;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148 } CSVData;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
149
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
153
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
156 perror("Cannot open file");
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
157 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
158 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
159 // close the file automatically at pool destruction
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
160 cxMempoolRegister(pool, f, (cx_destructor_func) fclose);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
171 fclose(f);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
172 cxstring contentstr = cx_strn(content->space, content->size);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
180
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
186 for (size_t i = 1 ; i < lc ; i++) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
187 if (lines[i].length == 0) continue;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
190 if (fc != 3) {
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
191 fprintf(stderr, "Syntax error in line %zu.\n", i);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
192 cxMempoolFree(pool);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
193 return 1;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
194 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
195 CSVData data;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
196 data.column_a = fields[0];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
197 data.column_b = fields[1];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
198 data.column_c = fields[2];
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
199 cxListAdd(datalist, &data);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
200 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
201
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
202 // iterate through the list and output the data
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
203 CxIterator iter = cxListIterator(datalist);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
211 );
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
212 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
213
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
214 // cleanup everything, no manual free() needed
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
215 cxMempoolFree(pool);
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
216
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
217 return 0;
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
218 }
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
219 ```
a06a2d27c043 create new page structure
Mike Becker <universe@uap-core.de>
parents:
diff changeset
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>

mercurial