src/cx/mempool.h

Sun, 22 Dec 2024 22:10:04 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 22 Dec 2024 22:10:04 +0100
changeset 1047
40aad3f0bc9e
parent 993
b642eca4b956
permissions
-rw-r--r--

don't trust that size_t always has word width

it should be the case on all platforms supported by UCX, but it's not strictly defined in POSIX that it must be the case

571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 /**
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 * \file mempool.h
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 * \brief Interface for memory pool implementations.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 * \author Mike Becker
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 * \author Olaf Wintermann
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 * \copyright 2-Clause BSD License
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 */
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36 #ifndef UCX_MEMPOOL_H
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 #define UCX_MEMPOOL_H
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38
681
502105523db7 fix common.h include problems - fixes #255
Mike Becker <universe@uap-core.de>
parents: 571
diff changeset
39 #include "common.h"
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 #include "allocator.h"
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 #ifdef __cplusplus
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 extern "C" {
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 #endif
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
46 /** Internal structure for pooled memory. */
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
47 struct cx_mempool_memory_s;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 /**
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 * The basic structure of a memory pool.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 * Should be the first member of an actual memory pool implementation.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 */
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 struct cx_mempool_s {
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
54 /** The provided allocator. */
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
55 const CxAllocator *allocator;
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
56
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 /**
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
58 * A destructor that shall be automatically registered for newly allocated memory.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
59 * This destructor MUST NOT free the memory.
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 */
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
61 cx_destructor_func auto_destr;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
62
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
63 /** Array of pooled memory. */
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
64 struct cx_mempool_memory_s **data;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
65
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
66 /** Number of pooled memory items. */
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
67 size_t size;
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
68
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
69 /** Memory pool capacity. */
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
70 size_t capacity;
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 };
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 /**
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 * Common type for all memory pool implementations.
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 */
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 typedef struct cx_mempool_s CxMempool;
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 /**
993
b642eca4b956 make names of destroy and free functions consistent - fixes #484
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
79 * Deallocates a memory pool and frees the managed memory.
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
80 *
993
b642eca4b956 make names of destroy and free functions consistent - fixes #484
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
81 * @param pool the memory pool to free
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
82 */
993
b642eca4b956 make names of destroy and free functions consistent - fixes #484
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
83 void cxMempoolFree(CxMempool *pool);
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
84
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
85 /**
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
86 * Creates an array-based memory pool with a shared destructor function.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
87 *
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
88 * This destructor MUST NOT free the memory.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
89 *
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
90 * @param capacity the initial capacity of the pool
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
91 * @param destr optional destructor function to use for allocated memory
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
92 * @return the created memory pool or \c NULL if allocation failed
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
94 cx_attr_nodiscard
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
95 cx_attr_malloc
993
b642eca4b956 make names of destroy and free functions consistent - fixes #484
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
96 cx_attr_dealloc(cxMempoolFree, 1)
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
97 CxMempool *cxMempoolCreate(size_t capacity, cx_destructor_func destr);
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
99 /**
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
100 * Creates a basic array-based memory pool.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
101 *
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
102 * @param capacity the initial capacity of the pool
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
103 * @return the created memory pool or \c NULL if allocation failed
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
104 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
105 #define cxBasicMempoolCreate(capacity) cxMempoolCreate(capacity, NULL)
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 /**
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
108 * Sets the destructor function for a specific allocated memory object.
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 *
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
110 * If the memory is not managed by a UCX memory pool, the behavior is undefined.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
111 * The destructor MUST NOT free the memory.
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 *
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
113 * @param memory the object allocated in the pool
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 * @param fnc the destructor function
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
116 cx_attr_nonnull
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
117 void cxMempoolSetDestructor(
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118 void *memory,
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 cx_destructor_func fnc
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
120 );
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
121
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
122 /**
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
123 * Removes the destructor function for a specific allocated memory object.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
124 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
125 * If the memory is not managed by a UCX memory pool, the behavior is undefined.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
126 * The destructor MUST NOT free the memory.
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
127 *
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
128 * @param memory the object allocated in the pool
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
129 */
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
130 cx_attr_nonnull
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
131 void cxMempoolRemoveDestructor(void *memory);
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
132
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
133 /**
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
134 * Registers foreign memory with this pool.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
135 *
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
136 * The destructor, in contrast to memory allocated by the pool, MUST free the memory.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
137 *
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
138 * A small portion of memory will be allocated to register the information in the pool.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
139 * If that allocation fails, this function will return non-zero.
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
140 *
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
141 * @param pool the pool
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
142 * @param memory the object to register (MUST NOT be already allocated in the pool)
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
143 * @param destr the destructor function
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
144 * @return zero on success, non-zero on failure
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
145 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
146 cx_attr_nonnull
727
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
147 int cxMempoolRegister(
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
148 CxMempool *pool,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
149 void *memory,
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
150 cx_destructor_func destr
d92a59f5d261 improve mempool implementation
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
151 );
571
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
152
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
153 #ifdef __cplusplus
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
154 } // extern "C"
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
155 #endif
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
156
f83583a0bbac #201 - add mempool implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
157 #endif // UCX_MEMPOOL_H

mercurial