src/cx/allocator.h

Tue, 04 Oct 2022 19:25:07 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 04 Oct 2022 19:25:07 +0200
changeset 591
7df0bcaecffa
parent 528
4fbfac557df8
child 628
1e2be40f0cb5
permissions
-rw-r--r--

fix over-optimization of strstr

1. it's actually less performant to frequently read bytes
from an array instead of using the native word length
2. the SBO buffer should be local and not static to allow
multi-threading usage

391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
f094a53c1178 adds allocator interface and default 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
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
28 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
29 * \file allocator.h
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
30 * Interface for custom allocators.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
31 */
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 #ifndef UCX_ALLOCATOR_H
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 #define UCX_ALLOCATOR_H
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35
484
9e6900b1cf9d add common.h include to all other header files
Mike Becker <universe@uap-core.de>
parents: 465
diff changeset
36 #include "common.h"
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37
415
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
38 #ifdef __cplusplus
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
39 extern "C" {
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
40 #endif
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
41
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
42 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
43 * The class definition for an allocator.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
44 */
396
3539dd99ab92 make cx_allocator_class shared
Mike Becker <universe@uap-core.de>
parents: 394
diff changeset
45 typedef struct {
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
46 /**
465
1e3cb39815f8 remove redundant documentation for function pointers
Mike Becker <universe@uap-core.de>
parents: 461
diff changeset
47 * The allocator's malloc() implementation.
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
48 */
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
49 void *(*malloc)(
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
50 void *data,
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
51 size_t n
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
52 );
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
53
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
54 /**
465
1e3cb39815f8 remove redundant documentation for function pointers
Mike Becker <universe@uap-core.de>
parents: 461
diff changeset
55 * The allocator's realloc() implementation.
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
56 */
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
57 void *(*realloc)(
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
58 void *data,
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
59 void *mem,
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
60 size_t n
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
61 )
450
7960298039cf improves usage of attributes
Mike Becker <universe@uap-core.de>
parents: 434
diff changeset
62 __attribute__((__warn_unused_result__));
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
63
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
64 /**
465
1e3cb39815f8 remove redundant documentation for function pointers
Mike Becker <universe@uap-core.de>
parents: 461
diff changeset
65 * The allocator's calloc() implementation.
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
66 */
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
67 void *(*calloc)(
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
68 void *data,
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
69 size_t nelem,
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
70 size_t n
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
71 );
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
72
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
73 /**
465
1e3cb39815f8 remove redundant documentation for function pointers
Mike Becker <universe@uap-core.de>
parents: 461
diff changeset
74 * The allocator's free() implementation.
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
75 */
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
76 void (*free)(
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
77 void *data,
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
78 void *mem
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
79 )
450
7960298039cf improves usage of attributes
Mike Becker <universe@uap-core.de>
parents: 434
diff changeset
80 __attribute__((__nonnull__));
396
3539dd99ab92 make cx_allocator_class shared
Mike Becker <universe@uap-core.de>
parents: 394
diff changeset
81 } cx_allocator_class;
3539dd99ab92 make cx_allocator_class shared
Mike Becker <universe@uap-core.de>
parents: 394
diff changeset
82
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
83 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
84 * Structure holding the data for an allocator.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
85 */
394
80c31ebd66c1 high level allocator functions should be real functions, not macros
Mike Becker <universe@uap-core.de>
parents: 393
diff changeset
86 struct cx_allocator_s {
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
87 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
88 * A pointer to the instance of the allocator class.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
89 */
396
3539dd99ab92 make cx_allocator_class shared
Mike Becker <universe@uap-core.de>
parents: 394
diff changeset
90 cx_allocator_class *cl;
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
91 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
92 * A pointer to the data this allocator uses.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
93 */
397
cfc1193b1e65 removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
94 void *data;
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 };
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
96
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
97 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
98 * High-Level type alias for the allocator type.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
99 */
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
100 typedef struct cx_allocator_s CxAllocator;
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
102 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
103 * A default allocator using standard library malloc() etc.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
104 */
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
105 extern CxAllocator *cxDefaultAllocator;
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
107 /**
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
108 * Function pointer type for destructor functions.
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
109 *
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
110 * A destructor function deallocates possible contents and MAY free the memory
526
b070ef465313 simplify destructor signature (but loads more responsibility onto the user)
Mike Becker <universe@uap-core.de>
parents: 508
diff changeset
111 * pointed to by \p memory. Read the documentation of the respective function
b070ef465313 simplify destructor signature (but loads more responsibility onto the user)
Mike Becker <universe@uap-core.de>
parents: 508
diff changeset
112 * pointer to learn if a destructor SHALL, MAY, or MUST NOT free the memory in that
b070ef465313 simplify destructor signature (but loads more responsibility onto the user)
Mike Becker <universe@uap-core.de>
parents: 508
diff changeset
113 * particular implementation.
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
114 *
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
115 * @param memory a pointer to the object to destruct
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
116 */
526
b070ef465313 simplify destructor signature (but loads more responsibility onto the user)
Mike Becker <universe@uap-core.de>
parents: 508
diff changeset
117 typedef void (*cx_destructor_func)(void *memory) __attribute__((__nonnull__));
503
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
118
a89857072ace add new destructor API and apply it to CxList
Mike Becker <universe@uap-core.de>
parents: 500
diff changeset
119 /**
528
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
120 * Function pointer type for destructor functions.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
121 *
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
122 * A destructor function deallocates possible contents and MAY free the memory
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
123 * pointed to by \p memory. Read the documentation of the respective function
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
124 * pointer to learn if a destructor SHALL, MAY, or MUST NOT free the memory in that
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
125 * particular implementation.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
126 *
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
127 * @param data an optional pointer to custom data
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
128 * @param memory a pointer to the object to destruct
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
129 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
130 typedef void (*cx_destructor_func2)(
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
131 void *data,
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
132 void *memory
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
133 ) __attribute__((__nonnull__(2)));
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
134
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
135 /**
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
136 * Structure holding an advanced destructor function and the desired payload.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
137 * Invocations of func should use data as first argument.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
138 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
139 typedef struct {
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
140 /**
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
141 * A pointer to the data that SHALL be used to invoke func.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
142 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
143 void *data;
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
144 /**
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
145 * A pointer to the function to invoke.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
146 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
147 cx_destructor_func2 func;
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
148 } cx_advanced_destructor;
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
149
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
150 /**
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
151 * Specifies the type of destructor to use.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
152 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
153 enum cx_destructor_type {
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
154 /**
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
155 * Do not use a destructor function.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
156 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
157 CX_DESTRUCTOR_NONE,
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
158 /**
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
159 * Use a simple destructor.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
160 * @see cx_destructor_func
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
161 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
162 CX_DESTRUCTOR_SIMPLE,
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
163 /**
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
164 * Use an advanced destructor.
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
165 * @see cx_advanced_destructor
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
166 */
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
167 CX_DESTRUCTOR_ADVANCED
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
168 };
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
169
4fbfac557df8 #179 improve API for list content destruction
Mike Becker <universe@uap-core.de>
parents: 526
diff changeset
170 /**
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
171 * Allocate \p n bytes of memory.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
172 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
173 * @param allocator the allocator
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
174 * @param n the number of bytes
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
175 * @return a pointer to the allocated memory
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
176 */
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
177 void *cxMalloc(
508
8aea65ae1eaf #168 - add attributes and const
Mike Becker <universe@uap-core.de>
parents: 503
diff changeset
178 CxAllocator const *allocator,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
179 size_t n
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
180 )
461
005c2791c2e2 put attributes on separate lines
Mike Becker <universe@uap-core.de>
parents: 452
diff changeset
181 __attribute__((__malloc__))
005c2791c2e2 put attributes on separate lines
Mike Becker <universe@uap-core.de>
parents: 452
diff changeset
182 __attribute__((__alloc_size__(2)));
397
cfc1193b1e65 removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
183
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
184 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
185 * Re-allocate the previously allocated block in \p mem, making the new block \p n bytes long.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
186 * This function may return the same pointer that was passed to it, if moving the memory
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
187 * was not necessary.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
188 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
189 * \note Re-allocating a block allocated by a different allocator is undefined.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
190 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
191 * @param allocator the allocator
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
192 * @param mem pointer to the previously allocated block
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
193 * @param n the new size in bytes
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
194 * @return a pointer to the re-allocated memory
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
195 */
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
196 void *cxRealloc(
508
8aea65ae1eaf #168 - add attributes and const
Mike Becker <universe@uap-core.de>
parents: 503
diff changeset
197 CxAllocator const *allocator,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
198 void *mem,
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
199 size_t n
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
200 )
461
005c2791c2e2 put attributes on separate lines
Mike Becker <universe@uap-core.de>
parents: 452
diff changeset
201 __attribute__((__warn_unused_result__))
005c2791c2e2 put attributes on separate lines
Mike Becker <universe@uap-core.de>
parents: 452
diff changeset
202 __attribute__((__alloc_size__(3)));
397
cfc1193b1e65 removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
203
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
204 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
205 * Re-allocate a previously allocated block and changes the pointer in-place, if necessary.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
206 * This function acts like cxRealloc() using the pointer pointed to by \p mem.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
207 * On success, the pointer is changed to the new location (in case the
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
208 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
209 * \note Re-allocating a block allocated by a different allocator is undefined.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
210 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
211 * \par Error handling
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
212 * \c errno will be set, if the underlying realloc function does so.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
213 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
214 * @param allocator the allocator
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
215 * @param mem pointer to the pointer to allocated block
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
216 * @param n the new size in bytes
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
217 * @return zero on success, non-zero on failure
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
218 */
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
219 int cxReallocate(
508
8aea65ae1eaf #168 - add attributes and const
Mike Becker <universe@uap-core.de>
parents: 503
diff changeset
220 CxAllocator const *allocator,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
221 void **mem,
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
222 size_t n
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
223 )
452
a10c3e127050 add __alloc_size__ attribute
Mike Becker <universe@uap-core.de>
parents: 450
diff changeset
224 __attribute__((__nonnull__));
414
81a4c3a63e65 adds cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 405
diff changeset
225
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
226 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
227 * Allocate \p nelem elements of \p n bytes each, all initialized to zero.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
228 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
229 * @param allocator the allocator
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
230 * @param nelem the number of elements
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
231 * @param n the size of each element in bytes
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
232 * @return a pointer to the allocated memory
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
233 */
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
234 void *cxCalloc(
508
8aea65ae1eaf #168 - add attributes and const
Mike Becker <universe@uap-core.de>
parents: 503
diff changeset
235 CxAllocator const *allocator,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
236 size_t nelem,
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
237 size_t n
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
238 )
461
005c2791c2e2 put attributes on separate lines
Mike Becker <universe@uap-core.de>
parents: 452
diff changeset
239 __attribute__((__malloc__))
005c2791c2e2 put attributes on separate lines
Mike Becker <universe@uap-core.de>
parents: 452
diff changeset
240 __attribute__((__alloc_size__(2, 3)));
397
cfc1193b1e65 removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
241
429
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
242 /**
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
243 * Free a block allocated by this allocator.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
244 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
245 * \note Freeing a block of a different allocator is undefined.
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
246 *
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
247 * @param allocator the allocator
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
248 * @param mem a pointer to the block to free
3d8235c96a27 add documentation to allocator.h
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
249 */
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
250 void cxFree(
508
8aea65ae1eaf #168 - add attributes and const
Mike Becker <universe@uap-core.de>
parents: 503
diff changeset
251 CxAllocator const *allocator,
500
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
252 void *mem
eb9e7bd40a8e do not hide pointers behind typedefs
Mike Becker <universe@uap-core.de>
parents: 484
diff changeset
253 )
452
a10c3e127050 add __alloc_size__ attribute
Mike Becker <universe@uap-core.de>
parents: 450
diff changeset
254 __attribute__((__nonnull__));
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
255
415
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
256 #ifdef __cplusplus
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
257 } /* extern "C" */
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
258 #endif
067aa769796a fix missing extern "C"
Mike Becker <universe@uap-core.de>
parents: 414
diff changeset
259
393
8c0421ccbb58 no C99 comments
Mike Becker <universe@uap-core.de>
parents: 391
diff changeset
260 #endif /* UCX_ALLOCATOR_H */

mercurial