gh-111926: Update _PyWeakref_IS_DEAD to be thread-safe (gh-112267)

This commit is contained in:
Donghee Na 2023-11-19 22:36:45 +00:00 committed by GitHub
parent f8129146ef
commit 7c9f2677fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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 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
return 1;
is_dead = 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
is_dead = (Py_REFCNT(obj) == 0);
}
Py_END_CRITICAL_SECTION();
return is_dead;
}
extern Py_ssize_t _PyWeakref_GetWeakrefCount(PyWeakReference *head);