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