php / php/php-src

Non-suspended generators in suspended Fiber do not participate in GC

Ouverte
#10,134 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Bug Category: Engine Category: Fibers Category: GC Category: Generators Status: Verified
Langage dominant
C
Étoiles
40.4k
Forks
8.2k
Merge moyen
2 j 13 h
PR mergées (30 j)
96

Description

Description

Found this while checking if https://github.com/php/php-src/issues/9916 also happened during GC.

The following code:

<?php

class Canary {
    public function __construct(
        public readonly string $x,
    ) {
    }

    public function __destruct() {
        var_dump($this->x);
    }
}

$gen = (function() {
    $canary = new Canary('Generator dtor');
    $fiber = yield;
    Fiber::suspend();
})();

$fiber = new Fiber(function() use ($gen, &$fiber) {
    $canary = new Canary('Fiber dtor');
    $gen->send($fiber);
});
$fiber->start();

$gen = null;
$fiber = null;
gc_collect_cycles();

var_dump('Shutdown');

Resulted in this output:

string(8) "Shutdown"
string(14) "Generator dtor"
string(10) "Fiber dtor"

But I expected this output instead:

string(14) "Generator dtor"
string(10) "Fiber dtor"
string(8) "Shutdown"
PHP Version

PHP 8.1

Operating System

No response

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 le reproducteur fourni pour PHP 8.1 et suivez le cycle de vie de Fiber et Generator pendant gc_collect_cycles(). Étudiez comment les générateurs non suspendus détenus par un Fiber suspendu participent au garbage collection ; le travail est terminé lorsque les deux destructeurs s’exécutent avant la sortie "Shutdown".

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
c, php
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.