Non-suspended generators in suspended Fiber do not participate in GC
Offen
Dieses Issue hat noch niemand übernommen.
Bug
Category: Engine
Category: Fibers
Category: GC
Category: Generators
Status: Verified
- Vorherrschende Sprache
- C
- Sterne
- 40.4k
- Forks
- 8.1k
- Ø Merge
- 2 T. 13 Std.
- Gemergte PRs (30 T.)
- 96
Beschreibung
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
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Führe zunächst den bereitgestellten PHP-8.1-Reproducer aus und verfolge den Lebenszyklus von Fiber und Generator während gc_collect_cycles(). Untersuche, wie nicht pausierte Generatoren, die von einer pausierten Fiber gehalten werden, an der Garbage Collection teilnehmen; erledigt ist die Aufgabe, wenn beide Destruktoren vor der Ausgabe "Shutdown" ausgeführt werden.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- c, php
- Bereich
- backend
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Größtenteils klar
- Anfängerfreundlichkeit
- 35/100