mirror of
https://github.com/python/cpython
synced 2024-10-06 16:15:35 +00:00
gh-111926: Update _PyWeakref_IS_DEAD to be thread-safe (gh-112267)
This commit is contained in:
parent
f8129146ef
commit
7c9f2677fb
|
@ -8,6 +8,8 @@ extern "C" {
|
||||||
# error "this header requires Py_BUILD_CORE define"
|
# error "this header requires Py_BUILD_CORE define"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION()
|
||||||
|
|
||||||
static inline PyObject* _PyWeakref_GET_REF(PyObject *ref_obj) {
|
static inline PyObject* _PyWeakref_GET_REF(PyObject *ref_obj) {
|
||||||
assert(PyWeakref_Check(ref_obj));
|
assert(PyWeakref_Check(ref_obj));
|
||||||
PyWeakReference *ref = _Py_CAST(PyWeakReference*, 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) {
|
static inline int _PyWeakref_IS_DEAD(PyObject *ref_obj) {
|
||||||
assert(PyWeakref_Check(ref_obj));
|
assert(PyWeakref_Check(ref_obj));
|
||||||
|
int is_dead;
|
||||||
|
Py_BEGIN_CRITICAL_SECTION(ref_obj);
|
||||||
PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj);
|
PyWeakReference *ref = _Py_CAST(PyWeakReference*, ref_obj);
|
||||||
PyObject *obj = ref->wr_object;
|
PyObject *obj = ref->wr_object;
|
||||||
if (obj == Py_None) {
|
if (obj == Py_None) {
|
||||||
// clear_weakref() was called
|
// clear_weakref() was called
|
||||||
return 1;
|
is_dead = 1;
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
// See _PyWeakref_GET_REF() for the rationale of this test
|
// See _PyWeakref_GET_REF() for the rationale of this test
|
||||||
return (Py_REFCNT(obj) == 0);
|
is_dead = (Py_REFCNT(obj) == 0);
|
||||||
|
}
|
||||||
|
Py_END_CRITICAL_SECTION();
|
||||||
|
return is_dead;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern Py_ssize_t _PyWeakref_GetWeakrefCount(PyWeakReference *head);
|
extern Py_ssize_t _PyWeakref_GetWeakrefCount(PyWeakReference *head);
|
||||||
|
|
Loading…
Reference in a new issue