mirror of
https://github.com/python/cpython.git
synced 2025-07-12 13:55:34 +00:00
[3.13] gh-126312: Don't traverse frozen objects on the free-threaded build (GH-126338) (#126866)
* Fix merge conflicts.
* [3.13] gh-126312: Don't traverse frozen objects on the free-threaded build (GH-126338)
Also, _PyGC_Freeze() no longer freezes unreachable objects.
(cherry picked from commit d4c72fed8c
)
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
---------
Co-authored-by: Sergey B Kirpichev <skirpichev@gmail.com>
This commit is contained in:
parent
3227680d2d
commit
ecda3ae2a5
3 changed files with 54 additions and 4 deletions
|
@ -110,6 +110,12 @@ worklist_remove(struct worklist_iter *iter)
|
|||
iter->next = iter->ptr;
|
||||
}
|
||||
|
||||
static inline int
|
||||
gc_is_frozen(PyObject *op)
|
||||
{
|
||||
return (op->ob_gc_bits & _PyGC_BITS_FROZEN) != 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
gc_is_unreachable(PyObject *op)
|
||||
{
|
||||
|
@ -229,7 +235,7 @@ op_from_block(void *block, void *arg, bool include_frozen)
|
|||
if (!_PyObject_GC_IS_TRACKED(op)) {
|
||||
return NULL;
|
||||
}
|
||||
if (!include_frozen && (op->ob_gc_bits & _PyGC_BITS_FROZEN) != 0) {
|
||||
if (!include_frozen && gc_is_frozen(op)) {
|
||||
return NULL;
|
||||
}
|
||||
return op;
|
||||
|
@ -364,7 +370,10 @@ process_delayed_frees(PyInterpreterState *interp)
|
|||
static int
|
||||
visit_decref(PyObject *op, void *arg)
|
||||
{
|
||||
if (_PyObject_GC_IS_TRACKED(op) && !_Py_IsImmortal(op)) {
|
||||
if (_PyObject_GC_IS_TRACKED(op)
|
||||
&& !_Py_IsImmortal(op)
|
||||
&& !gc_is_frozen(op))
|
||||
{
|
||||
// If update_refs hasn't reached this object yet, mark it
|
||||
// as (tentatively) unreachable and initialize ob_tid to zero.
|
||||
gc_maybe_init_refs(op);
|
||||
|
@ -1419,7 +1428,7 @@ visit_freeze(const mi_heap_t *heap, const mi_heap_area_t *area,
|
|||
void *block, size_t block_size, void *args)
|
||||
{
|
||||
PyObject *op = op_from_block(block, args, true);
|
||||
if (op != NULL) {
|
||||
if (op != NULL && !gc_is_unreachable(op)) {
|
||||
op->ob_gc_bits |= _PyGC_BITS_FROZEN;
|
||||
}
|
||||
return true;
|
||||
|
@ -1464,7 +1473,7 @@ visit_count_frozen(const mi_heap_t *heap, const mi_heap_area_t *area,
|
|||
void *block, size_t block_size, void *args)
|
||||
{
|
||||
PyObject *op = op_from_block(block, args, true);
|
||||
if (op != NULL && (op->ob_gc_bits & _PyGC_BITS_FROZEN) != 0) {
|
||||
if (op != NULL && gc_is_frozen(op)) {
|
||||
struct count_frozen_args *arg = (struct count_frozen_args *)args;
|
||||
arg->count++;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue