From 5dff1f7678447adc7da7fd7548b4d7b36389681c Mon Sep 17 00:00:00 2001 From: tarsin Date: Mon, 27 Feb 2023 16:30:46 +0800 Subject: [PATCH] Use platform delegate systemcall sendfile --- app/src/main/java/com/hippo/Native.kt | 19 +++++++++---------- app/src/main/java/com/hippo/ehviewer/EhDB.kt | 4 ++-- .../com/hippo/ehviewer/spider/SpiderDen.kt | 4 ++-- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/hippo/Native.kt b/app/src/main/java/com/hippo/Native.kt index 110d04183..c4120f863 100644 --- a/app/src/main/java/com/hippo/Native.kt +++ b/app/src/main/java/com/hippo/Native.kt @@ -18,6 +18,8 @@ package com.hippo import android.os.ParcelFileDescriptor +import android.system.Int64Ref +import android.system.Os import java.io.FileDescriptor object Native { @@ -27,22 +29,19 @@ object Native { @JvmStatic external fun getFd(fd: FileDescriptor?): Int +} - @JvmStatic - external fun sendfile(from: Int, to: Int) +private fun sendFileTotally(from: FileDescriptor, to: FileDescriptor) { + Os.sendfile(to, from, Int64Ref(0), Long.MAX_VALUE) } val FileDescriptor.fd get() = Native.getFd(this) -infix fun ParcelFileDescriptor.receivefrom(fd: FileDescriptor) { - Native.sendfile(fd.fd, getFd()) +infix fun ParcelFileDescriptor.sendTo(fd: FileDescriptor) { + sendFileTotally(fileDescriptor, fd) } -infix fun ParcelFileDescriptor.copyTo(fd: FileDescriptor) { - Native.sendfile(getFd(), fd.fd) -} - -infix fun ParcelFileDescriptor.copyTo(fd: ParcelFileDescriptor) { - Native.sendfile(getFd(), fd.fd) +infix fun ParcelFileDescriptor.sendTo(fd: ParcelFileDescriptor) { + sendFileTotally(fileDescriptor, fd.fileDescriptor) } diff --git a/app/src/main/java/com/hippo/ehviewer/EhDB.kt b/app/src/main/java/com/hippo/ehviewer/EhDB.kt index 9d97e5efa..de7950cdd 100644 --- a/app/src/main/java/com/hippo/ehviewer/EhDB.kt +++ b/app/src/main/java/com/hippo/ehviewer/EhDB.kt @@ -21,7 +21,6 @@ import android.os.ParcelFileDescriptor import android.os.ParcelFileDescriptor.MODE_READ_ONLY import androidx.paging.PagingSource import androidx.room.Room.databaseBuilder -import com.hippo.Native import com.hippo.ehviewer.EhApplication.Companion.ehDatabase import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.dao.BasicDao @@ -34,6 +33,7 @@ import com.hippo.ehviewer.dao.HistoryInfo import com.hippo.ehviewer.dao.LocalFavoriteInfo import com.hippo.ehviewer.dao.QuickSearch import com.hippo.ehviewer.download.DownloadManager +import com.hippo.sendTo object EhDB { private const val CUR_DB_VER = 4 @@ -379,7 +379,7 @@ object EhDB { val dbFile = context.getDatabasePath(ehExportName) context.contentResolver.openFileDescriptor(uri, "rw")!!.use { toFd -> ParcelFileDescriptor.open(dbFile, MODE_READ_ONLY).use { fromFd -> - Native.sendfile(fromFd.fd, toFd.fd) + fromFd sendTo toFd } } return true 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 c9ae37aca..03bcb8179 100644 --- a/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt +++ b/app/src/main/java/com/hippo/ehviewer/spider/SpiderDen.kt @@ -22,7 +22,7 @@ import coil.decode.DecodeUtils import coil.decode.FrameDelayRewritingSource import coil.decode.isGif import coil.disk.DiskCache -import com.hippo.copyTo +import com.hippo.sendTo import com.hippo.ehviewer.EhApplication import com.hippo.ehviewer.EhApplication.Companion.application import com.hippo.ehviewer.EhDB @@ -119,7 +119,7 @@ class SpiderDen(private val mGalleryInfo: GalleryInfo) { val file = dir.createFile(generateImageFilename(index, extension)) ?: return false (file.openOutputStream() as FileOutputStream).use { outputStream -> ParcelFileDescriptor.open(data.toFile(), MODE_READ_WRITE).use { - it copyTo outputStream.fd + it sendTo outputStream.fd } } }