WeakRef requires rescuing RefError to avoid race condition
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Anfängerfreundlichkeit
- 35/100
Rechercherichtung
Beginnen Sie mit der WeakRef API, insbesondere mit weakref_alive?, dem delegierten Zugriff, der Behandlung von RefError und der nicht empfohlenen WeakMap-Alternative. Lesen Sie die verlinkte Stack Overflow-Diskussion zum Kontext der Race Condition; abgeschlossen ist die Aufgabe, wenn Sie sich auf eine API geeinigt und diese implementiert haben, die sicher ein stark referenziertes Objekt zurückgibt, wenn es noch lebt, oder andernfalls nil.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
There's an race condition in the implied usage of WeakRef.
The API only has weakref_alive?, and then delegated access to the referenced object. But the delegated access to the object cannot be protected by weakref_alive? since GC may occur between the check and the usage.
This means we basically always have to check for RefError, which basically makes weakref_alive? useless if we want to actually potentially use the object.
WeakMap usage is discouraged, leaving us with needing to add this functionality to WeakRef, which may break if WeakRef implementation changes (i.e., there is no good solution for this).
This is discussed at length here:
https://stackoverflow.com/questions/69185508/ruby-weakref-has-implicit-race-condition
I would recommend an addition to the API that will safely return a (non-weak) object if it's alive, or else nil, and obviously it's up to the user to realize that this will stop GC from happening on that object while they hold it.
- Vorherrschende Sprache
- Ruby
- Sterne
- 20
- Forks
- 8
- Ø Merge
- 11 Std. 2 Min.
- Gemergte PRs (30 T.)
- 2
Entwicklungsumgebung
Die Einrichtungsdateien dieses Projekts haben wir noch nicht geprüft. Beginnen Sie mit der README; die allgemeinen Schritte stehen in unserem Leitfaden für den ersten Beitrag.
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus ruby/weakref
Ähnliche Issues
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
solana-foundation/pay-kit#341 ·
Maintainer antworten meist innerhalb von 1 Tag
-
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 95/100
Maintainer antworten meist innerhalb von 1 Tag
-
enhancement
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 88/100
Maintainer antworten meist innerhalb von 1 Tag
-
Cask still fails to install: `depends_on macos: :catalina` is now disabled (regression after #58)Offen
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 92/100