|
11 | 11 | extern "C" {
|
12 | 12 | #endif
|
13 | 13 |
|
14 |
| -#ifndef Py_LIMITED_API |
15 |
| -PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); |
16 |
| -PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); |
17 |
| -PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); |
18 |
| -PyAPI_FUNC(void) PyMem_RawFree(void *ptr); |
19 |
| - |
20 |
| -/* Configure the Python memory allocators. Pass NULL to use default |
21 |
| - allocators. */ |
22 |
| -PyAPI_FUNC(int) _PyMem_SetupAllocators(const char *opt); |
23 |
| - |
24 |
| -/* Try to get the allocators name set by _PyMem_SetupAllocators(). */ |
25 |
| -PyAPI_FUNC(const char*) _PyMem_GetAllocatorsName(void); |
26 |
| -#endif /* !defined(Py_LIMITED_API) */ |
27 |
| - |
28 |
| - |
29 | 14 | /* BEWARE:
|
30 | 15 |
|
31 | 16 | Each interface exports both functions and macros. Extension modules should
|
@@ -65,23 +50,9 @@ PyAPI_FUNC(const char*) _PyMem_GetAllocatorsName(void);
|
65 | 50 | */
|
66 | 51 |
|
67 | 52 | PyAPI_FUNC(void *) PyMem_Malloc(size_t size);
|
68 |
| -#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x03050000 |
69 |
| -PyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); |
70 |
| -#endif |
71 | 53 | PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size);
|
72 | 54 | PyAPI_FUNC(void) PyMem_Free(void *ptr);
|
73 | 55 |
|
74 |
| -#ifndef Py_LIMITED_API |
75 |
| -/* strdup() using PyMem_RawMalloc() */ |
76 |
| -PyAPI_FUNC(char *) _PyMem_RawStrdup(const char *str); |
77 |
| - |
78 |
| -/* strdup() using PyMem_Malloc() */ |
79 |
| -PyAPI_FUNC(char *) _PyMem_Strdup(const char *str); |
80 |
| - |
81 |
| -/* wcsdup() using PyMem_RawMalloc() */ |
82 |
| -PyAPI_FUNC(wchar_t*) _PyMem_RawWcsdup(const wchar_t *str); |
83 |
| -#endif |
84 |
| - |
85 | 56 | /* Macros. */
|
86 | 57 |
|
87 | 58 | /* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL
|
@@ -130,72 +101,6 @@ PyAPI_FUNC(wchar_t*) _PyMem_RawWcsdup(const wchar_t *str);
|
130 | 101 | #define PyMem_Del PyMem_Free
|
131 | 102 | #define PyMem_DEL PyMem_FREE
|
132 | 103 |
|
133 |
| -#ifndef Py_LIMITED_API |
134 |
| -typedef enum { |
135 |
| - /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */ |
136 |
| - PYMEM_DOMAIN_RAW, |
137 |
| - |
138 |
| - /* PyMem_Malloc(), PyMem_Realloc() and PyMem_Free() */ |
139 |
| - PYMEM_DOMAIN_MEM, |
140 |
| - |
141 |
| - /* PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() */ |
142 |
| - PYMEM_DOMAIN_OBJ |
143 |
| -} PyMemAllocatorDomain; |
144 |
| - |
145 |
| -typedef struct { |
146 |
| - /* user context passed as the first argument to the 4 functions */ |
147 |
| - void *ctx; |
148 |
| - |
149 |
| - /* allocate a memory block */ |
150 |
| - void* (*malloc) (void *ctx, size_t size); |
151 |
| - |
152 |
| - /* allocate a memory block initialized by zeros */ |
153 |
| - void* (*calloc) (void *ctx, size_t nelem, size_t elsize); |
154 |
| - |
155 |
| - /* allocate or resize a memory block */ |
156 |
| - void* (*realloc) (void *ctx, void *ptr, size_t new_size); |
157 |
| - |
158 |
| - /* release a memory block */ |
159 |
| - void (*free) (void *ctx, void *ptr); |
160 |
| -} PyMemAllocatorEx; |
161 |
| - |
162 |
| -/* Get the memory block allocator of the specified domain. */ |
163 |
| -PyAPI_FUNC(void) PyMem_GetAllocator(PyMemAllocatorDomain domain, |
164 |
| - PyMemAllocatorEx *allocator); |
165 |
| - |
166 |
| -/* Set the memory block allocator of the specified domain. |
167 |
| -
|
168 |
| - The new allocator must return a distinct non-NULL pointer when requesting |
169 |
| - zero bytes. |
170 |
| -
|
171 |
| - For the PYMEM_DOMAIN_RAW domain, the allocator must be thread-safe: the GIL |
172 |
| - is not held when the allocator is called. |
173 |
| -
|
174 |
| - If the new allocator is not a hook (don't call the previous allocator), the |
175 |
| - PyMem_SetupDebugHooks() function must be called to reinstall the debug hooks |
176 |
| - on top on the new allocator. */ |
177 |
| -PyAPI_FUNC(void) PyMem_SetAllocator(PyMemAllocatorDomain domain, |
178 |
| - PyMemAllocatorEx *allocator); |
179 |
| - |
180 |
| -/* Setup hooks to detect bugs in the following Python memory allocator |
181 |
| - functions: |
182 |
| -
|
183 |
| - - PyMem_RawMalloc(), PyMem_RawRealloc(), PyMem_RawFree() |
184 |
| - - PyMem_Malloc(), PyMem_Realloc(), PyMem_Free() |
185 |
| - - PyObject_Malloc(), PyObject_Realloc() and PyObject_Free() |
186 |
| -
|
187 |
| - Newly allocated memory is filled with the byte 0xCB, freed memory is filled |
188 |
| - with the byte 0xDB. Additional checks: |
189 |
| -
|
190 |
| - - detect API violations, ex: PyObject_Free() called on a buffer allocated |
191 |
| - by PyMem_Malloc() |
192 |
| - - detect write before the start of the buffer (buffer underflow) |
193 |
| - - detect write after the end of the buffer (buffer overflow) |
194 |
| -
|
195 |
| - The function does nothing if Python is not compiled is debug mode. */ |
196 |
| -PyAPI_FUNC(void) PyMem_SetupDebugHooks(void); |
197 |
| -#endif /* Py_LIMITED_API */ |
198 |
| - |
199 | 104 | /* bpo-35053: expose _Py_tracemalloc_config for performance:
|
200 | 105 | _Py_NewReference() needs an efficient check to test if tracemalloc is
|
201 | 106 | tracing.
|
@@ -231,6 +136,13 @@ PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config;
|
231 | 136 | .max_nframe = 1, \
|
232 | 137 | .use_domain = 0}
|
233 | 138 |
|
| 139 | + |
| 140 | +#ifndef Py_LIMITED_API |
| 141 | +# define Py_CPYTHON_PYMEM_H |
| 142 | +# include "cpython/pymem.h" |
| 143 | +# undef Py_CPYTHON_PYMEM_H |
| 144 | +#endif |
| 145 | + |
234 | 146 | #ifdef __cplusplus
|
235 | 147 | }
|
236 | 148 | #endif
|
|
0 commit comments