Ref counting based object release is not applied if cycle is broken in destructor during GC run
Personne n'a encore pris cette issue.
- Langage dominant
- C
- Étoiles
- 40.4k
- Forks
- 8.1k
- Merge moyen
- 2 j 13 h
- PR mergées (30 j)
- 96
Description
Description
repro: https://3v4l.org/USrWu
see UPDATE below
It seems the GC can be improved. Currently, when a cycle is broken during GC run, a 2nd run of GC is needed to really release the object.
https://github.com/php/php-src/commit/b58d74547f "solves this issue" since PHP 8.2+, but is that the most efficient solution for everything? If a cycle (all cycles/references to an object) is explicitly broken during GC, is there anything againts releasing that object by standard refcounting?
Resulted in this output:
d
gc
bool(true) <- notice object is kept alive after the destructor has broken the cycle (and refcount dropped to 0)
gc rerun
bool(false)
bool(false)
done
But I expected this output instead:
d
gc
bool(false)
gc rerun
bool(false)
bool(false)
done
UPDATE:
Based on https://3v4l.org/mgoqd I would call this a bug as 2nd WeakReference::get() call is expected to always give the same result if no GC is run in between the calls.
PHP Version
any (tested PHP 7.4, 8.3)
Operating System
any
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par exécuter la reproduction sur https://3v4l.org/USrWu et comparez-la avec l’exemple mis à jour sur https://3v4l.org/mgoqd, en vous concentrant sur GC, les destructeurs, les compteurs de références et WeakReference::get(). C’est terminé lorsqu’un cycle rompu pendant une exécution de GC libère immédiatement l’objet, de sorte que les deux vérifications de WeakReference correspondent à la sortie attendue sans seconde exécution de GC.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- c
- Domaine
- backend
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100