From d9e5bb43998eb91fd403e2dc68845d06565861fa Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Sun, 17 Dec 2023 00:33:29 +0800 Subject: [PATCH] Fix unreleased lock --- .../com/hippo/ehviewer/spider/SpiderQueen.kt | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt index b6cf853d0..5c9513cf2 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/spider/SpiderQueen.kt @@ -384,16 +384,16 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS galleryInfo.gid, galleryInfo.token!!, ) - return try { + return runSuspendCatching { ehRequest(url, referer).fetchUsingAsText { GalleryMultiPageViewerPTokenParser.parse(this).forEachIndexed { index, s -> spiderInfo.pTokenMap[index] = s } spiderInfo.pTokenMap[index] } - } catch (e: Throwable) { - ExceptionUtils.throwIfFatal(e) - return null + }.getOrElse { + it.printStackTrace() + null } } @@ -416,13 +416,13 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS previewIndex, false, ) - return try { + return runSuspendCatching { ehRequest(url, referer).fetchUsingAsText { readPreviews(this, previewIndex, spiderInfo) spiderInfo.pTokenMap[index] } - } catch (e: Throwable) { - ExceptionUtils.throwIfFatal(e) + }.getOrElse { + it.printStackTrace() null } } @@ -605,18 +605,19 @@ class SpiderQueen private constructor(val galleryInfo: GalleryInfo) : CoroutineS } } val previousPToken: String? - val pToken: String + val pToken: String? pTokenLock.withLock { - pToken = getPToken(index) ?: return updatePageState( - index, - STATE_FAILED, - PTOKEN_FAILED_MESSAGE, - ).also { + // Non-local return will not release the lock + // https://github.com/Kotlin/kotlinx.coroutines/issues/3985 + pToken = getPToken(index) + if (pToken == null) { + updatePageState(index, STATE_FAILED, PTOKEN_FAILED_MESSAGE) mSpiderInfo.pTokenMap[index] = TOKEN_FAILED } previousPToken = getPToken(index - 1) } + pToken ?: return delayLock.withLock { val new = delayedTime + mDownloadDelay