| cdef extern from "Python.h": | |
| ##################################################################### | |
| # 9.2 Memory Interface | |
| ##################################################################### | |
| # You are definitely *supposed* to use these: "In most situations, | |
| # however, it is recommended to allocate memory from the Python | |
| # heap specifically because the latter is under control of the | |
| # Python memory manager. For example, this is required when the | |
| # interpreter is extended with new object types written in | |
| # C. Another reason for using the Python heap is the desire to | |
| # inform the Python memory manager about the memory needs of the | |
| # extension module. Even when the requested memory is used | |
| # exclusively for internal, highly-specific purposes, delegating | |
| # all memory requests to the Python memory manager causes the | |
| # interpreter to have a more accurate image of its memory | |
| # footprint as a whole. Consequently, under certain circumstances, | |
| # the Python memory manager may or may not trigger appropriate | |
| # actions, like garbage collection, memory compaction or other | |
| # preventive procedures. Note that by using the C library | |
| # allocator as shown in the previous example, the allocated memory | |
| # for the I/O buffer escapes completely the Python memory | |
| # manager." | |
| # The following function sets, modeled after the ANSI C standard, | |
| # but specifying behavior when requesting zero bytes, are | |
| # available for allocating and releasing memory from the Python | |
| # heap: | |
| void* PyMem_Malloc(size_t n) | |
| # Allocates n bytes and returns a pointer of type void* to the | |
| # allocated memory, or NULL if the request fails. Requesting zero | |
| # bytes returns a distinct non-NULL pointer if possible, as if | |
| # PyMem_Malloc(1) had been called instead. The memory will not | |
| # have been initialized in any way. | |
| void* PyMem_Realloc(void *p, size_t n) | |
| # Resizes the memory block pointed to by p to n bytes. The | |
| # contents will be unchanged to the minimum of the old and the new | |
| # sizes. If p is NULL, the call is equivalent to PyMem_Malloc(n); | |
| # else if n is equal to zero, the memory block is resized but is | |
| # not freed, and the returned pointer is non-NULL. Unless p is | |
| # NULL, it must have been returned by a previous call to | |
| # PyMem_Malloc() or PyMem_Realloc(). | |
| void PyMem_Free(void *p) | |
| # Frees the memory block pointed to by p, which must have been | |
| # returned by a previous call to PyMem_Malloc() or | |
| # PyMem_Realloc(). Otherwise, or if PyMem_Free(p) has been called | |
| # before, undefined behavior occurs. If p is NULL, no operation is | |
| # performed. | |
| # The following type-oriented macros are provided for | |
| # convenience. Note that TYPE refers to any C type. | |
| # TYPE* PyMem_New(TYPE, size_t n) | |
| # Same as PyMem_Malloc(), but allocates (n * sizeof(TYPE)) bytes | |
| # of memory. Returns a pointer cast to TYPE*. The memory will not | |
| # have been initialized in any way. | |
| # TYPE* PyMem_Resize(void *p, TYPE, size_t n) | |
| # Same as PyMem_Realloc(), but the memory block is resized to (n * | |
| # sizeof(TYPE)) bytes. Returns a pointer cast to TYPE*. | |
| void PyMem_Del(void *p) | |
| # Same as PyMem_Free(). | |
| # In addition, the following macro sets are provided for calling | |
| # the Python memory allocator directly, without involving the C | |
| # API functions listed above. However, note that their use does | |
| # not preserve binary compatibility across Python versions and is | |
| # therefore deprecated in extension modules. | |
| # PyMem_MALLOC(), PyMem_REALLOC(), PyMem_FREE(). | |
| # PyMem_NEW(), PyMem_RESIZE(), PyMem_DEL(). |