frostwire / frostwire-jlibtorrent

A swig Java interface for libtorrent by the makers of FrostWire. Develop libtorrent based apps with the joy of coding in Java.
http://www.frostwire.com
MIT License
446 stars 137 forks source link

[1.2.0.10 - 15][Android] Crashes in libtorrent_jni.delete_session #189

Closed proninyaroslav closed 6 years ago

proninyaroslav commented 6 years ago

Hi. Starting with version 1.2.0.10 in the Google Console ANR I began to notice the following crashes:

"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x755aa978 self=0xa4a04400
  | sysTid=11497 nice=-4 cgrp=default sched=0/0 handle=0xa7cb4534
  | state=S schedstat=( 35906615473 8161293326 146385 ) utm=3121 stm=469 core=4 HZ=100
  | stack=0xbe788000-0xbe78a000 stackSize=8MB
  | held mutexes=
  #00  pc 00000000000175c8  /system/lib/libc.so (syscall+28)
  #01  pc 00000000000476ff  /system/lib/libc.so (pthread_join+146)
  #02  pc 00000000003e8e67  /data/app/org.proninyaroslav.libretorrent-2/lib/arm/libjlibtorrent.so (_ZNSt6__ndk16thread4joinEv+14)
  #03  pc 0000000000144af4  /data/app/org.proninyaroslav.libretorrent-2/lib/arm/libjlibtorrent.so (???)
  #04  pc 00000000000f1090  /data/app/org.proninyaroslav.libretorrent-2/lib/arm/libjlibtorrent.so (Java_com_frostwire_jlibtorrent_swig_libtorrent_1jni_delete_1session+20)
  at com.frostwire.jlibtorrent.swig.libtorrent_jni.delete_session (Native method)
  at com.frostwire.jlibtorrent.swig.session.delete (session.java:31)
- locked <0x0bbc4677> (a com.frostwire.jlibtorrent.swig.session)
  at com.frostwire.jlibtorrent.SessionManager.stop (SessionManager.java:164)
  at org.proninyaroslav.libretorrent.core.TorrentEngine.stop (TorrentEngine.java:224)
  at org.proninyaroslav.libretorrent.services.TorrentTaskService.onDestroy (TorrentTaskService.java:224)
  at android.app.ActivityThread.handleStopService (ActivityThread.java:3462)
  at android.app.ActivityThread.-wrap27 (ActivityThread.java)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1638)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:154)
  at android.app.ActivityThread.main (ActivityThread.java:6316)
  at java.lang.reflect.Method.invoke! (Native method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:872)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:762)
"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x756b3598 self=0xf4b76500
  | sysTid=4237 nice=-11 cgrp=default sched=0/0 handle=0xf7249d54
  | state=S schedstat=( 0 0 0 ) utm=48 stm=25 core=2 HZ=100
  | stack=0xff53f000-0xff541000 stackSize=8MB
  | held mutexes=
  #00  pc 0000000000017694  /system/lib/libc.so (syscall+28)
  #01  pc 0000000000040185  /system/lib/libc.so (pthread_join+124)
  #02  pc 0000000000456be5  /data/app/org.proninyaroslav.libretorrent-1/lib/arm/libjlibtorrent.so (_ZNSt6__ndk16thread4joinEv+16)
  #03  pc 0000000000272d08  /data/app/org.proninyaroslav.libretorrent-1/lib/arm/libjlibtorrent.so (_ZN10libtorrent7sessionD1Ev+488)
  #04  pc 000000000021aabc  /data/app/org.proninyaroslav.libretorrent-1/lib/arm/libjlibtorrent.so (Java_com_frostwire_jlibtorrent_swig_libtorrent_1jni_delete_1session+20)
  at com.frostwire.jlibtorrent.swig.libtorrent_jni.delete_session (Native method)
  at com.frostwire.jlibtorrent.swig.session.delete (session.java:31)
- locked <0x09aead14> (a com.frostwire.jlibtorrent.swig.session)
  at com.frostwire.jlibtorrent.SessionManager.stop (SessionManager.java:146)
  at org.proninyaroslav.libretorrent.services.TorrentTaskService.onDestroy (TorrentTaskService.java:197)
  at android.app.ActivityThread.handleStopService (ActivityThread.java:4094)
  at android.app.ActivityThread.access$2500 (ActivityThread.java:222)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1904)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:158)
  at android.app.ActivityThread.main (ActivityThread.java:7230)
  at java.lang.reflect.Method.invoke! (Native method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1230)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1120)

If necessary I can provide more logs.

aldenml commented 6 years ago

That's normal in android, the session destructor can take a while if trackers and peers connections are alive. Back then I didn't manage that destruction properly, and now SessionManager#stop is a blocking operation, calling it in onDestroy will cause you an ANR.

I recommend you change the pattern of your service destruction, spanning a thread if necessary. See https://github.com/frostwire/frostwire/blob/master/android/src/com/frostwire/android/gui/services/EngineService.java#L112-L112 for other ideas.