1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use libc::{c_void, size_t};

#[cfg(Py_3_4)]
#[cfg(not(Py_LIMITED_API))]
#[cfg_attr(windows, link(name="pythonXY"))] extern "C" {
    pub fn PyMem_RawMalloc(size: size_t) -> *mut c_void;
    #[cfg(Py_3_5)]
    pub fn PyMem_RawCalloc(nelem: size_t, elsize: size_t)
     -> *mut c_void;
    pub fn PyMem_RawRealloc(ptr: *mut c_void, new_size: size_t)
     -> *mut c_void;
    pub fn PyMem_RawFree(ptr: *mut c_void) -> ();
}

#[cfg_attr(windows, link(name="pythonXY"))] extern "C" {
    pub fn PyMem_Malloc(size: size_t) -> *mut c_void;
    #[cfg(Py_3_5)]
    pub fn PyMem_Calloc(nelem: size_t, elsize: size_t) -> *mut c_void;
    pub fn PyMem_Realloc(ptr: *mut c_void, new_size: size_t)
     -> *mut c_void;
    pub fn PyMem_Free(ptr: *mut c_void) -> ();
}

#[cfg(Py_3_4)]
#[cfg(not(Py_LIMITED_API))]
#[repr(C)]
#[derive(Copy, Clone)]
pub enum PyMemAllocatorDomain {
    PYMEM_DOMAIN_RAW,
    PYMEM_DOMAIN_MEM,
    PYMEM_DOMAIN_OBJ
}

#[repr(C)]
#[derive(Copy, Clone)]
#[cfg(all(Py_3_4, not(Py_3_5), not(Py_LIMITED_API)))]
pub struct PyMemAllocator {
    pub ctx: *mut c_void,
    pub malloc: Option<extern "C" fn(ctx: *mut c_void,
                                                    size: size_t)
                                          -> *mut c_void>,
    pub realloc: Option<extern "C" fn(ctx: *mut c_void,
                                                     ptr: *mut c_void,
                                                     new_size: size_t)
                                           -> *mut c_void>,
    pub free: Option<extern "C" fn(ctx: *mut c_void,
                                                  ptr: *mut c_void)
                                        -> ()>,
}

#[repr(C)]
#[derive(Copy, Clone)]
#[cfg(all(Py_3_5, not(Py_LIMITED_API)))]
pub struct PyMemAllocatorEx {
    pub ctx: *mut c_void,
    pub malloc: Option<extern "C" fn(ctx: *mut c_void,
                                                    size: size_t)
                                          -> *mut c_void>,
    pub calloc: Option<extern "C" fn(ctx: *mut c_void,
                                                    nelem: size_t,
                                                    elsize: size_t)
                                          -> *mut c_void>,
    pub realloc: Option<extern "C" fn(ctx: *mut c_void,
                                                     ptr: *mut c_void,
                                                     new_size: size_t)
                                           -> *mut c_void>,
    pub free: Option<extern "C" fn(ctx: *mut c_void,
                                                  ptr: *mut c_void)
                                        -> ()>,
}

#[cfg(Py_3_4)]
#[cfg(not(Py_LIMITED_API))]
#[cfg_attr(windows, link(name="pythonXY"))] extern "C" {
    #[cfg(not(Py_3_5))]
    pub fn PyMem_GetAllocator(domain: PyMemAllocatorDomain,
                              allocator: *mut PyMemAllocator) -> ();
    #[cfg(not(Py_3_5))]
    pub fn PyMem_SetAllocator(domain: PyMemAllocatorDomain,
                              allocator: *mut PyMemAllocator) -> ();
    #[cfg(Py_3_5)]
    pub fn PyMem_GetAllocator(domain: PyMemAllocatorDomain,
                              allocator: *mut PyMemAllocatorEx) -> ();
    #[cfg(Py_3_5)]
    pub fn PyMem_SetAllocator(domain: PyMemAllocatorDomain,
                              allocator: *mut PyMemAllocatorEx) -> ();
    pub fn PyMem_SetupDebugHooks() -> ();
}