Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

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

Aperta
#94 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
48/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
android, cpp
Ambito
backend, mobile

Direzione di ricerca

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.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

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
Lingua principale
C++
Stelle
27
Fork
4
Merge medio
16h 48m
PR unite (30g)
4

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di NativeScript/runtimes

Tutte le issue di NativeScript/runtimes

Issue simili

Altre issue su C++

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.