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