• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef Py_INTERNAL_PYMEM_INIT_H
2 #define Py_INTERNAL_PYMEM_INIT_H
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 
7 #ifndef Py_BUILD_CORE
8 #  error "this header requires Py_BUILD_CORE define"
9 #endif
10 
11 
12 /********************************/
13 /* the allocators' initializers */
14 
15 extern void * _PyMem_RawMalloc(void *, size_t);
16 extern void * _PyMem_RawCalloc(void *, size_t, size_t);
17 extern void * _PyMem_RawRealloc(void *, void *, size_t);
18 extern void _PyMem_RawFree(void *, void *);
19 #define PYRAW_ALLOC {NULL, _PyMem_RawMalloc, _PyMem_RawCalloc, _PyMem_RawRealloc, _PyMem_RawFree}
20 
21 #ifdef Py_GIL_DISABLED
22 // Py_GIL_DISABLED requires mimalloc
23 extern void* _PyObject_MiMalloc(void *, size_t);
24 extern void* _PyObject_MiCalloc(void *, size_t, size_t);
25 extern void _PyObject_MiFree(void *, void *);
26 extern void* _PyObject_MiRealloc(void *, void *, size_t);
27 #  define PYOBJ_ALLOC {NULL, _PyObject_MiMalloc, _PyObject_MiCalloc, _PyObject_MiRealloc, _PyObject_MiFree}
28 extern void* _PyMem_MiMalloc(void *, size_t);
29 extern void* _PyMem_MiCalloc(void *, size_t, size_t);
30 extern void _PyMem_MiFree(void *, void *);
31 extern void* _PyMem_MiRealloc(void *, void *, size_t);
32 #  define PYMEM_ALLOC {NULL, _PyMem_MiMalloc, _PyMem_MiCalloc, _PyMem_MiRealloc, _PyMem_MiFree}
33 #elif defined(WITH_PYMALLOC)
34 extern void* _PyObject_Malloc(void *, size_t);
35 extern void* _PyObject_Calloc(void *, size_t, size_t);
36 extern void _PyObject_Free(void *, void *);
37 extern void* _PyObject_Realloc(void *, void *, size_t);
38 #  define PYOBJ_ALLOC {NULL, _PyObject_Malloc, _PyObject_Calloc, _PyObject_Realloc, _PyObject_Free}
39 #  define PYMEM_ALLOC PYOBJ_ALLOC
40 #else
41 # define PYOBJ_ALLOC PYRAW_ALLOC
42 # define PYMEM_ALLOC PYOBJ_ALLOC
43 #endif  // WITH_PYMALLOC
44 
45 
46 extern void* _PyMem_DebugRawMalloc(void *, size_t);
47 extern void* _PyMem_DebugRawCalloc(void *, size_t, size_t);
48 extern void* _PyMem_DebugRawRealloc(void *, void *, size_t);
49 extern void _PyMem_DebugRawFree(void *, void *);
50 
51 extern void* _PyMem_DebugMalloc(void *, size_t);
52 extern void* _PyMem_DebugCalloc(void *, size_t, size_t);
53 extern void* _PyMem_DebugRealloc(void *, void *, size_t);
54 extern void _PyMem_DebugFree(void *, void *);
55 
56 #define PYDBGRAW_ALLOC(runtime) \
57     {&(runtime).allocators.debug.raw, _PyMem_DebugRawMalloc, _PyMem_DebugRawCalloc, _PyMem_DebugRawRealloc, _PyMem_DebugRawFree}
58 #define PYDBGMEM_ALLOC(runtime) \
59     {&(runtime).allocators.debug.mem, _PyMem_DebugMalloc, _PyMem_DebugCalloc, _PyMem_DebugRealloc, _PyMem_DebugFree}
60 #define PYDBGOBJ_ALLOC(runtime) \
61     {&(runtime).allocators.debug.obj, _PyMem_DebugMalloc, _PyMem_DebugCalloc, _PyMem_DebugRealloc, _PyMem_DebugFree}
62 
63 extern void * _PyMem_ArenaAlloc(void *, size_t);
64 extern void _PyMem_ArenaFree(void *, void *, size_t);
65 
66 #ifdef Py_DEBUG
67 # define _pymem_allocators_standard_INIT(runtime) \
68     { \
69         PYDBGRAW_ALLOC(runtime), \
70         PYDBGMEM_ALLOC(runtime), \
71         PYDBGOBJ_ALLOC(runtime), \
72     }
73 # define _pymem_is_debug_enabled_INIT 1
74 #else
75 # define _pymem_allocators_standard_INIT(runtime) \
76     { \
77         PYRAW_ALLOC, \
78         PYMEM_ALLOC, \
79         PYOBJ_ALLOC, \
80     }
81 # define _pymem_is_debug_enabled_INIT 0
82 #endif
83 
84 #define _pymem_allocators_debug_INIT \
85    { \
86        {'r', PYRAW_ALLOC}, \
87        {'m', PYMEM_ALLOC}, \
88        {'o', PYOBJ_ALLOC}, \
89    }
90 
91 #  define _pymem_allocators_obj_arena_INIT \
92     { NULL, _PyMem_ArenaAlloc, _PyMem_ArenaFree }
93 
94 
95 #define _Py_mem_free_queue_INIT(queue) \
96     { \
97         .head = LLIST_INIT(queue.head), \
98     }
99 
100 #ifdef __cplusplus
101 }
102 #endif
103 #endif  // !Py_INTERNAL_PYMEM_INIT_H
104