src/mempool.c

Wed, 21 Jan 2026 22:24:28 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 21 Jan 2026 22:24:28 +0100
changeset 1702
3f05e8f97b22
parent 1452
26e006ba651d
permissions
-rw-r--r--

mempool.h - internalize structs that are not C++ compatible

relates to #799

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

mercurial