From 866af79af34bc46a15611a2a1b769bb09e8ee91a Mon Sep 17 00:00:00 2001 From: Donghee Na Date: Sun, 19 Nov 2023 21:57:43 +0900 Subject: [PATCH 1/3] gh-111926 Update _PyWeakref_IS_DEAD to be thread-safe --- Include/internal/pycore_weakref.h | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Include/internal/pycore_weakref.h b/Include/internal/pycore_weakref.h index 51b2bb6b11ede9..601f0a08299797 100644 --- a/Include/internal/pycore_weakref.h +++ b/Include/internal/pycore_weakref.h @@ -8,6 +8,8 @@ extern "C" { # error "this header requires Py_BUILD_CORE define" #endif +#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION() + static inline PyObject* _PyWeakref_GET_REF(PyObject *ref_obj) { assert(PyWeakref_Check(ref_obj)); PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); @@ -35,15 +37,20 @@ static inline PyObject* _PyWeakref_GET_REF(PyObject *ref_obj) { static inline int _PyWeakref_IS_DEAD(PyObject *ref_obj) { assert(PyWeakref_Check(ref_obj)); + int ret; + Py_BEGIN_CRITICAL_SECTION(ref_obj); PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); PyObject *obj = ref->wr_object; if (obj == Py_None) { // clear_weakref() was called - return 1; + ret = 1; } - - // See _PyWeakref_GET_REF() for the rationale of this test - return (Py_REFCNT(obj) == 0); + else { + // See _PyWeakref_GET_REF() for the rationale of this test + ret = (Py_REFCNT(obj) == 0); + } + Py_END_CRITICAL_SECTION(); + return ret; } extern Py_ssize_t _PyWeakref_GetWeakrefCount(PyWeakReference *head); From 01fb8984330c3fc40343de5374aedba4b6c8fd4c Mon Sep 17 00:00:00 2001 From: Donghee Na Date: Sun, 19 Nov 2023 22:00:45 +0900 Subject: [PATCH 2/3] nit --- Include/internal/pycore_weakref.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Include/internal/pycore_weakref.h b/Include/internal/pycore_weakref.h index 601f0a08299797..b7d1215e1cb6e2 100644 --- a/Include/internal/pycore_weakref.h +++ b/Include/internal/pycore_weakref.h @@ -37,20 +37,20 @@ static inline PyObject* _PyWeakref_GET_REF(PyObject *ref_obj) { static inline int _PyWeakref_IS_DEAD(PyObject *ref_obj) { assert(PyWeakref_Check(ref_obj)); - int ret; + int is_dead; Py_BEGIN_CRITICAL_SECTION(ref_obj); PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj); PyObject *obj = ref->wr_object; if (obj == Py_None) { // clear_weakref() was called - ret = 1; + is_dead = 1; } else { // See _PyWeakref_GET_REF() for the rationale of this test - ret = (Py_REFCNT(obj) == 0); + is_dead = (Py_REFCNT(obj) == 0); } Py_END_CRITICAL_SECTION(); - return ret; + return is_dead; } extern Py_ssize_t _PyWeakref_GetWeakrefCount(PyWeakReference *head); From b0da60a22fca028da6e8afc8ac3820d6877b1f99 Mon Sep 17 00:00:00 2001 From: Donghee Na Date: Sun, 19 Nov 2023 22:02:19 +0900 Subject: [PATCH 3/3] lint --- Include/internal/pycore_weakref.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Include/internal/pycore_weakref.h b/Include/internal/pycore_weakref.h index b7d1215e1cb6e2..eacbe14c903289 100644 --- a/Include/internal/pycore_weakref.h +++ b/Include/internal/pycore_weakref.h @@ -45,7 +45,7 @@ static inline int _PyWeakref_IS_DEAD(PyObject *ref_obj) { // clear_weakref() was called is_dead = 1; } - else { + else { // See _PyWeakref_GET_REF() for the rationale of this test is_dead = (Py_REFCNT(obj) == 0); }