docs/Writerside/topics/mempool.h.md

Thu, 22 May 2025 22:22:14 +0200

author
Mike Becker <universe@uap-core.de>
date
Thu, 22 May 2025 22:22:14 +0200
changeset 1325
20caf6efaf07
parent 1298
0597f1f20ea9
permissions
-rw-r--r--

improve mempool destructor support (3/3)

documentation and final fixes

resolves #655

1143
0559812df10c assign proper names to the documentation topics
Mike Becker <universe@uap-core.de>
parents: 1142
diff changeset
1 # Memory Pool
1141
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