]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39542: Make _Py_NewReference() opaque in C API (GH-18346)
authorVictor Stinner <vstinner@python.org>
Wed, 5 Feb 2020 00:11:10 +0000 (01:11 +0100)
committerGitHub <noreply@github.com>
Wed, 5 Feb 2020 00:11:10 +0000 (01:11 +0100)
_Py_NewReference() becomes a regular opaque function, rather than a
static inline function in the C API (object.h), to better hide
implementation details.

Move _Py_tracemalloc_config from public pymem.h to internal
pycore_pymem.h header.

Make _Py_AddToAllObjects() private.

Include/internal/pycore_pymem.h
Include/object.h
Include/pymem.h
Modules/_tracemalloc.c
Objects/object.c

index 06d0d06c75c36807aef53c3a945d47ecbbbdac12..db153e0bd2d7102177b3904e8ccc13c0c94d0d79 100644 (file)
@@ -169,6 +169,40 @@ PyAPI_FUNC(int) _PyMem_GetAllocatorName(
    PYMEM_ALLOCATOR_NOT_SET does nothing. */
 PyAPI_FUNC(int) _PyMem_SetupAllocators(PyMemAllocatorName allocator);
 
+/* bpo-35053: Expose _Py_tracemalloc_config for _Py_NewReference()
+   which access directly _Py_tracemalloc_config.tracing for best
+   performances. */
+struct _PyTraceMalloc_Config {
+    /* Module initialized?
+       Variable protected by the GIL */
+    enum {
+        TRACEMALLOC_NOT_INITIALIZED,
+        TRACEMALLOC_INITIALIZED,
+        TRACEMALLOC_FINALIZED
+    } initialized;
+
+    /* Is tracemalloc tracing memory allocations?
+       Variable protected by the GIL */
+    int tracing;
+
+    /* limit of the number of frames in a traceback, 1 by default.
+       Variable protected by the GIL. */
+    int max_nframe;
+
+    /* use domain in trace key?
+       Variable protected by the GIL. */
+    int use_domain;
+};
+
+#define _PyTraceMalloc_Config_INIT \
+    {.initialized = TRACEMALLOC_NOT_INITIALIZED, \
+     .tracing = 0, \
+     .max_nframe = 1, \
+     .use_domain = 0}
+
+PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config;
+
+
 #ifdef __cplusplus
 }
 #endif
index 175a208f0d2d7166bccdf222810d1a24ae895da9..8dccbf16971a713bab4a078c204a23912b7a6b31 100644 (file)
@@ -1,8 +1,6 @@
 #ifndef Py_OBJECT_H
 #define Py_OBJECT_H
 
-#include "pymem.h"   /* _Py_tracemalloc_config */
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -390,28 +388,13 @@ PyAPI_FUNC(Py_ssize_t) _Py_GetRefTotal(void);
    when a memory block is reused from a free list. */
 PyAPI_FUNC(int) _PyTraceMalloc_NewReference(PyObject *op);
 
+PyAPI_FUNC(void) _Py_NewReference(PyObject *op);
+
 #ifdef Py_TRACE_REFS
 /* Py_TRACE_REFS is such major surgery that we call external routines. */
 PyAPI_FUNC(void) _Py_ForgetReference(PyObject *);
-PyAPI_FUNC(void) _Py_AddToAllObjects(PyObject *, int force);
 #endif
 
-
-static inline void _Py_NewReference(PyObject *op)
-{
-    if (_Py_tracemalloc_config.tracing) {
-        _PyTraceMalloc_NewReference(op);
-    }
-#ifdef Py_REF_DEBUG
-    _Py_RefTotal++;
-#endif
-    Py_REFCNT(op) = 1;
-#ifdef Py_TRACE_REFS
-    _Py_AddToAllObjects(op, 1);
-#endif
-}
-
-
 PyAPI_FUNC(void) _Py_Dealloc(PyObject *);
 
 static inline void _Py_INCREF(PyObject *op)
index 07b380aa6e7faaf3cc2c9de4ed15375cea19c82f..607feb9484f24f14d562f1a32fbae9ad8b7fe16d 100644 (file)
@@ -101,41 +101,6 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr);
 #define PyMem_Del               PyMem_Free
 #define PyMem_DEL               PyMem_FREE
 
-/* bpo-35053: expose _Py_tracemalloc_config for performance:
-   _Py_NewReference() needs an efficient check to test if tracemalloc is
-   tracing.
-
-   It has to be defined in pymem.h, before object.h is included. */
-struct _PyTraceMalloc_Config {
-    /* Module initialized?
-       Variable protected by the GIL */
-    enum {
-        TRACEMALLOC_NOT_INITIALIZED,
-        TRACEMALLOC_INITIALIZED,
-        TRACEMALLOC_FINALIZED
-    } initialized;
-
-    /* Is tracemalloc tracing memory allocations?
-       Variable protected by the GIL */
-    int tracing;
-
-    /* limit of the number of frames in a traceback, 1 by default.
-       Variable protected by the GIL. */
-    int max_nframe;
-
-    /* use domain in trace key?
-       Variable protected by the GIL. */
-    int use_domain;
-};
-
-PyAPI_DATA(struct _PyTraceMalloc_Config) _Py_tracemalloc_config;
-
-#define _PyTraceMalloc_Config_INIT \
-    {.initialized = TRACEMALLOC_NOT_INITIALIZED, \
-     .tracing = 0, \
-     .max_nframe = 1, \
-     .use_domain = 0}
-
 
 #ifndef Py_LIMITED_API
 #  define Py_CPYTHON_PYMEM_H
index 70219721b51cd01b00acc43691e730ad044c0b21..ddf6ef4e11dd4fd3dad5e82856bc1c98174e3ba1 100644 (file)
@@ -1,4 +1,5 @@
 #include "Python.h"
+#include "pycore_pymem.h"
 #include "pycore_traceback.h"
 #include "hashtable.h"
 #include "frameobject.h"
index 085605ae36714761d44b1f08483c4db99b48a437..e6bfad4e7295e2b4e7c946428bb9ba9bb3346fa0 100644 (file)
@@ -93,7 +93,7 @@ static PyObject refchain = {&refchain, &refchain};
  * way, though; exceptions include statically allocated type objects, and
  * statically allocated singletons (like Py_True and Py_None).
  */
-void
+static void
 _Py_AddToAllObjects(PyObject *op, int force)
 {
 #ifdef  Py_DEBUG
@@ -1805,6 +1805,22 @@ _PyTypes_Init(void)
 }
 
 
+void
+_Py_NewReference(PyObject *op)
+{
+    if (_Py_tracemalloc_config.tracing) {
+        _PyTraceMalloc_NewReference(op);
+    }
+#ifdef Py_REF_DEBUG
+    _Py_RefTotal++;
+#endif
+    Py_REFCNT(op) = 1;
+#ifdef Py_TRACE_REFS
+    _Py_AddToAllObjects(op, 1);
+#endif
+}
+
+
 #ifdef Py_TRACE_REFS
 void
 _Py_ForgetReference(PyObject *op)