glide icon indicating copy to clipboard operation
glide copied to clipboard

Deadlock inside RequestManager

Open aperfilyev opened this issue 1 year ago • 0 comments

Glide Version:4.16.0

Integration libraries:

Device/Android Version:

Issue details / Repro steps / Use case background: I noticed some ANR issues in Firebase that relate to this problem.

Stack trace / LogCat:

main (blocked):tid=1 systid=14340 | waiting to lock <0x0178642c> (java.lang.Object) held by thread 170
       at com.bumptech.glide.request.SingleRequest.isComplete(SingleRequest.java:367)
       at com.bumptech.glide.RequestManager.resumeRequests(RequestManager.java)
       at com.bumptech.glide.RequestManager.onStart(RequestManager.java)
       at com.bumptech.glide.manager.ApplicationLifecycle.addListener(ApplicationLifecycle.java:15)
       at com.bumptech.glide.RequestManager$1.run(RequestManager.java:84)
       at android.os.Handler.handleCallback(Handler.java:966)
       at android.os.Handler.dispatchMessage(Handler.java:110)
       at android.os.Looper.loopOnce(Looper.java:205)
       at android.os.Looper.loop(Looper.java:293)
       at android.app.ActivityThread.main(ActivityThread.java:9697)
       at java.lang.reflect.Method.invoke(Native method)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1211)

glide-source-thread-3 (blocked):tid=170 systid=14784 | waiting to lock <0x04d03ef5> (com.bumptech.glide.l) held by thread 1
       at com.bumptech.glide.RequestBuilder.<init>(RequestBuilder.java:95)
       at com.bumptech.glide.RequestManager.as(RequestManager.java:611)
       at com.bumptech.glide.RequestManager.asBitmap(RequestManager.java:407)
       at com.example.app.defaults.StoriesImageLoaderDefault.loadBitmap(StoriesImageLoaderDefault.kt)
       at com.example.app.common.StoriesImageLoaderInternalImpl.awaitLoadBitmapUnsafe(StoriesImageLoaderInternal.kt)
       at com.example.app.common.StoriesImageLoaderInternalImpl.awaitLoadBitmap(StoriesImageLoaderInternal.kt)
       at com.example.app.common.StoriesImageLoaderInternalImpl.awaitLoadBitmapOrThrow(StoriesImageLoaderInternal.kt)
       at com.example.app.common.StoriesImageLoaderInternalImpl$awaitLoadBitmapOrNull$2.invokeSuspend(StoriesImageLoaderInternal.kt)
       at com.example.app.common.StoriesImageLoaderInternalImpl$awaitLoadBitmapOrNull$2.invoke(StoriesImageLoaderInternal.kt)
       at com.example.app.common.StoriesErrorListenerKt.catchingSuspend(StoriesErrorListener.kt)
       at com.example.app.common.StoriesImageLoaderInternalImpl.awaitLoadBitmapOrNull(StoriesImageLoaderInternal.kt)
       at com.example.app.common.StoriesImageLoaderInternal$DefaultImpls.awaitLoadBitmapOrNull$default(StoriesImageLoaderInternal.kt)
       at com.example.app.ui.cookies.model.converter.DomainStoryCookieToUiConverterKt.buildImageLayer-7WxChyE(DomainStoryCookieToUiConverter.kt)
       at com.example.app.ui.cookies.model.converter.DomainStoryCookieToUiConverterKt.buildRegularLayers-3jy_d7E(DomainStoryCookieToUiConverter.kt)
       at com.example.app.ui.cookies.model.converter.DomainStoryCookieToUiConverterKt.access$buildDefault-5E_8A90(DomainStoryCookieToUiConverter.kt)
       at com.example.app.ui.cookies.model.converter.DomainStoryCookieToUiConverterKt$toUi$2$1.invokeSuspend(DomainStoryCookieToUiConverter.kt)
       at com.example.app.ui.cookies.model.converter.DomainStoryCookieToUiConverterKt$toUi$2$1.invoke(DomainStoryCookieToUiConverter.kt)
       at com.example.app.common.StoriesErrorListenerKt.catchingStoriesException(StoriesErrorListener.kt)
       at com.example.app.common.StoriesErrorListenerKt.catchingStoriesException$default(StoriesErrorListener.kt)
       at com.example.app.ui.cookies.model.converter.DomainStoryCookieToUiConverterKt.catchCookiesConvert(DomainStoryCookieToUiConverter.kt)
       at com.example.app.ui.cookies.model.converter.DomainStoryCookieToUiConverterKt.toUi-3jy_d7E(DomainStoryCookieToUiConverter.kt)
       at com.example.app.ui.cookies.presentation.converter.CookiesConverter$convert$2$1$1.invokeSuspend(CookiesConverter.kt)
       at com.example.app.ui.cookies.presentation.converter.CookiesConverter$convert$2$1$1.invoke(CookiesConverter.kt)
       at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt)
       at kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:147)
       at kotlinx.coroutines.BuildersKt.withContext(Builders.kt:1)
       at com.example.app.ui.cookies.presentation.converter.CookiesConverter$convert$2$1.invokeSuspend(CookiesConverter.kt)
       at com.example.app.ui.cookies.presentation.converter.CookiesConverter$convert$2$1.invoke(CookiesConverter.kt)
       at com.example.app.common.StoriesErrorListenerKt.catchingSuspend(StoriesErrorListener.kt)
       at com.example.app.ui.cookies.presentation.converter.CookiesConverter$convert$2.invokeSuspend(CookiesConverter.kt)
       at com.example.app.ui.cookies.presentation.converter.CookiesConverter$convert$2.invoke(CookiesConverter.kt)
       at com.example.app.core.components.utils.coroutines.AsyncsKt$asyncMap$2$1$1.invokeSuspend(Asyncs.kt)
       at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt)
       at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:81)
       at kotlinx.coroutines.EventLoop.processUnconfinedEvent(EventLoop.common.kt:63)
       at kotlinx.coroutines.DispatchedTaskKt.resumeUnconfined(DispatchedTask.kt:180)
       at kotlinx.coroutines.DispatchedTaskKt.dispatch(DispatchedTask.kt:150)
       at kotlinx.coroutines.CancellableContinuationImpl.dispatchResume(CancellableContinuationImpl.kt:464)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt:489)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl(CancellableContinuationImpl.kt:489)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeImpl$default(CancellableContinuationImpl.kt)
       at kotlinx.coroutines.CancellableContinuationImpl.resumeWith(CancellableContinuationImpl.kt:364)
       at com.example.app.common.StoriesImageLoaderKt$loadBitmapAsync$2$disposable$1.invoke(StoriesImageLoader.kt:74)
       at com.example.app.defaults.StoriesImageLoaderDefault$loadBitmap$task$2.onResourceReady(StoriesImageLoaderDefault.kt:52)
       at com.bumptech.glide.request.SingleRequest.onResourceReady(SingleRequest.java:620)
       at com.bumptech.glide.request.SingleRequest.onResourceReady(SingleRequest.java:544)
       at com.bumptech.glide.load.engine.EngineJob$CallResourceReady.run(EngineJob.java:423)
       at com.bumptech.glide.util.Executors$2.execute(Executors.java:26)
       at com.bumptech.glide.load.engine.DecodeJob.notifyComplete(DecodeJob.java:338)
       at com.bumptech.glide.load.engine.DecodeJob.decodeFromRetrievedData(DecodeJob.java:421)
       at com.bumptech.glide.load.engine.DecodeJob.onDataFetcherReady(DecodeJob.java:387)
       at com.bumptech.glide.load.engine.SourceGenerator.onDataFetcherReady(SourceGenerator.java:239)
       at com.bumptech.glide.load.engine.DataCacheGenerator.onDataReady(DataCacheGenerator.java:100)
       at com.bumptech.glide.load.model.ByteBufferFileLoader$ByteBufferFetcher.loadData(ByteBufferFileLoader.java:61)
       at com.bumptech.glide.load.engine.DataCacheGenerator.startNext(DataCacheGenerator.java:49)
       at com.bumptech.glide.load.engine.SourceGenerator.startNext(SourceGenerator.java:52)
       at com.bumptech.glide.load.engine.DecodeJob.runGenerators(DecodeJob.java:306)
       at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:273)
       at com.bumptech.glide.load.engine.DecodeJob.run(DecodeJob.java:229)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
       at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultThreadFactory$1.run(GlideExecutor.java:419)
       at java.lang.Thread.run(Thread.java:930)
       at com.bumptech.glide.load.engine.executor.GlideExecutor$DefaultPriorityThreadFactory$1.run(GlideExecutor.java)

aperfilyev avatar Oct 17 '24 08:10 aperfilyev