From 9bc3c9a902a2a235a26437d792ff59856c23f7a9 Mon Sep 17 00:00:00 2001 From: tarsin Date: Fri, 24 Feb 2023 20:02:35 +0800 Subject: [PATCH] Add Resource lock to avoid memory corruption --- .../java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt index 75ee0620a..0a1ead20d 100644 --- a/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt +++ b/app/src/main/java/com/hippo/ehviewer/gallery/ArchivePageLoader.kt @@ -32,7 +32,9 @@ import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.ensureActive import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.launch +import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Semaphore +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withPermit import java.io.FileOutputStream import java.io.IOException @@ -75,6 +77,7 @@ class ArchivePageLoader(context: Context, uri: Uri, passwdFlow: Flow) : } private val mJobMap = hashMapOf() + private val mWorkerMutex by lazy { (0 until size).map { Mutex() } } private val mSemaphore = Semaphore(4) override fun onRequest(index: Int) { @@ -82,8 +85,10 @@ class ArchivePageLoader(context: Context, uri: Uri, passwdFlow: Flow) : val current = mJobMap[index] if (current?.isActive != true) { mJobMap[index] = launch { - mSemaphore.withPermit { - doRealWork(index) + mWorkerMutex[index].withLock { + mSemaphore.withPermit { + doRealWork(index) + } } } }