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