From b695b065075bcabe953d5a9dffd7269c3b28a221 Mon Sep 17 00:00:00 2001 From: tarsin Date: Sun, 18 Jun 2023 16:30:18 +0800 Subject: [PATCH] Pooling the bytebuffer --- app/build.gradle.kts | 2 ++ app/proguard-rules.pro | 3 +++ .../ehviewer/spider/Android14CoroutineHttpEngine.kt | 12 ++++++++---- .../main/java/com/hippo/ehviewer/spider/SpiderDen.kt | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 595e99e70..b8e68d102 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -244,6 +244,8 @@ dependencies { implementation("io.coil-kt:coil-compose") implementation("io.coil-kt:coil-gif") + implementation("io.ktor:ktor-io-jvm:2.3.1") + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1") implementation("org.jetbrains.kotlinx:kotlinx-serialization-cbor:1.5.1") implementation("org.jsoup:jsoup:1.16.1") diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 396adbcca..67831872e 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -17,6 +17,9 @@ -keep class com.hippo.ehviewer.client.parser.TorrentResult { *; } -keep class com.hippo.ehviewer.client.parser.Limits { *; } +# Ktor logger +-dontwarn org.slf4j.impl.StaticLoggerBinder + -keepattributes LineNumberTable,SourceFile -renamesourcefileattribute SourceFile diff --git a/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt b/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt index ebeede1de..27d57c0e2 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/Android14CoroutineHttpEngine.kt @@ -9,6 +9,7 @@ import android.net.http.UrlResponseInfo import android.os.Build import androidx.annotation.RequiresExtension import com.hippo.ehviewer.EhApplication +import io.ktor.utils.io.pool.DirectByteBufferPool import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine @@ -18,6 +19,8 @@ import kotlin.coroutines.Continuation import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException +private val pool = DirectByteBufferPool(32) + val cronetHttpClient = HttpEngine.Builder(appCtx).apply { setEnableHttp2(true) setEnableBrotli(true) @@ -54,28 +57,29 @@ class CronetRequest { override fun onSucceeded(p0: UrlRequest, p1: UrlResponseInfo) { val length = p1.receivedByteCount // TODO: validate body length + pool.recycle(buffer) readerCont.resume(Unit) daemonCont.resume(true) } override fun onFailed(p0: UrlRequest, p1: UrlResponseInfo?, p2: HttpException) { + pool.recycle(buffer) daemonCont.resumeWithException(p2) } override fun onCanceled(p0: UrlRequest, p1: UrlResponseInfo?) { - // No-op + pool.recycle(buffer) } } - // TODO: Pool it - val buffer: ByteBuffer = ByteBuffer.allocateDirect(4096) + val buffer = pool.borrow() } inline fun cronetRequest(url: String, conf: UrlRequest.Builder.() -> Unit) = CronetRequest().apply { request = cronetHttpClient.newUrlRequestBuilder(url, cronetHttpClientExecutor, callback).apply(conf).build() } -suspend infix fun CronetRequest.consumeBody(callback: (UrlResponseInfo, ByteBuffer) -> Unit) = apply { +suspend infix fun CronetRequest.consumeBodyFully(callback: (UrlResponseInfo, ByteBuffer) -> Unit) = apply { mConsumer = callback suspendCancellableCoroutine { cont -> readerCont = cont diff --git a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt index 4d8a986d8..648cd6f8c 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -142,7 +142,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { saveResponseMeta(index, type, length) { file -> file.openOutputStream().use { val chan = it.channel - consumeBody { info, buffer -> + consumeBodyFully { info, buffer -> val read = chan.write(buffer) notifyProgress(length, info.receivedByteCount, read) }