From e7599de5e4ee14ca05a1ba8bffaa5bfb0cdfab50 Mon Sep 17 00:00:00 2001
From: Matthew Swift <matthew.swift@forgerock.com>
Date: Mon, 07 Mar 2016 09:33:19 +0000
Subject: [PATCH] OPENDJ-2743 Delay run-time linking of Unsafe until we are sure that it is available
---
opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java | 14 ++++++++++----
1 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java
index a4f69ca..3ec6a21 100644
--- a/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java
+++ b/opendj-server-legacy/src/main/java/org/opends/server/backends/pluggable/OnDiskMergeImporter.java
@@ -28,6 +28,7 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
+import java.lang.reflect.Field;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
@@ -2718,19 +2719,24 @@
*/
static final class BufferPool implements Closeable
{
+ private static final Object UNSAFE_OBJECT;
static final boolean SUPPORTS_OFF_HEAP;
static
{
- boolean isUnsafeSupported = false;
+ Object unsafeObject = null;
try
{
- isUnsafeSupported = Class.forName("sun.misc.Unsafe") != null;
+ final Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
+ final Field theUnsafeField = unsafeClass.getDeclaredField("theUnsafe");
+ theUnsafeField.setAccessible(true);
+ unsafeObject = theUnsafeField.get(null);
}
catch (Throwable e)
{
// Unsupported.
}
- SUPPORTS_OFF_HEAP = isUnsafeSupported;
+ UNSAFE_OBJECT = unsafeObject;
+ SUPPORTS_OFF_HEAP = UNSAFE_OBJECT != null;
}
private final BlockingQueue<Buffer> pool;
@@ -2796,7 +2802,7 @@
/** Off-heap buffer using Unsafe memory access. */
static final class OffHeapBuffer implements Buffer
{
- private static final Unsafe UNSAFE = Unsafe.getUnsafe();
+ private static final Unsafe UNSAFE = (Unsafe) UNSAFE_OBJECT;
private static final long BYTE_ARRAY_OFFSET = UNSAFE.arrayBaseOffset(byte[].class);
private final long address;
--
Gitblit v1.10.0