#include "Python.h"
-#include "pycore_dict.h" // _PyDict_DelItemIf()
-#include "pycore_object.h" // _PyObject_GET_WEAKREFS_LISTPTR
-#include "pycore_weakref.h" // _PyWeakref_IS_DEAD()
-
+#include "pycore_critical_section.h" // Py_BEGIN_CRITICAL_SECTION()
+#include "pycore_dict.h" // _PyDict_DelItemIf()
+#include "pycore_object.h" // _PyObject_GET_WEAKREFS_LISTPTR()
+#include "pycore_weakref.h" // _PyWeakref_IS_DEAD()
#define GET_WEAKREFS_LISTPTR(o) \
((PyWeakReference **) _PyObject_GET_WEAKREFS_LISTPTR(o))
if (!_PyType_SUPPORTS_WEAKREFS(Py_TYPE(object)))
return 0;
-
+ Py_ssize_t count;
+ Py_BEGIN_CRITICAL_SECTION(object);
list = GET_WEAKREFS_LISTPTR(object);
- return _PyWeakref_GetWeakrefCount(*list);
+ count = _PyWeakref_GetWeakrefCount(*list);
+ Py_END_CRITICAL_SECTION();
+ return count;
}
PyErr_SetString(PyExc_TypeError, "not a weakref");
return -1;
}
- return _PyWeakref_IS_DEAD(value);
+ int is_dead;
+ Py_BEGIN_CRITICAL_SECTION(value);
+ is_dead = _PyWeakref_IS_DEAD(value);
+ Py_END_CRITICAL_SECTION();
+ return is_dead;
}
/*[clinic input]
return PyList_New(0);
}
+ PyObject *result;
+ Py_BEGIN_CRITICAL_SECTION(object);
PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);
Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list);
- PyObject *result = PyList_New(count);
+ result = PyList_New(count);
if (result == NULL) {
- return NULL;
+ goto exit;
}
PyWeakReference *current = *list;
PyList_SET_ITEM(result, i, Py_NewRef(current));
current = current->wr_next;
}
+exit:
+ Py_END_CRITICAL_SECTION();
return result;
}