From 17491be69306eab5cd55c46c17d4d410d79e93f5 Mon Sep 17 00:00:00 2001 From: Debian Java Maintainers Date: Thu, 28 Feb 2019 15:38:12 +0100 Subject: cleaner Bug-Debian: https://bugs.debian.org/893495 Bug-Debian: https://bugs.debian.org/917727 Forwarded: no Last-Update: 2019-02-28 Gbp-Pq: Name cleaner.patch --- .../net/openhft/lang/io/AbstractMappedStore.java | 9 ++++---- .../java/net/openhft/lang/io/ByteBufferReuse.java | 7 ++++-- .../java/net/openhft/lang/io/CharBufferReuse.java | 7 ++++-- .../main/java/net/openhft/lang/io/DirectStore.java | 9 ++++---- .../src/main/java/net/openhft/lang/io/IOTools.java | 27 ++++++++++++++++++---- .../main/java/net/openhft/lang/io/NativeBytes.java | 13 +++++++++++ .../net/openhft/lang/io/VanillaMappedBytes.java | 23 ++++++++++++++---- 7 files changed, 75 insertions(+), 20 deletions(-) (limited to 'lang') diff --git a/lang/src/main/java/net/openhft/lang/io/AbstractMappedStore.java b/lang/src/main/java/net/openhft/lang/io/AbstractMappedStore.java index 3708e1b..58aa5c1 100644 --- a/lang/src/main/java/net/openhft/lang/io/AbstractMappedStore.java +++ b/lang/src/main/java/net/openhft/lang/io/AbstractMappedStore.java @@ -28,7 +28,7 @@ import java.util.logging.Logger; import net.openhft.lang.io.serialization.ObjectSerializer; import net.openhft.lang.model.constraints.NotNull; -import sun.misc.Cleaner; +import java.lang.ref.Cleaner; import sun.nio.ch.FileChannelImpl; abstract class AbstractMappedStore implements BytesStore, Closeable { @@ -39,7 +39,8 @@ abstract class AbstractMappedStore implements BytesStore, Closeable { // retain to prevent GC. private final File file; private final RandomAccessFile raf; - private final Cleaner cleaner; + private final static Cleaner cleaner = Cleaner.create(); + private Cleaner.Cleanable cleanable; private final AtomicInteger refCount = new AtomicInteger(1); private final FileChannel.MapMode mode; protected final MmapInfoHolder mmapInfoHolder; @@ -59,7 +60,7 @@ abstract class AbstractMappedStore implements BytesStore, Closeable { this.raf = new RandomAccessFile(file, accesModeFor(mode)); resizeIfNeeded(startInFile, size); map(startInFile); - this.cleaner = Cleaner.create(this, new Unmapper(mmapInfoHolder, raf)); + this.cleanable = cleaner.register(this, new Unmapper(mmapInfoHolder, raf)); } catch (Exception e) { throw wrap(e); } @@ -173,7 +174,7 @@ abstract class AbstractMappedStore implements BytesStore, Closeable { @Override public final void free() { - cleaner.clean(); + cleanable.clean(); } @Override diff --git a/lang/src/main/java/net/openhft/lang/io/ByteBufferReuse.java b/lang/src/main/java/net/openhft/lang/io/ByteBufferReuse.java index e14c9e0..d661b47 100644 --- a/lang/src/main/java/net/openhft/lang/io/ByteBufferReuse.java +++ b/lang/src/main/java/net/openhft/lang/io/ByteBufferReuse.java @@ -117,12 +117,15 @@ interface ByteBufferReuse { final byte[] impl = cw.toByteArray(); - final Unsafe unsafe = NativeBytes.UNSAFE; Class clazz = AccessController.doPrivileged(new PrivilegedAction() { @Override public Class run() { ClassLoader cl = MAGIC_CLASS_LOADER; - return unsafe.defineClass(reuseImplClassName, impl, 0, impl.length, cl, null); + try { + return (Class) NativeBytes.defineClassMethodHandle.bindTo(cl).invokeWithArguments(reuseImplClassName, impl, 0, impl.length); + } catch (Throwable e) { + throw new RuntimeException(e); + } } }); try { diff --git a/lang/src/main/java/net/openhft/lang/io/CharBufferReuse.java b/lang/src/main/java/net/openhft/lang/io/CharBufferReuse.java index 89ef031..2f8a32e 100644 --- a/lang/src/main/java/net/openhft/lang/io/CharBufferReuse.java +++ b/lang/src/main/java/net/openhft/lang/io/CharBufferReuse.java @@ -102,12 +102,15 @@ interface CharBufferReuse { final byte[] impl = cw.toByteArray(); - final Unsafe unsafe = NativeBytes.UNSAFE; Class clazz = AccessController.doPrivileged(new PrivilegedAction() { @Override public Class run() { ClassLoader cl = MAGIC_CLASS_LOADER; - return unsafe.defineClass(reuseImplClassName, impl, 0, impl.length, cl, null); + try { + return (Class) NativeBytes.defineClassMethodHandle.bindTo(cl).invokeWithArguments(reuseImplClassName, impl, 0, impl.length); + } catch (Throwable e) { + throw new RuntimeException(e); + } } }); try { diff --git a/lang/src/main/java/net/openhft/lang/io/DirectStore.java b/lang/src/main/java/net/openhft/lang/io/DirectStore.java index ca1b4a3..fd69925 100644 --- a/lang/src/main/java/net/openhft/lang/io/DirectStore.java +++ b/lang/src/main/java/net/openhft/lang/io/DirectStore.java @@ -22,7 +22,7 @@ import net.openhft.lang.io.serialization.JDKZObjectSerializer; import net.openhft.lang.io.serialization.ObjectSerializer; import net.openhft.lang.io.serialization.impl.VanillaBytesMarshallerFactory; import net.openhft.lang.model.constraints.NotNull; -import sun.misc.Cleaner; +import java.lang.ref.Cleaner; import java.io.File; import java.util.concurrent.atomic.AtomicInteger; @@ -32,7 +32,8 @@ import java.util.concurrent.atomic.AtomicInteger; */ public class DirectStore implements BytesStore, AutoCloseable { private final ObjectSerializer objectSerializer; - private final Cleaner cleaner; + private final static Cleaner cleaner = Cleaner.create(); + private Cleaner.Cleanable cleanable; private final Deallocator deallocator; private long address; private long size; @@ -62,7 +63,7 @@ public class DirectStore implements BytesStore, AutoCloseable { this.size = size; deallocator = new Deallocator(address); - cleaner = Cleaner.create(this, deallocator); + cleanable = cleaner.register(this, deallocator); } @Override @@ -123,7 +124,7 @@ public class DirectStore implements BytesStore, AutoCloseable { } public void free() { - cleaner.clean(); + cleanable.clean(); } public long size() { diff --git a/lang/src/main/java/net/openhft/lang/io/IOTools.java b/lang/src/main/java/net/openhft/lang/io/IOTools.java index b87cb68..5e9f477 100644 --- a/lang/src/main/java/net/openhft/lang/io/IOTools.java +++ b/lang/src/main/java/net/openhft/lang/io/IOTools.java @@ -19,8 +19,8 @@ package net.openhft.lang.io; import net.openhft.lang.model.constraints.NotNull; import net.openhft.lang.model.constraints.Nullable; import org.slf4j.LoggerFactory; -import sun.misc.Cleaner; import sun.nio.ch.DirectBuffer; +import sun.misc.Unsafe; import java.io.Closeable; import java.io.File; @@ -28,6 +28,8 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.Charset; +import java.lang.reflect.Method; + /** * @author peter.lawrey */ @@ -35,6 +37,19 @@ public enum IOTools { ; public static final Charset ISO_8859_1 = Charset.forName("ISO-8859-1"); public static final Charset UTF_8 = Charset.forName("UTF-8"); + private static final Unsafe unsafe = NativeBytes.UNSAFE; + private static final Method invokeCleaner; + + static { + Method tmpCleaner; + try { + tmpCleaner = unsafe.getClass().getDeclaredMethod("invokeCleaner", ByteBuffer.class); + tmpCleaner.setAccessible(true); + } catch (Throwable t) { + tmpCleaner = null; + } + invokeCleaner = tmpCleaner; + } public static void close(@Nullable Closeable closeable) { if (closeable == null) return; @@ -82,9 +97,13 @@ public enum IOTools { public static void clean(ByteBuffer bb) { if (bb instanceof DirectBuffer) { - Cleaner cl = ((DirectBuffer) bb).cleaner(); - if (cl != null) - cl.clean(); + if (invokeCleaner != null) { + try { + invokeCleaner.invoke(unsafe, bb); + } catch (Throwable e) { + + } + } } } } diff --git a/lang/src/main/java/net/openhft/lang/io/NativeBytes.java b/lang/src/main/java/net/openhft/lang/io/NativeBytes.java index 96aba3a..67923f3 100755 --- a/lang/src/main/java/net/openhft/lang/io/NativeBytes.java +++ b/lang/src/main/java/net/openhft/lang/io/NativeBytes.java @@ -21,6 +21,10 @@ import net.openhft.lang.io.serialization.ObjectSerializer; import org.jetbrains.annotations.NotNull; import sun.misc.Unsafe; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + import java.io.EOFException; import java.io.IOException; import java.lang.reflect.Field; @@ -41,6 +45,7 @@ public class NativeBytes extends AbstractBytes { @NotNull @SuppressWarnings("ALL") public static final Unsafe UNSAFE; + public static final MethodHandle defineClassMethodHandle; protected static final long NO_PAGE; static final int BYTES_OFFSET; static final int CHARS_OFFSET; @@ -57,6 +62,14 @@ public class NativeBytes extends AbstractBytes { throw new AssertionError(e); } NO_PAGE = UNSAFE.allocateMemory(UNSAFE.pageSize()); + try { + MethodHandles.Lookup baseLookup = MethodHandles.lookup(); + MethodType defineClassMethodType = MethodType.methodType(Class.class, new Class[]{String.class, byte[].class, int.class, int.class}); + MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(ClassLoader.class, baseLookup); + defineClassMethodHandle = lookup.findVirtual(ClassLoader.class, "defineClass", defineClassMethodType); + } catch (Throwable e) { + throw new RuntimeException(e); + } } protected long startAddr; diff --git a/lang/src/main/java/net/openhft/lang/io/VanillaMappedBytes.java b/lang/src/main/java/net/openhft/lang/io/VanillaMappedBytes.java index 6f8191f..812a16d 100644 --- a/lang/src/main/java/net/openhft/lang/io/VanillaMappedBytes.java +++ b/lang/src/main/java/net/openhft/lang/io/VanillaMappedBytes.java @@ -15,7 +15,6 @@ */ package net.openhft.lang.io; -import sun.misc.Cleaner; import sun.nio.ch.DirectBuffer; import java.io.File; @@ -23,6 +22,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; +import java.lang.reflect.Method; public class VanillaMappedBytes extends NativeBytes { private final File path; @@ -31,6 +31,18 @@ public class VanillaMappedBytes extends NativeBytes { private final FileLifecycleListener fileLifecycleListener; private final long index; private boolean unmapped; + private static final Method invokeCleaner; + + static { + Method tmpCleaner; + try { + tmpCleaner = UNSAFE.getClass().getDeclaredMethod("invokeCleaner", ByteBuffer.class); + tmpCleaner.setAccessible(true); + } catch (Throwable t) { + tmpCleaner = null; + } + invokeCleaner = tmpCleaner; + } public VanillaMappedBytes(final File path, final MappedByteBuffer buffer) { this(path, buffer, -1, null, FileLifecycleListener.FileLifecycleListeners.IGNORE); @@ -92,10 +104,13 @@ public class VanillaMappedBytes extends NativeBytes { @Override protected synchronized void cleanup() { if(!this.unmapped) { - Cleaner cl = ((DirectBuffer)this.buffer).cleaner(); - if (cl != null) { + if (invokeCleaner != null) { long start = System.nanoTime(); - cl.clean(); + try { + invokeCleaner.invoke(UNSAFE, this.buffer); + } catch (Throwable e) { + + } fileLifecycleListener.onEvent( FileLifecycleListener.EventType.UNMAP, -- cgit v1.2.3