Pooling the bytebuffer

This commit is contained in:
tarsin committed 2023-06-18 16:30:18 +08:00
1 parent 110fb9fb59
commit b695b06507
4 files changed
+14 -5

No files matched your search

+2
View File
@@ -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")
+3
View File
@@ -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
@@ -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
@@ -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)
}