mirror of
https://github.com/python/cpython
synced 2024-10-06 14:07:56 +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"
|
||||
#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);
|
||||
|
|
Loading…
Reference in a new issue