From cc71cc925662cb089b5c6fe17df00d00045dfd71 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 17 Oct 2023 02:41:51 +0200 Subject: [PATCH] gh-85283: Add PyMem_RawMalloc() to the limited C API (#108570) Add PyMem_RawMalloc(), PyMem_RawCalloc(), PyMem_RawRealloc() and PyMem_RawFree() to the limited C API. These functions were added by Python 3.4 and are needed to port stdlib extensions to the limited C API, like grp and pwd. Co-authored-by: Erlend E. Aasland --- Doc/data/stable_abi.dat | 4 ++++ Doc/whatsnew/3.13.rst | 5 +++++ Include/cpython/pymem.h | 6 ------ Include/pymem.h | 11 +++++++++++ Lib/test/test_stable_abi_ctypes.py | 4 ++++ .../2023-08-28-17-34-10.gh-issue-85283.f1zXcc.rst | 3 +++ Misc/stable_abi.toml | 8 ++++++++ PC/python3dll.c | 4 ++++ 8 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 Misc/NEWS.d/next/C API/2023-08-28-17-34-10.gh-issue-85283.f1zXcc.rst diff --git a/Doc/data/stable_abi.dat b/Doc/data/stable_abi.dat index 6ec9c907254..267d2b8c010 100644 --- a/Doc/data/stable_abi.dat +++ b/Doc/data/stable_abi.dat @@ -388,6 +388,10 @@ function,PyMapping_Values,3.2,, function,PyMem_Calloc,3.7,, function,PyMem_Free,3.2,, function,PyMem_Malloc,3.2,, +function,PyMem_RawCalloc,3.13,, +function,PyMem_RawFree,3.13,, +function,PyMem_RawMalloc,3.13,, +function,PyMem_RawRealloc,3.13,, function,PyMem_Realloc,3.2,, type,PyMemberDef,3.2,,full-abi var,PyMemberDescr_Type,3.2,, diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst index 01f8208f3af..ec76659bee6 100644 --- a/Doc/whatsnew/3.13.rst +++ b/Doc/whatsnew/3.13.rst @@ -1053,6 +1053,11 @@ New Features parameter names. (Contributed by Serhiy Storchaka in :gh:`110815`.) +* Add :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawCalloc`, + :c:func:`PyMem_RawRealloc` and :c:func:`PyMem_RawFree` to the limited C API + (version 3.13). + (Contributed by Victor Stinner in :gh:`85283`.) + Porting to Python 3.13 ---------------------- diff --git a/Include/cpython/pymem.h b/Include/cpython/pymem.h index b75f1c4d242..dc4a65ccf8d 100644 --- a/Include/cpython/pymem.h +++ b/Include/cpython/pymem.h @@ -2,12 +2,6 @@ # error "this header file must not be included directly" #endif -PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); -PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); -PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); -PyAPI_FUNC(void) PyMem_RawFree(void *ptr); - - typedef enum { /* PyMem_RawMalloc(), PyMem_RawRealloc() and PyMem_RawFree() */ PYMEM_DOMAIN_RAW, diff --git a/Include/pymem.h b/Include/pymem.h index 68e33f90b7b..a80da99e1dd 100644 --- a/Include/pymem.h +++ b/Include/pymem.h @@ -87,6 +87,17 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr); #define PyMem_DEL(p) PyMem_Free((p)) +#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= 0x030d0000 +// Memory allocator which doesn't require the GIL to be held. +// Usually, it's just a thin wrapper to functions of the standard C library: +// malloc(), calloc(), realloc() and free(). The difference is that +// tracemalloc can track these memory allocations. +PyAPI_FUNC(void *) PyMem_RawMalloc(size_t size); +PyAPI_FUNC(void *) PyMem_RawCalloc(size_t nelem, size_t elsize); +PyAPI_FUNC(void *) PyMem_RawRealloc(void *ptr, size_t new_size); +PyAPI_FUNC(void) PyMem_RawFree(void *ptr); +#endif + #ifndef Py_LIMITED_API # define Py_CPYTHON_PYMEM_H # include "cpython/pymem.h" diff --git a/Lib/test/test_stable_abi_ctypes.py b/Lib/test/test_stable_abi_ctypes.py index e06f9cabf43..0c831c4f478 100644 --- a/Lib/test/test_stable_abi_ctypes.py +++ b/Lib/test/test_stable_abi_ctypes.py @@ -418,6 +418,10 @@ SYMBOL_NAMES = ( "PyMem_Calloc", "PyMem_Free", "PyMem_Malloc", + "PyMem_RawCalloc", + "PyMem_RawFree", + "PyMem_RawMalloc", + "PyMem_RawRealloc", "PyMem_Realloc", "PyMemberDescr_Type", "PyMember_GetOne", diff --git a/Misc/NEWS.d/next/C API/2023-08-28-17-34-10.gh-issue-85283.f1zXcc.rst b/Misc/NEWS.d/next/C API/2023-08-28-17-34-10.gh-issue-85283.f1zXcc.rst new file mode 100644 index 00000000000..1c25fdb6ec8 --- /dev/null +++ b/Misc/NEWS.d/next/C API/2023-08-28-17-34-10.gh-issue-85283.f1zXcc.rst @@ -0,0 +1,3 @@ +Add :c:func:`PyMem_RawMalloc`, :c:func:`PyMem_RawCalloc`, +:c:func:`PyMem_RawRealloc` and :c:func:`PyMem_RawFree` to the limited C API. +Patch by Victor Stinner. diff --git a/Misc/stable_abi.toml b/Misc/stable_abi.toml index 9d66b92eb8e..f8ee973612e 100644 --- a/Misc/stable_abi.toml +++ b/Misc/stable_abi.toml @@ -2466,3 +2466,11 @@ added = '3.13' [function.PyUnicode_EqualToUTF8AndSize] added = '3.13' +[function.PyMem_RawMalloc] + added = '3.13' +[function.PyMem_RawCalloc] + added = '3.13' +[function.PyMem_RawRealloc] + added = '3.13' +[function.PyMem_RawFree] + added = '3.13' diff --git a/PC/python3dll.c b/PC/python3dll.c index 7ee11746770..dd3be3a7490 100755 --- a/PC/python3dll.c +++ b/PC/python3dll.c @@ -373,6 +373,10 @@ EXPORT_FUNC(PyMarshal_WriteObjectToString) EXPORT_FUNC(PyMem_Calloc) EXPORT_FUNC(PyMem_Free) EXPORT_FUNC(PyMem_Malloc) +EXPORT_FUNC(PyMem_RawCalloc) +EXPORT_FUNC(PyMem_RawFree) +EXPORT_FUNC(PyMem_RawMalloc) +EXPORT_FUNC(PyMem_RawRealloc) EXPORT_FUNC(PyMem_Realloc) EXPORT_FUNC(PyMember_GetOne) EXPORT_FUNC(PyMember_SetOne)