From 5d26f855213a4b6e57311ccac2af87c8d85f3499 Mon Sep 17 00:00:00 2001 From: Neil Schemenauer Date: Thu, 14 Jul 2022 17:26:40 -0700 Subject: [3.10] gh-94841: Ensure arena_map_get() is inlined in PyObject_Free() (GH-94842) Need to define ALWAYS_INLINE macro for 3.10. Co-authored-by: neonene <53406459+neonene@users.noreply.github.com> --- .../next/Build/2022-07-14-02-45-44.gh-issue-94841.lLRTdf.rst | 1 + Objects/obmalloc.c | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 Misc/NEWS.d/next/Build/2022-07-14-02-45-44.gh-issue-94841.lLRTdf.rst diff --git a/Misc/NEWS.d/next/Build/2022-07-14-02-45-44.gh-issue-94841.lLRTdf.rst b/Misc/NEWS.d/next/Build/2022-07-14-02-45-44.gh-issue-94841.lLRTdf.rst new file mode 100644 index 0000000..f7ad4f8 --- /dev/null +++ b/Misc/NEWS.d/next/Build/2022-07-14-02-45-44.gh-issue-94841.lLRTdf.rst @@ -0,0 +1 @@ +Fix the possible performance regression of :c:func:`PyObject_Free` compiled with MSVC version 1932. diff --git a/Objects/obmalloc.c b/Objects/obmalloc.c index 615703a..ed8dd5a 100644 --- a/Objects/obmalloc.c +++ b/Objects/obmalloc.c @@ -1397,9 +1397,19 @@ static int arena_map_bot_count; static arena_map_bot_t arena_map_root; #endif +#if defined(Py_DEBUG) +# define ALWAYS_INLINE +#elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) +# define ALWAYS_INLINE __attribute__((always_inline)) +#elif defined(_MSC_VER) +# define ALWAYS_INLINE __forceinline +#else +# define ALWAYS_INLINE +#endif + /* Return a pointer to a bottom tree node, return NULL if it doesn't exist or * it cannot be created */ -static arena_map_bot_t * +static ALWAYS_INLINE arena_map_bot_t * arena_map_get(block *p, int create) { #ifdef USE_INTERIOR_NODES -- cgit v0.12