src/mempool.c

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

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

make test-compile depend on both static and shared

the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build

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: 650
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;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
42 if (pool->capacity > newcap
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
43 || cx_szmul(newcap, sizeof(void*), &newmsize)) {
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
44 errno = EOVERFLOW;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
45 return 1;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
46 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
47 void **newdata = cxReallocDefault(pool->data, newmsize);
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
48 if (newdata == NULL) return 1;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
49 pool->data = newdata;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
50 pool->capacity = newcap;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
51 return 0;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
52 }
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
53
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
54 static int cx_mempool_ensure_registered_capacity(
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
55 struct cx_mempool_s *pool,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
56 size_t needed_capacity
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
57 ) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
58 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
59 // we do not expect so many registrations
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
60 size_t newcap = pool->registered_capacity + 8;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
61 size_t newmsize;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
62 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
63 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
64 errno = EOVERFLOW;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
65 return 1;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
66 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
67 void *newdata = cxReallocDefault(pool->registered, newmsize);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
68 if (newdata == NULL) return 1;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
69 pool->registered = newdata;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
70 pool->registered_capacity = newcap;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
71 return 0;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
72 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
73
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
74 static void *cx_mempool_malloc_simple(
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
75 void *p,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
76 size_t n
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 ) {
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
78 struct cx_mempool_s *pool = p;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
80 if (cx_mempool_ensure_capacity(pool, pool->size + 1)) {
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
81 return NULL;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
84 struct cx_mempool_memory_s *mem =
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
85 cxMallocDefault(sizeof(struct cx_mempool_memory_s) + n);
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
86 if (mem == NULL) return NULL;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
87 mem->destructor = NULL;
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
88 pool->data[pool->size] = mem;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
89 pool->size++;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
91 return mem->c;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
94 static void *cx_mempool_calloc_simple(
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
95 void *p,
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96 size_t nelem,
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 size_t elsize
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 ) {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 size_t msz;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 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
101 errno = EOVERFLOW;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 return NULL;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
104 void *ptr = cx_mempool_malloc_simple(p, msz);
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
105 if (ptr == NULL) return NULL;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 memset(ptr, 0, nelem * elsize);
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 return ptr;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
110 static void *cx_mempool_realloc_simple(
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
111 void *p,
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 void *ptr,
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 size_t n
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 ) {
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
115 struct cx_mempool_s *pool = p;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
117 const unsigned overhead = sizeof(struct cx_mempool_memory_s);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
118 struct cx_mempool_memory_s *mem =
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
119 (void *) (((char *) ptr) - overhead);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
120 struct cx_mempool_memory_s *newm =
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
121 cxReallocDefault(mem, n + overhead);
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
122
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
123 if (newm == NULL) return NULL;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 if (mem != newm) {
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 (pool->data[i] == mem) {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127 pool->data[i] = newm;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
128 return ((char*)newm) + overhead;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 }
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
131 abort(); // LCOV_EXCL_LINE
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
132 } else {
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
133 return ptr;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
134 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
135 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
136
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
137 static void cx_mempool_free_simple(
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
138 void *p,
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
139 void *ptr
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
140 ) {
947
2a47b4a5c216 fix cx_mempool_free crash if ptr is null
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 727
diff changeset
141 if (!ptr) return;
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
142 struct cx_mempool_s *pool = p;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
143
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
144 struct cx_mempool_memory_s *mem =
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
145 (void*) ((char *) ptr - sizeof(struct cx_mempool_memory_s));
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
146
962
cd418898af5c remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents: 947
diff changeset
147 for (size_t i = 0; i < pool->size; i++) {
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
148 if (mem == pool->data[i]) {
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
149 if (mem->destructor) {
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
150 mem->destructor(mem->c);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
151 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
152 if (pool->destr) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
153 pool->destr(mem->c);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
154 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
155 if (pool->destr2) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
156 pool->destr2(pool->destr2_data, mem->c);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
157 }
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
158 cxFreeDefault(mem);
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
159 size_t last_index = pool->size - 1;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
160 if (i != last_index) {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
161 pool->data[i] = pool->data[last_index];
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
162 pool->data[last_index] = NULL;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163 }
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
164 pool->size--;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
165 return;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
166 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
167 }
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
168 abort(); // LCOV_EXCL_LINE
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
169 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
170
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
171 static void cx_mempool_free_all_simple(const struct cx_mempool_s *pool) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
172 const bool has_destr = pool->destr;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
173 const bool has_destr2 = pool->destr2;
962
cd418898af5c remove cx_for_n() macro - fixes #467
Mike Becker <universe@uap-core.de>
parents: 947
diff changeset
174 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
175 struct cx_mempool_memory_s *mem = pool->data[i];
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
176 if (mem->destructor) {
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
177 mem->destructor(mem->c);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
178 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
179 if (has_destr) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
180 pool->destr(mem->c);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
181 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
182 if (has_destr2) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
183 pool->destr2(pool->destr2_data, mem->c);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
184 }
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
185 cxFreeDefault(mem);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
186 }
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
187 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
188
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
189 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
190 cx_mempool_malloc_simple,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
191 cx_mempool_realloc_simple,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
192 cx_mempool_calloc_simple,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
193 cx_mempool_free_simple
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
194 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
195
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
196 static void *cx_mempool_malloc_advanced(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
197 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
198 size_t n
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
199 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
200 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
201
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
202 if (cx_mempool_ensure_capacity(pool, pool->size + 1)) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
203 return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
204 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
205
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
206 struct cx_mempool_memory2_s *mem =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
207 cxMallocDefault(sizeof(struct cx_mempool_memory_s) + n);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
208 if (mem == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
209 mem->destructor = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
210 mem->data = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
211 pool->data[pool->size] = mem;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
212 pool->size++;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
213
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
214 return mem->c;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
215 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
216
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
217 static void *cx_mempool_calloc_advanced(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
218 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
219 size_t nelem,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
220 size_t elsize
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
221 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
222 size_t msz;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
223 if (cx_szmul(nelem, elsize, &msz)) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
224 errno = EOVERFLOW;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
225 return NULL;
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 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
228 if (ptr == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
229 memset(ptr, 0, nelem * elsize);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
230 return ptr;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
231 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
232
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
233 static void *cx_mempool_realloc_advanced(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
234 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
235 void *ptr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
236 size_t n
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
237 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
238 struct cx_mempool_s *pool = p;
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 const unsigned overhead = sizeof(struct cx_mempool_memory2_s);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
241 struct cx_mempool_memory2_s *mem =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
242 (void *) (((char *) ptr) - overhead);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
243 struct cx_mempool_memory2_s *newm =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
244 cxReallocDefault(mem, n + overhead);
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 if (newm == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
247 if (mem != newm) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
248 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
249 if (pool->data[i] == mem) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
250 pool->data[i] = newm;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
251 return ((char*)newm) + overhead;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
252 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
253 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
254 abort(); // LCOV_EXCL_LINE
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
255 } else {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
256 return ptr;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
257 }
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
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
260 static void cx_mempool_free_advanced(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
261 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
262 void *ptr
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
263 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
264 if (!ptr) return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
265 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
266
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
267 struct cx_mempool_memory2_s *mem =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
268 (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
269
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
270 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
271 if (mem == pool->data[i]) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
272 if (mem->destructor) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
273 mem->destructor(mem->data, mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
274 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
275 if (pool->destr) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
276 pool->destr(mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
277 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
278 if (pool->destr2) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
279 pool->destr2(pool->destr2_data, mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
280 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
281 cxFreeDefault(mem);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
282 size_t last_index = pool->size - 1;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
283 if (i != last_index) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
284 pool->data[i] = pool->data[last_index];
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
285 pool->data[last_index] = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
286 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
287 pool->size--;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
288 return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
289 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
290 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
291 abort(); // LCOV_EXCL_LINE
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
292 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
293
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
294 static void cx_mempool_free_all_advanced(const struct cx_mempool_s *pool) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
295 const bool has_destr = pool->destr;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
296 const bool has_destr2 = pool->destr2;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
297 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
298 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
299 if (mem->destructor) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
300 mem->destructor(mem->data, mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
301 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
302 if (has_destr) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
303 pool->destr(mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
304 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
305 if (has_destr2) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
306 pool->destr2(pool->destr2_data, mem->c);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
307 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
308 cxFreeDefault(mem);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
309 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
310 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
311
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
312 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
313 cx_mempool_malloc_advanced,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
314 cx_mempool_realloc_advanced,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
315 cx_mempool_calloc_advanced,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
316 cx_mempool_free_advanced
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
317 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
318
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
319
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
320 static void *cx_mempool_malloc_pure(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
321 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
322 size_t n
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
323 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
324 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
325
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
326 if (cx_mempool_ensure_capacity(pool, pool->size + 1)) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
327 return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
328 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
329
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
330 void *mem = cxMallocDefault(n);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
331 if (mem == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
332 pool->data[pool->size] = mem;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
333 pool->size++;
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 return mem;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
336 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
337
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
338 static void *cx_mempool_calloc_pure(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
339 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
340 size_t nelem,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
341 size_t elsize
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 size_t msz;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
344 if (cx_szmul(nelem, elsize, &msz)) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
345 errno = EOVERFLOW;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
346 return NULL;
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 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
349 if (ptr == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
350 memset(ptr, 0, nelem * elsize);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
351 return ptr;
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
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
354 static void *cx_mempool_realloc_pure(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
355 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
356 void *ptr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
357 size_t n
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 struct cx_mempool_s *pool = p;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
360 void *newm = cxReallocDefault(ptr, n);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
361 if (newm == NULL) return NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
362 if (ptr != newm) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
363 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
364 if (pool->data[i] == ptr) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
365 pool->data[i] = newm;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
366 return newm;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
367 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
368 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
369 abort(); // LCOV_EXCL_LINE
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
370 } else {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
371 return ptr;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
372 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
373 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
374
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
375 static void cx_mempool_free_pure(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
376 void *p,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
377 void *ptr
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
378 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
379 if (!ptr) return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
380 struct cx_mempool_s *pool = p;
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 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
383 if (ptr == pool->data[i]) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
384 if (pool->destr) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
385 pool->destr(ptr);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
386 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
387 if (pool->destr2) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
388 pool->destr2(pool->destr2_data, ptr);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
389 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
390 cxFreeDefault(ptr);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
391 size_t last_index = pool->size - 1;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
392 if (i != last_index) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
393 pool->data[i] = pool->data[last_index];
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
394 pool->data[last_index] = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
395 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
396 pool->size--;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
397 return;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
398 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
399 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
400 abort(); // LCOV_EXCL_LINE
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
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
403 static void cx_mempool_free_all_pure(const struct cx_mempool_s *pool) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
404 const bool has_destr = pool->destr;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
405 const bool has_destr2 = pool->destr2;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
406 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
407 void *mem = pool->data[i];
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
408 if (has_destr) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
409 pool->destr(mem);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
410 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
411 if (has_destr2) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
412 pool->destr2(pool->destr2_data, mem);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
413 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
414 cxFreeDefault(mem);
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
415 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
416 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
417
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
418 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
419 cx_mempool_malloc_pure,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
420 cx_mempool_realloc_pure,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
421 cx_mempool_calloc_pure,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
422 cx_mempool_free_pure
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
423 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
424
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
425 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
426 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
427 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
428 if (info.destr2_data == NULL) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
429 if (info.destr) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
430 info.destr(info.mem);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
431 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
432 } else {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
433 info.destr2(info.destr2_data, info.mem);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
434 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
435 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
436 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
437
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
438 void cxMempoolFree(CxMempool *pool) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
439 if (pool == NULL) return;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
440 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
441 cx_mempool_free_all_simple(pool);
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
442 } 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
443 cx_mempool_free_all_advanced(pool);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
444 } else {
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
445 cx_mempool_free_all_pure(pool);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
446 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
447 cx_mempool_free_foreign(pool);
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
448 cxFreeDefault(pool->data);
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
449 cxFreeDefault(pool->registered);
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
450 cxFreeDefault((void*) pool->allocator);
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
451 cxFreeDefault(pool);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
452 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
453
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
454 void cxMempoolSetDestructor(
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
455 void *ptr,
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
456 cx_destructor_func func
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
457 ) {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
458 *(cx_destructor_func *) ((char *) ptr - sizeof(cx_destructor_func)) = func;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
459 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
460
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
461 void cxMempoolSetDestructor2(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
462 void *ptr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
463 cx_destructor_func2 func,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
464 void *data
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
465 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
466 struct cx_mempool_memory2_s *info =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
467 (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
468 info->destructor = func;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
469 info->data = data;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
470 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
471
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
472 void cxMempoolRemoveDestructor(void *ptr) {
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
473 *(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
474 }
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 970
diff changeset
475
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
476 void cxMempoolRemoveDestructor2(void *ptr) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
477 struct cx_mempool_memory2_s *info =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
478 (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
479 info->destructor = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
480 info->data = NULL;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
481 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
482
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
483 int cxMempoolRegister(
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
484 CxMempool *pool,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
485 void *memory,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
486 cx_destructor_func destr
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
487 ) {
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
488 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
489 return 1; // LCOV_EXCL_LINE
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
490 }
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
491
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
492 pool->registered[pool->registered_size++] =
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
493 (struct cx_mempool_foreign_memory_s) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
494 .mem = memory,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
495 .destr = destr,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
496 .destr2_data = NULL
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
497 };
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
498
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
499 return 0;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
500 }
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
501
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
502 int cxMempoolRegister2(
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
503 CxMempool *pool,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
504 void *memory,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
505 cx_destructor_func2 destr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
506 void *data
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
507 ) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
508 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
509 return 1; // LCOV_EXCL_LINE
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
510 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
511
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
512 pool->registered[pool->registered_size++] =
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
513 (struct cx_mempool_foreign_memory_s) {
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
514 .mem = memory,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
515 .destr2 = destr,
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
516 .destr2_data = data
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
517 };
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
518
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
519 return 0;
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
520 }
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
521
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
522 CxMempool *cxMempoolCreate(
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
523 size_t capacity,
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
524 enum cx_mempool_type type
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
525 ) {
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
526 if (capacity == 0) capacity = 16;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
527 size_t poolsize;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
528 if (cx_szmul(capacity, sizeof(void*), &poolsize)) {
1040
1ecf4dbbc60c add some more overflow treatment and make sure to set errno properly
Mike Becker <universe@uap-core.de>
parents: 993
diff changeset
529 errno = EOVERFLOW;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
530 return NULL;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
531 }
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
532
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
533 CxAllocator *provided_allocator = cxMallocDefault(sizeof(CxAllocator));
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
534 if (provided_allocator == NULL) { // LCOV_EXCL_START
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
535 return NULL;
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
536 } // LCOV_EXCL_STOP
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
537
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
538 CxMempool *pool = cxCallocDefault(1, sizeof(CxMempool));
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
539 if (pool == NULL) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
540 cxFreeDefault(provided_allocator);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
541 return NULL;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
542 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
543
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
544 provided_allocator->data = pool;
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
545 pool->allocator = provided_allocator;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
546 if (type == CX_MEMPOOL_TYPE_SIMPLE) {
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
547 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
548 } 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
549 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
550 } else {
1324
399f7bb81d11 improve mempool destructor support (2/3)
Mike Becker <universe@uap-core.de>
parents: 1323
diff changeset
551 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
552 }
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
553
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
554 pool->data = cxMallocDefault(poolsize);
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
555 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
556 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
557 cxFreeDefault(pool);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
558 return NULL;
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
559 } // LCOV_EXCL_STOP
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
560
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
561 pool->size = 0;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 650
diff changeset
562 pool->capacity = capacity;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
563
1065
6eb7b54975ee improve coverage metrics
Mike Becker <universe@uap-core.de>
parents: 1040
diff changeset
564 return pool;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
565 }
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
566
1325
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
567 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
568 pool->destr = fnc;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
569 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
570
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
571 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
572 pool->destr2 = fnc;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
573 pool->destr2_data = data;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
574 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
575
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1283
diff changeset
576 static void cx_mempool_free_transferred_allocator(void *al) {
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
577 cxFreeDefault(al);
1318
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1283
diff changeset
578 }
12fa1d37fe48 allow changing the cxDefaultAllocator - resolves #669
Mike Becker <universe@uap-core.de>
parents: 1283
diff changeset
579
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
580 int cxMempoolTransfer(
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
581 CxMempool *source,
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
582 CxMempool *dest
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
583 ) {
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
584 // safety checks
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
585 if (source == dest) return 1;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
586 if (source->allocator->cl != dest->allocator->cl) return 1;
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
587
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
588 // 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
589 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
590 return 1; // LCOV_EXCL_LINE
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
591 }
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
592 if (cx_mempool_ensure_registered_capacity(dest,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
593 dest->registered_size + source->registered_size)) {
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
594 return 1; // LCOV_EXCL_LINE
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
595 }
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
596
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
597 // allocate a replacement allocator for the source pool
1319
aa1f580f8f59 add convenience macros for using the default allocator - relates to #669
Mike Becker <universe@uap-core.de>
parents: 1318
diff changeset
598 CxAllocator *new_source_allocator = cxMallocDefault(sizeof(CxAllocator));
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
599 if (new_source_allocator == NULL) { // LCOV_EXCL_START
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
600 return 1;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
601 } // LCOV_EXCL_STOP
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
602 new_source_allocator->cl = source->allocator->cl;
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
603 new_source_allocator->data = source;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
604
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
605 // transfer all the data
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
606 memcpy(&dest->data[dest->size], source->data, sizeof(void*)*source->size);
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
607 dest->size += source->size;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
608
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
609 // transfer all registered memory
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
610 memcpy(&dest->registered[dest->registered_size], source->registered,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
611 sizeof(struct cx_mempool_foreign_memory_s) * source->size);
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
612 dest->registered_size += source->registered_size;
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
613
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
614 // register the old allocator with the new pool
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
615 // we have to remove const-ness for this, but that's okay here
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
616 CxAllocator *transferred_allocator = (CxAllocator*) source->allocator;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
617 transferred_allocator->data = dest;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
618 cxMempoolRegister(dest, transferred_allocator,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
619 cx_mempool_free_transferred_allocator);
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
620
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
621 // prepare the source pool for re-use
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
622 source->allocator = new_source_allocator;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
623 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
624 memset(source->registered, 0,
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
625 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
626 source->size = 0;
1323
deccdb82f24e improve mempool destructor support (1/3)
Mike Becker <universe@uap-core.de>
parents: 1319
diff changeset
627 source->registered_size = 0;
1281
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
628
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
629 return 0;
45746a08c59e add cxMempoolTransfer() - partially resolves #640
Mike Becker <universe@uap-core.de>
parents: 1065
diff changeset
630 }
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
631
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
632 int cxMempoolTransferObject(
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
633 CxMempool *source,
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
634 CxMempool *dest,
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
635 const void *obj
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
636 ) {
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
637 // safety check
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
638 if (source == dest) return 1;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
639
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
640 // search for the object
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
641 for (size_t i = 0; i < source->size; i++) {
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
642 struct cx_mempool_memory_s *mem = source->data[i];
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
643 if (mem->c == obj) {
1325
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
644 // 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
645 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
646 return 1; // LCOV_EXCL_LINE
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
647 }
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
648 // remove from the source pool
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
649 size_t last_index = source->size - 1;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
650 if (i != last_index) {
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
651 source->data[i] = source->data[last_index];
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
652 source->data[last_index] = NULL;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
653 }
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
654 source->size--;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
655 // add to the target pool
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
656 dest->data[dest->size++] = mem;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
657 return 0;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
658 }
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
659 }
1325
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
660 // search in the registered objects
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
661 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
662 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
663 if (mem->mem == obj) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
664 // 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
665 if (cx_mempool_ensure_registered_capacity(dest,
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
666 dest->registered_size + 1)) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
667 return 1; // LCOV_EXCL_LINE
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
668 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
669 dest->registered[dest->registered_size++] = *mem;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
670 // remove from the source pool
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
671 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
672 if (i != last_index) {
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
673 source->registered[i] = source->registered[last_index];
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
674 memset(&source->registered[last_index], 0,
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
675 sizeof(struct cx_mempool_foreign_memory_s));
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
676 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
677 source->registered_size--;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
678 return 0;
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
679 }
20caf6efaf07 improve mempool destructor support (3/3)
Mike Becker <universe@uap-core.de>
parents: 1324
diff changeset
680 }
1283
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
681 // not found
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
682 return 1;
89935fea4b7c add cxMempoolTransferObject() - resolves #640
Mike Becker <universe@uap-core.de>
parents: 1281
diff changeset
683 }

mercurial