17db96d56Sopenharmony_ci/* The PyMem_ family: low-level memory allocation interfaces. 27db96d56Sopenharmony_ci See objimpl.h for the PyObject_ memory family. 37db96d56Sopenharmony_ci*/ 47db96d56Sopenharmony_ci 57db96d56Sopenharmony_ci#ifndef Py_PYMEM_H 67db96d56Sopenharmony_ci#define Py_PYMEM_H 77db96d56Sopenharmony_ci 87db96d56Sopenharmony_ci#include "pyport.h" 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ci#ifdef __cplusplus 117db96d56Sopenharmony_ciextern "C" { 127db96d56Sopenharmony_ci#endif 137db96d56Sopenharmony_ci 147db96d56Sopenharmony_ci/* BEWARE: 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_ci Each interface exports both functions and macros. Extension modules should 177db96d56Sopenharmony_ci use the functions, to ensure binary compatibility across Python versions. 187db96d56Sopenharmony_ci Because the Python implementation is free to change internal details, and 197db96d56Sopenharmony_ci the macros may (or may not) expose details for speed, if you do use the 207db96d56Sopenharmony_ci macros you must recompile your extensions with each Python release. 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci Never mix calls to PyMem_ with calls to the platform malloc/realloc/ 237db96d56Sopenharmony_ci calloc/free. For example, on Windows different DLLs may end up using 247db96d56Sopenharmony_ci different heaps, and if you use PyMem_Malloc you'll get the memory from the 257db96d56Sopenharmony_ci heap used by the Python DLL; it could be a disaster if you free()'ed that 267db96d56Sopenharmony_ci directly in your own extension. Using PyMem_Free instead ensures Python 277db96d56Sopenharmony_ci can return the memory to the proper heap. As another example, in 287db96d56Sopenharmony_ci a debug build (Py_DEBUG macro), Python wraps all calls to all PyMem_ and 297db96d56Sopenharmony_ci PyObject_ memory functions in special debugging wrappers that add additional 307db96d56Sopenharmony_ci debugging info to dynamic memory blocks. The system routines have no idea 317db96d56Sopenharmony_ci what to do with that stuff, and the Python wrappers have no idea what to do 327db96d56Sopenharmony_ci with raw blocks obtained directly by the system routines then. 337db96d56Sopenharmony_ci 347db96d56Sopenharmony_ci The GIL must be held when using these APIs. 357db96d56Sopenharmony_ci*/ 367db96d56Sopenharmony_ci 377db96d56Sopenharmony_ci/* 387db96d56Sopenharmony_ci * Raw memory interface 397db96d56Sopenharmony_ci * ==================== 407db96d56Sopenharmony_ci */ 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci/* Functions 437db96d56Sopenharmony_ci 447db96d56Sopenharmony_ci Functions supplying platform-independent semantics for malloc/realloc/ 457db96d56Sopenharmony_ci free. These functions make sure that allocating 0 bytes returns a distinct 467db96d56Sopenharmony_ci non-NULL pointer (whenever possible -- if we're flat out of memory, NULL 477db96d56Sopenharmony_ci may be returned), even if the platform malloc and realloc don't. 487db96d56Sopenharmony_ci Returned pointers must be checked for NULL explicitly. No action is 497db96d56Sopenharmony_ci performed on failure (no exception is set, no warning is printed, etc). 507db96d56Sopenharmony_ci*/ 517db96d56Sopenharmony_ci 527db96d56Sopenharmony_ciPyAPI_FUNC(void *) PyMem_Malloc(size_t size); 537db96d56Sopenharmony_ciPyAPI_FUNC(void *) PyMem_Calloc(size_t nelem, size_t elsize); 547db96d56Sopenharmony_ciPyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size); 557db96d56Sopenharmony_ciPyAPI_FUNC(void) PyMem_Free(void *ptr); 567db96d56Sopenharmony_ci 577db96d56Sopenharmony_ci/* 587db96d56Sopenharmony_ci * Type-oriented memory interface 597db96d56Sopenharmony_ci * ============================== 607db96d56Sopenharmony_ci * 617db96d56Sopenharmony_ci * Allocate memory for n objects of the given type. Returns a new pointer 627db96d56Sopenharmony_ci * or NULL if the request was too large or memory allocation failed. Use 637db96d56Sopenharmony_ci * these macros rather than doing the multiplication yourself so that proper 647db96d56Sopenharmony_ci * overflow checking is always done. 657db96d56Sopenharmony_ci */ 667db96d56Sopenharmony_ci 677db96d56Sopenharmony_ci#define PyMem_New(type, n) \ 687db96d56Sopenharmony_ci ( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ 697db96d56Sopenharmony_ci ( (type *) PyMem_Malloc((n) * sizeof(type)) ) ) 707db96d56Sopenharmony_ci 717db96d56Sopenharmony_ci/* 727db96d56Sopenharmony_ci * The value of (p) is always clobbered by this macro regardless of success. 737db96d56Sopenharmony_ci * The caller MUST check if (p) is NULL afterwards and deal with the memory 747db96d56Sopenharmony_ci * error if so. This means the original value of (p) MUST be saved for the 757db96d56Sopenharmony_ci * caller's memory error handler to not lose track of it. 767db96d56Sopenharmony_ci */ 777db96d56Sopenharmony_ci#define PyMem_Resize(p, type, n) \ 787db96d56Sopenharmony_ci ( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \ 797db96d56Sopenharmony_ci (type *) PyMem_Realloc((p), (n) * sizeof(type)) ) 807db96d56Sopenharmony_ci 817db96d56Sopenharmony_ci 827db96d56Sopenharmony_ci// Deprecated aliases only kept for backward compatibility. 837db96d56Sopenharmony_ci// PyMem_Del and PyMem_DEL are defined with no parameter to be able to use 847db96d56Sopenharmony_ci// them as function pointers (ex: dealloc = PyMem_Del). 857db96d56Sopenharmony_ci#define PyMem_MALLOC(n) PyMem_Malloc(n) 867db96d56Sopenharmony_ci#define PyMem_NEW(type, n) PyMem_New(type, n) 877db96d56Sopenharmony_ci#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n) 887db96d56Sopenharmony_ci#define PyMem_RESIZE(p, type, n) PyMem_Resize(p, type, n) 897db96d56Sopenharmony_ci#define PyMem_FREE(p) PyMem_Free(p) 907db96d56Sopenharmony_ci#define PyMem_Del PyMem_Free 917db96d56Sopenharmony_ci#define PyMem_DEL PyMem_Free 927db96d56Sopenharmony_ci 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci#ifndef Py_LIMITED_API 957db96d56Sopenharmony_ci# define Py_CPYTHON_PYMEM_H 967db96d56Sopenharmony_ci# include "cpython/pymem.h" 977db96d56Sopenharmony_ci# undef Py_CPYTHON_PYMEM_H 987db96d56Sopenharmony_ci#endif 997db96d56Sopenharmony_ci 1007db96d56Sopenharmony_ci#ifdef __cplusplus 1017db96d56Sopenharmony_ci} 1027db96d56Sopenharmony_ci#endif 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci#endif /* !Py_PYMEM_H */ 105