mirror of
https://github.com/python/cpython.git
synced 2025-12-08 06:10:17 +00:00
GH-116946: eliminate the need for the GC in the _thread.lock and _thread.RLock (#141268)
This commit is contained in:
parent
9ce99c6c19
commit
fbebca289d
1 changed files with 15 additions and 7 deletions
|
|
@ -41,6 +41,7 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
PyMutex lock;
|
PyMutex lock;
|
||||||
|
PyObject *weakreflist; /* List of weak references */
|
||||||
} lockobject;
|
} lockobject;
|
||||||
|
|
||||||
#define lockobject_CAST(op) ((lockobject *)(op))
|
#define lockobject_CAST(op) ((lockobject *)(op))
|
||||||
|
|
@ -48,6 +49,7 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
PyObject_HEAD
|
PyObject_HEAD
|
||||||
_PyRecursiveMutex lock;
|
_PyRecursiveMutex lock;
|
||||||
|
PyObject *weakreflist; /* List of weak references */
|
||||||
} rlockobject;
|
} rlockobject;
|
||||||
|
|
||||||
#define rlockobject_CAST(op) ((rlockobject *)(op))
|
#define rlockobject_CAST(op) ((rlockobject *)(op))
|
||||||
|
|
@ -767,7 +769,6 @@ static PyType_Spec ThreadHandle_Type_spec = {
|
||||||
static void
|
static void
|
||||||
lock_dealloc(PyObject *self)
|
lock_dealloc(PyObject *self)
|
||||||
{
|
{
|
||||||
PyObject_GC_UnTrack(self);
|
|
||||||
PyObject_ClearWeakRefs(self);
|
PyObject_ClearWeakRefs(self);
|
||||||
PyTypeObject *tp = Py_TYPE(self);
|
PyTypeObject *tp = Py_TYPE(self);
|
||||||
tp->tp_free(self);
|
tp->tp_free(self);
|
||||||
|
|
@ -999,6 +1000,10 @@ lock_new_impl(PyTypeObject *type)
|
||||||
return (PyObject *)self;
|
return (PyObject *)self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyMemberDef lock_members[] = {
|
||||||
|
{"__weaklistoffset__", Py_T_PYSSIZET, offsetof(lockobject, weakreflist), Py_READONLY},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
||||||
static PyMethodDef lock_methods[] = {
|
static PyMethodDef lock_methods[] = {
|
||||||
_THREAD_LOCK_ACQUIRE_LOCK_METHODDEF
|
_THREAD_LOCK_ACQUIRE_LOCK_METHODDEF
|
||||||
|
|
@ -1034,8 +1039,8 @@ static PyType_Slot lock_type_slots[] = {
|
||||||
{Py_tp_dealloc, lock_dealloc},
|
{Py_tp_dealloc, lock_dealloc},
|
||||||
{Py_tp_repr, lock_repr},
|
{Py_tp_repr, lock_repr},
|
||||||
{Py_tp_doc, (void *)lock_doc},
|
{Py_tp_doc, (void *)lock_doc},
|
||||||
|
{Py_tp_members, lock_members},
|
||||||
{Py_tp_methods, lock_methods},
|
{Py_tp_methods, lock_methods},
|
||||||
{Py_tp_traverse, _PyObject_VisitType},
|
|
||||||
{Py_tp_new, lock_new},
|
{Py_tp_new, lock_new},
|
||||||
{0, 0}
|
{0, 0}
|
||||||
};
|
};
|
||||||
|
|
@ -1043,8 +1048,7 @@ static PyType_Slot lock_type_slots[] = {
|
||||||
static PyType_Spec lock_type_spec = {
|
static PyType_Spec lock_type_spec = {
|
||||||
.name = "_thread.lock",
|
.name = "_thread.lock",
|
||||||
.basicsize = sizeof(lockobject),
|
.basicsize = sizeof(lockobject),
|
||||||
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
|
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE),
|
||||||
Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_WEAKREF),
|
|
||||||
.slots = lock_type_slots,
|
.slots = lock_type_slots,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1059,7 +1063,6 @@ rlock_locked_impl(rlockobject *self)
|
||||||
static void
|
static void
|
||||||
rlock_dealloc(PyObject *self)
|
rlock_dealloc(PyObject *self)
|
||||||
{
|
{
|
||||||
PyObject_GC_UnTrack(self);
|
|
||||||
PyObject_ClearWeakRefs(self);
|
PyObject_ClearWeakRefs(self);
|
||||||
PyTypeObject *tp = Py_TYPE(self);
|
PyTypeObject *tp = Py_TYPE(self);
|
||||||
tp->tp_free(self);
|
tp->tp_free(self);
|
||||||
|
|
@ -1319,6 +1322,11 @@ _thread_RLock__at_fork_reinit_impl(rlockobject *self)
|
||||||
#endif /* HAVE_FORK */
|
#endif /* HAVE_FORK */
|
||||||
|
|
||||||
|
|
||||||
|
static PyMemberDef rlock_members[] = {
|
||||||
|
{"__weaklistoffset__", Py_T_PYSSIZET, offsetof(rlockobject, weakreflist), Py_READONLY},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
||||||
static PyMethodDef rlock_methods[] = {
|
static PyMethodDef rlock_methods[] = {
|
||||||
_THREAD_RLOCK_ACQUIRE_METHODDEF
|
_THREAD_RLOCK_ACQUIRE_METHODDEF
|
||||||
_THREAD_RLOCK_RELEASE_METHODDEF
|
_THREAD_RLOCK_RELEASE_METHODDEF
|
||||||
|
|
@ -1339,10 +1347,10 @@ static PyMethodDef rlock_methods[] = {
|
||||||
static PyType_Slot rlock_type_slots[] = {
|
static PyType_Slot rlock_type_slots[] = {
|
||||||
{Py_tp_dealloc, rlock_dealloc},
|
{Py_tp_dealloc, rlock_dealloc},
|
||||||
{Py_tp_repr, rlock_repr},
|
{Py_tp_repr, rlock_repr},
|
||||||
|
{Py_tp_members, rlock_members},
|
||||||
{Py_tp_methods, rlock_methods},
|
{Py_tp_methods, rlock_methods},
|
||||||
{Py_tp_alloc, PyType_GenericAlloc},
|
{Py_tp_alloc, PyType_GenericAlloc},
|
||||||
{Py_tp_new, rlock_new},
|
{Py_tp_new, rlock_new},
|
||||||
{Py_tp_traverse, _PyObject_VisitType},
|
|
||||||
{0, 0},
|
{0, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -1350,7 +1358,7 @@ static PyType_Spec rlock_type_spec = {
|
||||||
.name = "_thread.RLock",
|
.name = "_thread.RLock",
|
||||||
.basicsize = sizeof(rlockobject),
|
.basicsize = sizeof(rlockobject),
|
||||||
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
|
.flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |
|
||||||
Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_IMMUTABLETYPE | Py_TPFLAGS_MANAGED_WEAKREF),
|
Py_TPFLAGS_IMMUTABLETYPE),
|
||||||
.slots = rlock_type_slots,
|
.slots = rlock_type_slots,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue