Hacktoberfest 2026: die Issues, die Maintainer für den Oktober markiert haben – offen und einsteigerfreundlich. Hacktoberfest-Issues durchsuchen

Android jsi + QuickJS: worker close() from its message handler aborts in JS_FreeRuntime (gc_obj_list not empty)

Offen
#94 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Anfängerfreundlichkeit
48/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
android, cpp
Bereich
backend, mobile

Rechercherichtung

Start from the Android worker teardown path used when close() is called inside onmessage, then compare it with the parent terminate() path and the napi worker teardown. Trace which runtime-owned JSValues or native caches remain when JS_FreeRuntime runs. Done means the reproduced Java class, gc(), and self-close sequence exits cleanly with QuickJS and jsi.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

bug

Summary

With the jsi binding layer on QuickJS, the app aborts when a worker calls close() from inside its onmessage handler after it has used Java classes. QuickJS asserts in JS_FreeRuntime:

Assertion failed: list_empty(&rt->gc_obj_list)

That means GC objects are still alive when the worker's runtime is freed. Something still holds JSValues owned by that runtime, such as a native cache or object map that isn't released before the runtime is freed. Other combinations don't hit it:

Combination Result
napi + QuickJS, same test pass
jsi + QuickJS, terminate() from the parent pass

Reproduce

  1. Build platforms/android/test-app with QuickJS and the jsi layer:
    ./gradlew :app:assembleDebug -Pengine=QUICKJS -Pns_engine=QUICKJS -PbindingLayer=jsi -PonlyArm64 -PuseKotlin=true
  2. Use a worker that touches a Java class, forces a collection, and then closes itself from the handler:
    onmessage = () => {
      new java.lang.Object();
      gc();
      close();
    };
    
  3. From the main runtime, create the worker and postMessage to it.
  4. The app aborts in JS_FreeRuntime on every run. A collection inside the handler is required; without gc(), it depends on the heap state.

This was found while testing #92. It reproduced in 3 of 3 runs with #92 applied and in 2 of 2 runs on the unmodified base branch, so #92 does not cause it.

Expected

A worker that closes itself is torn down cleanly. Every value NativeScript holds in the runtime is released before the runtime is freed, as it is when the parent calls terminate() and in the napi tree.

Environment

  • Branch: android-react-native at 64c7fed0
  • Emulator: Android API 36, arm64
  • Engine: QuickJS (quickjs-ng), with the jsi binding layer
Vorherrschende Sprache
C++
Sterne
27
Forks
4
Ø Merge
16 Std. 48 Min.
Gemergte PRs (30 T.)
4

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus NativeScript/runtimes

Alle Issues in NativeScript/runtimes

Ähnliche Issues

Weitere Issues zu C++

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.