diff --git a/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/DhfsFuse.java b/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/DhfsFuse.java index 962aa262..0d7b4b08 100644 --- a/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/DhfsFuse.java +++ b/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/DhfsFuse.java @@ -51,8 +51,6 @@ public class DhfsFuse extends FuseStubFS { @ConfigProperty(name = "dhfs.files.target_chunk_size") int targetChunkSize; @Inject - JnrPtrByteOutputAccessors jnrPtrByteOutputAccessors; - @Inject DhfsFileService fileService; private long allocateHandle(JObjectKey key) { @@ -231,7 +229,7 @@ public class DhfsFuse extends FuseStubFS { var fileKey = getFromHandle(fi.fh.get()); var read = fileService.read(fileKey, offset, (int) size); if (read.isEmpty()) return 0; - UnsafeByteOperations.unsafeWriteTo(read, new JnrPtrByteOutput(jnrPtrByteOutputAccessors, buf, size)); + UnsafeByteOperations.unsafeWriteTo(read, new JnrPtrByteOutput(buf, size)); return read.size(); } catch (Throwable e) { Log.error("When reading " + path, e); @@ -246,19 +244,15 @@ public class DhfsFuse extends FuseStubFS { var fileKey = getFromHandle(fi.fh.get()); var buffer = ByteBuffer.allocateDirect((int) size); - if (buffer.isDirect()) { - jnrPtrByteOutputAccessors.getUnsafe().copyMemory( - buf.address(), - jnrPtrByteOutputAccessors.getNioAccess().getBufferAddress(buffer), - size - ); - } else { - buf.get(0, buffer.array(), 0, (int) size); - } + UnsafeAccessor.get().getUnsafe().copyMemory( + buf.address(), + UnsafeAccessor.get().getNioAccess().getBufferAddress(buffer), + size + ); var written = fileService.write(fileKey, offset, UnsafeByteOperations.unsafeWrap(buffer)); return written.intValue(); - } catch (Throwable e) { + } catch (Exception e) { Log.error("When writing " + path, e); return -ErrorCodes.EIO(); } @@ -394,7 +388,7 @@ public class DhfsFuse extends FuseStubFS { var file = fileOpt.get(); var read = fileService.readlinkBS(fileOpt.get()); if (read.isEmpty()) return 0; - UnsafeByteOperations.unsafeWriteTo(read, new JnrPtrByteOutput(jnrPtrByteOutputAccessors, buf, size)); + UnsafeByteOperations.unsafeWriteTo(read, new JnrPtrByteOutput(buf, size)); buf.putByte(Math.min(size - 1, read.size()), (byte) 0); return 0; } catch (Throwable e) { diff --git a/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/JnrPtrByteOutput.java b/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/JnrPtrByteOutput.java index 77fc38a1..3d55be26 100644 --- a/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/JnrPtrByteOutput.java +++ b/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/JnrPtrByteOutput.java @@ -9,14 +9,12 @@ import java.nio.MappedByteBuffer; public class JnrPtrByteOutput extends ByteOutput { private final Pointer _backing; private final long _size; - private final JnrPtrByteOutputAccessors _accessors; private long _pos; - public JnrPtrByteOutput(JnrPtrByteOutputAccessors accessors, Pointer backing, long size) { + public JnrPtrByteOutput(Pointer backing, long size) { _backing = backing; _size = size; _pos = 0; - _accessors = accessors; } @Override @@ -47,9 +45,9 @@ public class JnrPtrByteOutput extends ByteOutput { if (value instanceof MappedByteBuffer mb) { mb.load(); } - long addr = _accessors.getNioAccess().getBufferAddress(value) + value.position(); + long addr = UnsafeAccessor.get().getNioAccess().getBufferAddress(value) + value.position(); var out = _backing.address() + _pos; - _accessors.getUnsafe().copyMemory(addr, out, rem); + UnsafeAccessor.get().getUnsafe().copyMemory(addr, out, rem); } else { _backing.put(_pos, value.array(), value.arrayOffset() + value.position(), rem); } diff --git a/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/JnrPtrByteOutputAccessors.java b/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/JnrPtrByteOutputAccessors.java deleted file mode 100644 index ab89b006..00000000 --- a/dhfs-parent/dhfs-fuse/src/main/java/com/usatiuk/dhfsfuse/JnrPtrByteOutputAccessors.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.usatiuk.dhfsfuse; - -import jakarta.inject.Singleton; -import jdk.internal.access.JavaNioAccess; -import jdk.internal.access.SharedSecrets; -import sun.misc.Unsafe; - -import java.lang.reflect.Field; - -@Singleton -class JnrPtrByteOutputAccessors { - JavaNioAccess _nioAccess; - Unsafe _unsafe; - - JnrPtrByteOutputAccessors() throws NoSuchFieldException, IllegalAccessException { - _nioAccess = SharedSecrets.getJavaNioAccess(); - Field f = Unsafe.class.getDeclaredField("theUnsafe"); - f.setAccessible(true); - _unsafe = (Unsafe) f.get(null); - } - - public JavaNioAccess getNioAccess() { - return _nioAccess; - } - - public Unsafe getUnsafe() { - return _unsafe; - } -} diff --git a/dhfs-parent/utils/src/main/java/com/usatiuk/utils/UnsafeAccessor.java b/dhfs-parent/utils/src/main/java/com/usatiuk/utils/UnsafeAccessor.java new file mode 100644 index 00000000..d6c33519 --- /dev/null +++ b/dhfs-parent/utils/src/main/java/com/usatiuk/utils/UnsafeAccessor.java @@ -0,0 +1,41 @@ +package com.usatiuk.utils; + +import jdk.internal.access.JavaNioAccess; +import jdk.internal.access.SharedSecrets; +import sun.misc.Unsafe; + +import java.lang.reflect.Field; + +public class UnsafeAccessor { + private static final UnsafeAccessor INSTANCE; + + static { + try { + INSTANCE = new UnsafeAccessor(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static UnsafeAccessor get() { + return INSTANCE; + } + + private JavaNioAccess _nioAccess; + private Unsafe _unsafe; + + private UnsafeAccessor() throws NoSuchFieldException, IllegalAccessException { + _nioAccess = SharedSecrets.getJavaNioAccess(); + Field f = Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + _unsafe = (Unsafe) f.get(null); + } + + public JavaNioAccess getNioAccess() { + return _nioAccess; + } + + public Unsafe getUnsafe() { + return _unsafe; + } +}