summaryrefslogtreecommitdiff
path: root/src/main/java/com/keuin/kbackupfabric/util
diff options
context:
space:
mode:
authorKeuin <[email protected]>2024-01-20 00:58:31 +0800
committerKeuin <[email protected]>2024-01-20 01:43:30 +0800
commit62ae677f748d90f8117bd063938a4b77f6ad0705 (patch)
tree8491bed3ad4d6d1a820068d85602ca734a67603f /src/main/java/com/keuin/kbackupfabric/util
parent61aa66b558ae8f2987a238216ac01e375f195c1e (diff)
feature: native copy-on-write support
Diffstat (limited to 'src/main/java/com/keuin/kbackupfabric/util')
-rw-r--r--src/main/java/com/keuin/kbackupfabric/util/cow/FileCopier.java9
-rw-r--r--src/main/java/com/keuin/kbackupfabric/util/cow/FileCowCopier.java41
-rw-r--r--src/main/java/com/keuin/kbackupfabric/util/cow/FileEagerCopier.java17
3 files changed, 67 insertions, 0 deletions
diff --git a/src/main/java/com/keuin/kbackupfabric/util/cow/FileCopier.java b/src/main/java/com/keuin/kbackupfabric/util/cow/FileCopier.java
new file mode 100644
index 0000000..eb21af7
--- /dev/null
+++ b/src/main/java/com/keuin/kbackupfabric/util/cow/FileCopier.java
@@ -0,0 +1,9 @@
+package com.keuin.kbackupfabric.util.cow;
+
+import java.io.IOException;
+
+public interface FileCopier {
+ void copy(String dst, String src) throws IOException;
+
+ boolean isCow();
+}
diff --git a/src/main/java/com/keuin/kbackupfabric/util/cow/FileCowCopier.java b/src/main/java/com/keuin/kbackupfabric/util/cow/FileCowCopier.java
new file mode 100644
index 0000000..e52a893
--- /dev/null
+++ b/src/main/java/com/keuin/kbackupfabric/util/cow/FileCowCopier.java
@@ -0,0 +1,41 @@
+package com.keuin.kbackupfabric.util.cow;
+
+import com.keuin.kbackupfabric.util.PrintUtil;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+public final class FileCowCopier {
+ private static final AtomicBoolean initialized = new AtomicBoolean(false);
+
+ static {
+ try {
+ System.loadLibrary("kbackup_cow");
+ } catch (SecurityException | UnsatisfiedLinkError ignored) {
+ }
+ }
+
+ public static native void init();
+
+ public static native void copy(String dst, String src) throws IOException;
+
+ public static native String getVersion();
+
+ public static FileCopier getInstance() {
+ if (initialized.compareAndSet(false, true)) {
+ FileCowCopier.init();
+ PrintUtil.info("kbackup-cow version: " + FileCowCopier.getVersion());
+ }
+ return new FileCopier() {
+ @Override
+ public void copy(String dst, String src) throws IOException {
+ FileCowCopier.copy(dst, src);
+ }
+
+ @Override
+ public boolean isCow() {
+ return true;
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/keuin/kbackupfabric/util/cow/FileEagerCopier.java b/src/main/java/com/keuin/kbackupfabric/util/cow/FileEagerCopier.java
new file mode 100644
index 0000000..0f12374
--- /dev/null
+++ b/src/main/java/com/keuin/kbackupfabric/util/cow/FileEagerCopier.java
@@ -0,0 +1,17 @@
+package com.keuin.kbackupfabric.util.cow;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+public class FileEagerCopier implements FileCopier {
+ @Override
+ public void copy(String dst, String src) throws IOException {
+ Files.copy(Paths.get(src), Paths.get(dst));
+ }
+
+ @Override
+ public boolean isCow() {
+ return false;
+ }
+}