src/mempool.c

Sun, 23 Nov 2025 13:15:19 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 23 Nov 2025 13:15:19 +0100
changeset 1508
dfc0ddd9571e
parent 1452
26e006ba651d
permissions
-rw-r--r--

optimize sorted insertion by using the infimum instead of the supremum

The reason is that the supremum returns the equal element with the smallest index, and we want the largest.
Therefore, we use the infimum, which already gives us the largest index when there are equal elements, and increase the index by one. The infimum is also guaranteed to exist in that case.

571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
29 #include "cx/mempool.h"
970
c9b02747cfc5 move szmul to common.h
Mike Becker <universe@uap-core.de>
parents: 962
diff changeset
30
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 #include <string.h>
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
32 #include <errno.h>
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
34 static int cx_mempool_ensure_capacity(
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
35 struct cx_mempool_s *pool,
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
36 size_t needed_capacity
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
37 ) {
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
38 if (needed_capacity <= pool->capacity) return 0;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
39 size_t newcap = pool->capacity >= 1000 ?
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
40 pool->capacity + 1000 : pool->capacity * 2;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
41 size_t newmsize;
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
42 // LCOV_EXCL_START
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
43 if (pool->capacity > newcap
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
44 || cx_szmul(newcap, sizeof(void*), &newmsize)) {
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
45 errno = EOVERFLOW;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
46 return 1;
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
47 } // LCOV_EXCL_STOP
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
48 void **newdata = cxRealloc(pool->base_allocator, pool->data, newmsize);
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
49 if (newdata == NULL) return 1;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
50 pool->data = newdata;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
51 pool->capacity = newcap;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
52 return 0;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
53 }
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
54
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
55 static int cx_mempool_ensure_registered_capacity(
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
56 struct cx_mempool_s *pool,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
57 size_t needed_capacity
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
58 ) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
59 if (needed_capacity <= pool->registered_capacity) return 0;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
60 // we do not expect so many registrations
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
61 size_t newcap = pool->registered_capacity + 8;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
62 size_t newmsize;
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
63 // LCOV_EXCL_START
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
64 if (pool->registered_capacity > newcap || cx_szmul(newcap,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
65 sizeof(struct cx_mempool_foreign_memory_s), &newmsize)) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
66 errno = EOVERFLOW;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
67 return 1;
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
68 } // LCOV_EXCL_STOP
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
69 void *newdata = cxRealloc(pool->base_allocator, pool->registered, newmsize);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
70 if (newdata == NULL) return 1;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
71 pool->registered = newdata;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
72 pool->registered_capacity = newcap;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
73 return 0;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
74 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
75
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
76 static void *cx_mempool_malloc_simple(
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
77 void *p,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
78 size_t n
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 ) {
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
80 struct cx_mempool_s *pool = p;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
82 if (cx_mempool_ensure_capacity(pool, pool->size + 1)) {
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
83 return NULL; // LCOV_EXCL_LINE
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
86 struct cx_mempool_memory_s *mem =
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
87 cxMalloc(pool->base_allocator, sizeof(struct cx_mempool_memory_s) + n);
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
88 if (mem == NULL) return NULL;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
89 mem->destructor = NULL;
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
90 pool->data[pool->size] = mem;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
91 pool->size++;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
93 return mem->c;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
96 static void *cx_mempool_calloc_simple(
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
97 void *p,
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 size_t nelem,
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 size_t elsize
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 ) {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101 size_t msz;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 if (cx_szmul(nelem, elsize, &msz)) {
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
103 errno = EOVERFLOW;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
104 return NULL;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
106 void *ptr = cx_mempool_malloc_simple(p, msz);
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
107 if (ptr == NULL) return NULL;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 memset(ptr, 0, nelem * elsize);
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 return ptr;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
112 static void cx_mempool_free_simple(
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
113 void *p,
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 void *ptr
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 ) {
947
2a47b4a5c216 fix cx_mempool_free crash if ptr is null
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 727
diff changeset
116 if (!ptr) return;
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
117 struct cx_mempool_s *pool = p;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
119 cx_destructor_func destr = pool->destr;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
120 cx_destructor_func2 destr2 = pool->destr2;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
121
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
122 struct cx_mempool_memory_s *mem =
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
123 (void*) ((char *) ptr - sizeof(struct cx_mempool_memory_s));
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
124
962
cd418898af5c remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents: 947
diff changeset
125 for (size_t i = 0; i < pool->size; i++) {
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 if (mem == pool->data[i]) {
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
127 if (mem->destructor) {
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
128 mem->destructor(mem->c);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
130 if (destr != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
131 destr(mem->c);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
132 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
133 if (destr2 != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
134 destr2(pool->destr2_data, mem->c);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
135 }
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
136 cxFree(pool->base_allocator, mem);
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
137 size_t last_index = pool->size - 1;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
138 if (i != last_index) {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139 pool->data[i] = pool->data[last_index];
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140 pool->data[last_index] = NULL;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
141 }
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
142 pool->size--;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143 return;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
144 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
145 }
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
146 abort(); // LCOV_EXCL_LINE
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
147 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
149 static void *cx_mempool_realloc_simple(
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
150 void *p,
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
151 void *ptr,
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
152 size_t n
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
153 ) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
154 if (ptr == NULL) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
155 return cx_mempool_malloc_simple(p, n);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
156 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
157 if (n == 0) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
158 cx_mempool_free_simple(p, ptr);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
159 return NULL;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
160 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
161 struct cx_mempool_s *pool = p;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
162
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
163 const unsigned overhead = sizeof(struct cx_mempool_memory_s);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
164 struct cx_mempool_memory_s *mem =
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
165 (void *) (((char *) ptr) - overhead);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
166 struct cx_mempool_memory_s *newm =
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
167 cxRealloc(pool->base_allocator, mem, n + overhead);
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
168
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
169 if (newm == NULL) return NULL;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
170 if (mem != newm) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
171 for (size_t i = 0; i < pool->size; i++) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
172 if (pool->data[i] == mem) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
173 pool->data[i] = newm;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
174 return ((char*)newm) + overhead;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
175 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
176 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
177 abort(); // LCOV_EXCL_LINE
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
178 } else {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
179 // unfortunately glibc() realloc seems to always move
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
180 return ptr; // LCOV_EXCL_LINE
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
181 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
182 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
183
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
184 static void cx_mempool_free_all_simple(const struct cx_mempool_s *pool) {
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
185 cx_destructor_func destr = pool->destr;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
186 cx_destructor_func2 destr2 = pool->destr2;
962
cd418898af5c remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents: 947
diff changeset
187 for (size_t i = 0; i < pool->size; i++) {
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
188 struct cx_mempool_memory_s *mem = pool->data[i];
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
189 if (mem->destructor) {
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
190 mem->destructor(mem->c);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
191 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
192 if (destr != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
193 destr(mem->c);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
194 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
195 if (destr2 != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
196 destr2(pool->destr2_data, mem->c);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
197 }
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
198 cxFree(pool->base_allocator, mem);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
199 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
200 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
201
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
202 static cx_allocator_class cx_mempool_simple_allocator_class = {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
203 cx_mempool_malloc_simple,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
204 cx_mempool_realloc_simple,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
205 cx_mempool_calloc_simple,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
206 cx_mempool_free_simple
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
207 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
208
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
209 static void *cx_mempool_malloc_advanced(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
210 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
211 size_t n
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
212 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
213 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
214
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
215 if (cx_mempool_ensure_capacity(pool, pool->size + 1)) {
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
216 return NULL; // LCOV_EXCL_LINE
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
217 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
218
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
219 struct cx_mempool_memory2_s *mem =
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
220 cxMalloc(pool->base_allocator, sizeof(struct cx_mempool_memory2_s) + n);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
221 if (mem == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
222 mem->destructor = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
223 mem->data = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
224 pool->data[pool->size] = mem;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
225 pool->size++;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
226
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
227 return mem->c;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
228 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
229
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
230 static void *cx_mempool_calloc_advanced(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
231 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
232 size_t nelem,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
233 size_t elsize
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
234 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
235 size_t msz;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
236 if (cx_szmul(nelem, elsize, &msz)) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
237 errno = EOVERFLOW;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
238 return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
239 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
240 void *ptr = cx_mempool_malloc_advanced(p, msz);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
241 if (ptr == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
242 memset(ptr, 0, nelem * elsize);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
243 return ptr;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
244 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
245
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
246 static void cx_mempool_free_advanced(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
247 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
248 void *ptr
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
249 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
250 if (!ptr) return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
251 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
252
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
253 cx_destructor_func destr = pool->destr;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
254 cx_destructor_func2 destr2 = pool->destr2;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
255
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
256 struct cx_mempool_memory2_s *mem =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
257 (void*) ((char *) ptr - sizeof(struct cx_mempool_memory2_s));
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
258
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
259 for (size_t i = 0; i < pool->size; i++) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
260 if (mem == pool->data[i]) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
261 if (mem->destructor) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
262 mem->destructor(mem->data, mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
263 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
264 if (destr != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
265 destr(mem->c);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
266 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
267 if (destr2 != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
268 destr2(pool->destr2_data, mem->c);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
269 }
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
270 cxFree(pool->base_allocator, mem);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
271 size_t last_index = pool->size - 1;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
272 if (i != last_index) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
273 pool->data[i] = pool->data[last_index];
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
274 pool->data[last_index] = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
275 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
276 pool->size--;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
277 return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
278 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
279 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
280 abort(); // LCOV_EXCL_LINE
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
281 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
282
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
283 static void *cx_mempool_realloc_advanced(
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
284 void *p,
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
285 void *ptr,
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
286 size_t n
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
287 ) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
288 if (ptr == NULL) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
289 return cx_mempool_malloc_advanced(p, n);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
290 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
291 if (n == 0) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
292 cx_mempool_free_advanced(p, ptr);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
293 return NULL;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
294 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
295 struct cx_mempool_s *pool = p;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
296
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
297 const unsigned overhead = sizeof(struct cx_mempool_memory2_s);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
298 struct cx_mempool_memory2_s *mem =
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
299 (void *) (((char *) ptr) - overhead);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
300 struct cx_mempool_memory2_s *newm =
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
301 cxRealloc(pool->base_allocator, mem, n + overhead);
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
302
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
303 if (newm == NULL) return NULL;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
304 if (mem != newm) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
305 for (size_t i = 0; i < pool->size; i++) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
306 if (pool->data[i] == mem) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
307 pool->data[i] = newm;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
308 return ((char*)newm) + overhead;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
309 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
310 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
311 abort(); // LCOV_EXCL_LINE
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
312 } else {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
313 // unfortunately glibc() realloc seems to always move
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
314 return ptr; // LCOV_EXCL_LINE
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
315 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
316 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
317
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
318 static void cx_mempool_free_all_advanced(const struct cx_mempool_s *pool) {
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
319 cx_destructor_func destr = pool->destr;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
320 cx_destructor_func2 destr2 = pool->destr2;
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
321 for (size_t i = 0; i < pool->size; i++) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
322 struct cx_mempool_memory2_s *mem = pool->data[i];
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
323 if (mem->destructor) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
324 mem->destructor(mem->data, mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
325 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
326 if (destr != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
327 destr(mem->c);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
328 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
329 if (destr2 != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
330 destr2(pool->destr2_data, mem->c);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
331 }
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
332 cxFree(pool->base_allocator, mem);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
333 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
334 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
335
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
336 static cx_allocator_class cx_mempool_advanced_allocator_class = {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
337 cx_mempool_malloc_advanced,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
338 cx_mempool_realloc_advanced,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
339 cx_mempool_calloc_advanced,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
340 cx_mempool_free_advanced
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
341 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
342
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
343
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
344 static void *cx_mempool_malloc_pure(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
345 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
346 size_t n
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
347 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
348 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
349
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
350 if (cx_mempool_ensure_capacity(pool, pool->size + 1)) {
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
351 return NULL; // LCOV_EXCL_LINE
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
352 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
353
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
354 void *mem = cxMalloc(pool->base_allocator, n);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
355 if (mem == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
356 pool->data[pool->size] = mem;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
357 pool->size++;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
358
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
359 return mem;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
360 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
361
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
362 static void *cx_mempool_calloc_pure(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
363 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
364 size_t nelem,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
365 size_t elsize
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
366 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
367 size_t msz;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
368 if (cx_szmul(nelem, elsize, &msz)) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
369 errno = EOVERFLOW;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
370 return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
371 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
372 void *ptr = cx_mempool_malloc_pure(p, msz);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
373 if (ptr == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
374 memset(ptr, 0, nelem * elsize);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
375 return ptr;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
376 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
377
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
378 static void cx_mempool_free_pure(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
379 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
380 void *ptr
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
381 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
382 if (!ptr) return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
383 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
384
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
385 cx_destructor_func destr = pool->destr;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
386 cx_destructor_func2 destr2 = pool->destr2;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
387
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
388 for (size_t i = 0; i < pool->size; i++) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
389 if (ptr == pool->data[i]) {
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
390 if (destr != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
391 destr(ptr);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
392 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
393 if (destr2 != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
394 destr2(pool->destr2_data, ptr);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
395 }
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
396 cxFree(pool->base_allocator, ptr);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
397 size_t last_index = pool->size - 1;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
398 if (i != last_index) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
399 pool->data[i] = pool->data[last_index];
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
400 pool->data[last_index] = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
401 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
402 pool->size--;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
403 return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
404 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
405 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
406 abort(); // LCOV_EXCL_LINE
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
407 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
408
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
409 static void *cx_mempool_realloc_pure(
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
410 void *p,
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
411 void *ptr,
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
412 size_t n
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
413 ) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
414 if (ptr == NULL) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
415 return cx_mempool_malloc_pure(p, n);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
416 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
417 if (n == 0) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
418 cx_mempool_free_pure(p, ptr);
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
419 return NULL;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
420 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
421 struct cx_mempool_s *pool = p;
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
422 void *newm = cxRealloc(pool->base_allocator, ptr, n);
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
423 if (newm == NULL) return NULL;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
424 if (ptr != newm) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
425 for (size_t i = 0; i < pool->size; i++) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
426 if (pool->data[i] == ptr) {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
427 pool->data[i] = newm;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
428 return newm;
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
429 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
430 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
431 abort(); // LCOV_EXCL_LINE
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
432 } else {
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
433 // unfortunately glibc() realloc seems to always move
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
434 return ptr; // LCOV_EXCL_LINE
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
435 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
436 }
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
437
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
438 static void cx_mempool_free_all_pure(const struct cx_mempool_s *pool) {
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
439 cx_destructor_func destr = pool->destr;
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
440 cx_destructor_func2 destr2 = pool->destr2;
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
441 for (size_t i = 0; i < pool->size; i++) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
442 void *mem = pool->data[i];
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
443 if (destr != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
444 destr(mem);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
445 }
1452
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
446 if (destr2 != NULL) {
26e006ba651d continue to fix warnings on certain compilers due to implicit cast from fptr to bool
Mike Becker <universe@uap-core.de>
parents: 1451
diff changeset
447 destr2(pool->destr2_data, mem);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
448 }
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
449 cxFree(pool->base_allocator, mem);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
450 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
451 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
452
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
453 static cx_allocator_class cx_mempool_pure_allocator_class = {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
454 cx_mempool_malloc_pure,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
455 cx_mempool_realloc_pure,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
456 cx_mempool_calloc_pure,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
457 cx_mempool_free_pure
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
458 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
459
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
460 static void cx_mempool_free_foreign(const struct cx_mempool_s *pool) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
461 for (size_t i = 0; i < pool->registered_size; i++) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
462 struct cx_mempool_foreign_memory_s info = pool->registered[i];
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
463 if (info.destr2_data == NULL) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
464 if (info.destr) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
465 info.destr(info.mem);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
466 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
467 } else {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
468 info.destr2(info.destr2_data, info.mem);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
469 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
470 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
471 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
472
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
473 void cxMempoolFree(CxMempool *pool) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
474 if (pool == NULL) return;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
475 if (pool->allocator->cl == &cx_mempool_simple_allocator_class) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
476 cx_mempool_free_all_simple(pool);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
477 } else if (pool->allocator->cl == &cx_mempool_advanced_allocator_class) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
478 cx_mempool_free_all_advanced(pool);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
479 } else {
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
480 cx_mempool_free_all_pure(pool);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
481 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
482 cx_mempool_free_foreign(pool);
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
483 cxFree(pool->base_allocator, pool->data);
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
484 cxFree(pool->base_allocator, pool->registered);
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
485 cxFree(pool->base_allocator, (void*) pool->allocator);
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
486 cxFree(pool->base_allocator, pool);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
487 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
488
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
489 void cxMempoolSetDestructor(
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
490 void *ptr,
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
491 cx_destructor_func func
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
492 ) {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
493 *(cx_destructor_func *) ((char *) ptr - sizeof(cx_destructor_func)) = func;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
494 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
495
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
496 void cxMempoolSetDestructor2(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
497 void *ptr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
498 cx_destructor_func2 func,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
499 void *data
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
500 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
501 struct cx_mempool_memory2_s *info =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
502 (void*)((char *) ptr - sizeof(struct cx_mempool_memory2_s));
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
503 info->destructor = func;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
504 info->data = data;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
505 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
506
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
507 void cxMempoolRemoveDestructor(void *ptr) {
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
508 *(cx_destructor_func *) ((char *) ptr - sizeof(cx_destructor_func)) = NULL;
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
509 }
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
510
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
511 void cxMempoolRemoveDestructor2(void *ptr) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
512 struct cx_mempool_memory2_s *info =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
513 (void*)((char *) ptr - sizeof(struct cx_mempool_memory2_s));
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
514 info->destructor = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
515 info->data = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
516 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
517
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
518 int cxMempoolRegister(
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
519 CxMempool *pool,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
520 void *memory,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
521 cx_destructor_func destr
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
522 ) {
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
523 if (cx_mempool_ensure_registered_capacity(pool, pool->registered_size + 1)) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
524 return 1; // LCOV_EXCL_LINE
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
525 }
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
526
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
527 pool->registered[pool->registered_size++] =
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
528 (struct cx_mempool_foreign_memory_s) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
529 .mem = memory,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
530 .destr = destr,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
531 .destr2_data = NULL
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
532 };
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
533
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
534 return 0;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
535 }
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
536
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
537 int cxMempoolRegister2(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
538 CxMempool *pool,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
539 void *memory,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
540 cx_destructor_func2 destr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
541 void *data
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
542 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
543 if (cx_mempool_ensure_registered_capacity(pool, pool->registered_size + 1)) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
544 return 1; // LCOV_EXCL_LINE
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
545 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
546
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
547 pool->registered[pool->registered_size++] =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
548 (struct cx_mempool_foreign_memory_s) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
549 .mem = memory,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
550 .destr2 = destr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
551 .destr2_data = data
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
552 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
553
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
554 return 0;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
555 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
556
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
557 CxMempool *cxMempoolCreate(
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
558 size_t capacity,
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
559 enum cx_mempool_type type
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
560 ) {
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
561 if (capacity == 0) capacity = 16;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
562 size_t poolsize;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
563 if (cx_szmul(capacity, sizeof(void*), &poolsize)) {
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
564 // LCOV_EXCL_START
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
565 errno = EOVERFLOW;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
566 return NULL;
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
567 } // LCOV_EXCL_STOP
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
568
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
569 CxAllocator *provided_allocator = cxMallocDefault(sizeof(CxAllocator));
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
570 if (provided_allocator == NULL) { // LCOV_EXCL_START
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
571 return NULL;
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
572 } // LCOV_EXCL_STOP
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
573
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
574 CxMempool *pool = cxCallocDefault(1, sizeof(CxMempool));
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
575 if (pool == NULL) { // LCOV_EXCL_START
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
576 cxFreeDefault(provided_allocator);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
577 return NULL;
1328
2cf66dee40b8 stabilizes mempool implementation
Mike Becker <universe@uap-core.de>
parents: 1325
diff changeset
578 } // LCOV_EXCL_STOP
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
579
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
580 provided_allocator->data = pool;
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
581 *((const CxAllocator**)&pool->base_allocator) = cxDefaultAllocator;
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
582 pool->allocator = provided_allocator;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
583 if (type == CX_MEMPOOL_TYPE_SIMPLE) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
584 provided_allocator->cl = &cx_mempool_simple_allocator_class;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
585 } else if (type == CX_MEMPOOL_TYPE_ADVANCED) {
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
586 provided_allocator->cl = &cx_mempool_advanced_allocator_class;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
587 } else {
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
588 provided_allocator->cl = &cx_mempool_pure_allocator_class;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
589 }
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
590
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
591 pool->data = cxMallocDefault(poolsize);
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
592 if (pool->data == NULL) { // LCOV_EXCL_START
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
593 cxFreeDefault(provided_allocator);
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
594 cxFreeDefault(pool);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
595 return NULL;
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
596 } // LCOV_EXCL_STOP
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
597
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
598 pool->size = 0;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 648
diff changeset
599 pool->capacity = capacity;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
600
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
601 return pool;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
602 }
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
603
1325
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
604 void cxMempoolGlobalDestructor(CxMempool *pool, cx_destructor_func fnc) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
605 pool->destr = fnc;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
606 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
607
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
608 void cxMempoolGlobalDestructor2(CxMempool *pool, cx_destructor_func2 fnc, void *data) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
609 pool->destr2 = fnc;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
610 pool->destr2_data = data;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
611 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
612
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
613 static void cx_mempool_free_transferred_allocator(void *base_al, void *al) {
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
614 cxFree(base_al, al);
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1283
diff changeset
615 }
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1283
diff changeset
616
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
617 int cxMempoolTransfer(
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
618 CxMempool *source,
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
619 CxMempool *dest
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
620 ) {
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
621 // safety checks
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
622 if (source == dest) return 1;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
623 if (source->allocator->cl != dest->allocator->cl) return 1;
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
624 if (source->base_allocator->cl != dest->base_allocator->cl) return 1;
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
625
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
626 // ensure enough capacity in the destination pool
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
627 if (cx_mempool_ensure_capacity(dest, dest->size + source->size)) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
628 return 1; // LCOV_EXCL_LINE
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
629 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
630 if (cx_mempool_ensure_registered_capacity(dest,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
631 dest->registered_size + source->registered_size)) {
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
632 return 1; // LCOV_EXCL_LINE
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
633 }
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
634
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
635 // allocate a replacement allocator for the source pool
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
636 CxAllocator *new_source_allocator =
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
637 cxMalloc(source->base_allocator, sizeof(CxAllocator));
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
638 if (new_source_allocator == NULL) { // LCOV_EXCL_START
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
639 return 1;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
640 } // LCOV_EXCL_STOP
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
641 new_source_allocator->cl = source->allocator->cl;
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
642 new_source_allocator->data = source;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
643
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
644 // transfer all the data
1336
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
645 if (source->size > 0) {
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
646 memcpy(&dest->data[dest->size], source->data,
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
647 sizeof(void*)*source->size);
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
648 dest->size += source->size;
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
649 }
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
650
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
651 // transfer all registered memory
1336
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
652 if (source->registered_size > 0) {
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
653 memcpy(&dest->registered[dest->registered_size], source->registered,
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
654 sizeof(struct cx_mempool_foreign_memory_s)
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
655 * source->registered_size);
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
656 dest->registered_size += source->registered_size;
5acc23b518aa fix incorrect memcpy() in cxMempoolTransfer()
Mike Becker <universe@uap-core.de>
parents: 1329
diff changeset
657 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
658
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
659 // register the old allocator with the new pool
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
660 // we have to remove const-ness for this, but that's okay here
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
661 // also register the base allocator, s.t. the pool knows how to free it
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
662 CxAllocator *transferred_allocator = (CxAllocator*) source->allocator;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
663 transferred_allocator->data = dest;
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
664 cxMempoolRegister2(dest, transferred_allocator,
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
665 cx_mempool_free_transferred_allocator, (void*)source->base_allocator);
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
666
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
667 // prepare the source pool for re-use
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
668 source->allocator = new_source_allocator;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
669 memset(source->data, 0, source->size * sizeof(void*));
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
670 memset(source->registered, 0,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
671 source->registered_size * sizeof(struct cx_mempool_foreign_memory_s));
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
672 source->size = 0;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
673 source->registered_size = 0;
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
674
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
675 return 0;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
676 }
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
677
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
678 int cxMempoolTransferObject(
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
679 CxMempool *source,
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
680 CxMempool *dest,
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
681 const void *obj
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
682 ) {
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
683 // safety checks
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
684 if (source == dest) return 1;
1329
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
685 if (source->allocator->cl != dest->allocator->cl) return 1;
343eac5ac824 add base allocator to mempool
Mike Becker <universe@uap-core.de>
parents: 1328
diff changeset
686 if (source->base_allocator->cl != dest->base_allocator->cl) return 1;
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
687
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
688 // search for the object
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
689 for (size_t i = 0; i < source->size; i++) {
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
690 struct cx_mempool_memory_s *mem = source->data[i];
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
691 if (mem->c == obj) {
1325
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
692 // first, make sure that the dest pool can take the object
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
693 if (cx_mempool_ensure_capacity(dest, dest->size + 1)) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
694 return 1; // LCOV_EXCL_LINE
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
695 }
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
696 // remove from the source pool
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
697 size_t last_index = source->size - 1;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
698 if (i != last_index) {
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
699 source->data[i] = source->data[last_index];
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
700 source->data[last_index] = NULL;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
701 }
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
702 source->size--;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
703 // add to the target pool
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
704 dest->data[dest->size++] = mem;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
705 return 0;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
706 }
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
707 }
1325
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
708 // search in the registered objects
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
709 for (size_t i = 0; i < source->registered_size; i++) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
710 struct cx_mempool_foreign_memory_s *mem = &source->registered[i];
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
711 if (mem->mem == obj) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
712 // first, make sure that the dest pool can take the object
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
713 if (cx_mempool_ensure_registered_capacity(dest,
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
714 dest->registered_size + 1)) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
715 return 1; // LCOV_EXCL_LINE
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
716 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
717 dest->registered[dest->registered_size++] = *mem;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
718 // remove from the source pool
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
719 size_t last_index = source->registered_size - 1;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
720 if (i != last_index) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
721 source->registered[i] = source->registered[last_index];
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
722 memset(&source->registered[last_index], 0,
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
723 sizeof(struct cx_mempool_foreign_memory_s));
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
724 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
725 source->registered_size--;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
726 return 0;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
727 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
728 }
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
729 // not found
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
730 return 1;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
731 }

mercurial