php / php/php-src

Ref counting based object release is not applied if cycle is broken in destructor during GC run

Ouverte
#13,683 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Category: GC Status: Needs Triage
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

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. 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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.