You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@datasketches.apache.org by le...@apache.org on 2019/06/17 19:51:31 UTC

[incubator-datasketches-memory] branch Remove_JDK7 created (now b806cda)

This is an automated email from the ASF dual-hosted git repository.

leerho pushed a change to branch Remove_JDK7
in repository https://gitbox.apache.org/repos/asf/incubator-datasketches-memory.git.


      at b806cda  Remove support for JDK 1.7.

This branch includes the following new commits:

     new b806cda  Remove support for JDK 1.7.

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org


[incubator-datasketches-memory] 01/01: Remove support for JDK 1.7.

Posted by le...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

leerho pushed a commit to branch Remove_JDK7
in repository https://gitbox.apache.org/repos/asf/incubator-datasketches-memory.git

commit b806cda8cf9bdcc26ee09a868f3e61903baaa9a1
Author: Lee Rhodes <le...@users.noreply.github.com>
AuthorDate: Mon Jun 17 12:51:11 2019 -0700

    Remove support for JDK 1.7.
    
    Also, no implied support for JDK 9 and above.
---
 .../memory/AllocateDirectWritableMap.java          |  2 +-
 .../org/apache/datasketches/memory/NioBits.java    |  4 +-
 .../memory/NonNativeWritableMemoryImpl.java        |  7 +---
 .../org/apache/datasketches/memory/UnsafeUtil.java | 49 ++++++++++------------
 .../datasketches/memory/WritableMemoryImpl.java    | 12 +-----
 .../apache/datasketches/memory/UnsafeUtilTest.java | 26 +++++++++---
 6 files changed, 47 insertions(+), 53 deletions(-)

diff --git a/src/main/java/org/apache/datasketches/memory/AllocateDirectWritableMap.java b/src/main/java/org/apache/datasketches/memory/AllocateDirectWritableMap.java
index a0d2646..d0b1046 100644
--- a/src/main/java/org/apache/datasketches/memory/AllocateDirectWritableMap.java
+++ b/src/main/java/org/apache/datasketches/memory/AllocateDirectWritableMap.java
@@ -51,7 +51,7 @@ final class AllocateDirectWritableMap extends AllocateDirectMap implements Writa
               capacityBytes);
     } catch (final Exception e) {
       throw new RuntimeException(String.format("Encountered %s exception in force. "
-          + UnsafeUtil.tryIllegalAccessPermit, e.getClass()));
+          + e.getClass()));
     }
   }
 }
diff --git a/src/main/java/org/apache/datasketches/memory/NioBits.java b/src/main/java/org/apache/datasketches/memory/NioBits.java
index e8377fd..ac853e1 100644
--- a/src/main/java/org/apache/datasketches/memory/NioBits.java
+++ b/src/main/java/org/apache/datasketches/memory/NioBits.java
@@ -49,7 +49,6 @@ final class NioBits {
 
   static {
     try {
-      //TODO-JDK9 VM_CLASS = Class.forName("jdk.internal.misc.VM");
       VM_CLASS = Class.forName("sun.misc.VM");
       VM_MAX_DIRECT_MEMORY_METHOD =
           VM_CLASS.getDeclaredMethod("maxDirectMemory");
@@ -86,8 +85,7 @@ final class NioBits {
       nioBitsTotalCapacity = (AtomicLong) (totalCapacityField.get(null));
 
     } catch (final Exception e) {
-      throw new RuntimeException("Could not acquire java.nio.Bits class: " + e.getClass()
-      + UnsafeUtil.tryIllegalAccessPermit);
+      throw new RuntimeException("Could not acquire java.nio.Bits class: " + e.getClass());
     }
   }
 
diff --git a/src/main/java/org/apache/datasketches/memory/NonNativeWritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/NonNativeWritableMemoryImpl.java
index ad4430b..0de2304 100644
--- a/src/main/java/org/apache/datasketches/memory/NonNativeWritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/NonNativeWritableMemoryImpl.java
@@ -255,12 +255,7 @@ abstract class NonNativeWritableMemoryImpl extends BaseWritableMemoryImpl {
     assertValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE);
     final long addr = getCumulativeOffset(offsetBytes);
     final long newValueReverseBytes = Long.reverseBytes(newValue);
-    if (UnsafeUtil.JDK8_OR_ABOVE) {
-      return Long.reverseBytes(unsafe.getAndSetLong(getUnsafeObject(), addr, newValueReverseBytes));
-    } else {
-      return Long.reverseBytes(
-          JDK7Compatible.getAndSetLong(getUnsafeObject(), addr, newValueReverseBytes));
-    }
+    return Long.reverseBytes(unsafe.getAndSetLong(getUnsafeObject(), addr, newValueReverseBytes));
   }
 
   @Override
diff --git a/src/main/java/org/apache/datasketches/memory/UnsafeUtil.java b/src/main/java/org/apache/datasketches/memory/UnsafeUtil.java
index 5fc1a31..04e521c 100644
--- a/src/main/java/org/apache/datasketches/memory/UnsafeUtil.java
+++ b/src/main/java/org/apache/datasketches/memory/UnsafeUtil.java
@@ -33,21 +33,17 @@ import sun.misc.Unsafe;
  * jdk8 and it must be done with both source and target versions of jdk7 specified in pom.xml.
  * The resultant jar will work on jdk7 and jdk8.</p>
  *
- * <p>This may work with jdk9 but might require the JVM arg <i>-permit-illegal-access</i>,
- * <i>–illegal-access=permit</i> or equivalent. Proper operation with jdk9 or above is not
- * guaranteed and has not been tested.
- *
  * @author Lee Rhodes
  */
 public final class UnsafeUtil {
   public static final Unsafe unsafe;
-  public static final String JDK;
-  static final boolean JDK8_OR_ABOVE;
+  public static final String JDK; //must be at least "1.8"
+  public static final int JDK_MAJOR; //8, 9, 10, 11, 12, etc
 
   //not an indicator of whether compressed references are used.
   public static final int ADDRESS_SIZE;
 
-  //For 64-bit JVMs: varies depending on coop: 16 for JVM <= 32GB; 24 for JVM > 32GB
+  //For 64-bit JVMs: these offsets vary depending on coop: 16 for JVM <= 32GB; 24 for JVM > 32GB.
   // Making this constant long-typed, rather than int, to exclude possibility of accidental overflow
   // in expressions like arrayLength * ARRAY_BYTE_BASE_OFFSET, where arrayLength is int-typed.
   // The same consideration for constants below: ARRAY_*_INDEX_SCALE, ARRAY_*_INDEX_SHIFT.
@@ -91,10 +87,6 @@ public final class UnsafeUtil {
 
   //@formatter:on
 
-  static String tryIllegalAccessPermit =
-      " If using JDK 9+ try setting JVM arg -permit-illegal-access, "
-      + "–illegal-access=permit or equivalent.";
-
   static {
     try {
       final Constructor<Unsafe> unsafeConstructor = Unsafe.class.getDeclaredConstructor();
@@ -109,7 +101,7 @@ public final class UnsafeUtil {
     } catch (final InstantiationException | IllegalAccessException | IllegalArgumentException
         | InvocationTargetException | NoSuchMethodException e) {
       e.printStackTrace();
-      throw new RuntimeException("Unable to acquire Unsafe. " + tryIllegalAccessPermit, e);
+      throw new RuntimeException("Unable to acquire Unsafe. " + e);
     }
 
     //4 on 32-bit systems. 4 on 64-bit systems < 32GB, otherwise 8.
@@ -132,32 +124,35 @@ public final class UnsafeUtil {
     final String jdkVer = System.getProperty("java.version");
     final int[] p = parseJavaVersion(jdkVer);
     JDK = p[0] + "." + p[1];
-    JDK8_OR_ABOVE = checkJavaVersion(JDK, p[0], p[1]);
+    JDK_MAJOR = (p[0] == 1) ? p[1] : p[0];
   }
 
   private UnsafeUtil() {}
 
+  /**
+   * Returns first two number groups of the java version string.
+   * @param jdkVer the java version string from System.getProperty("java.version").
+   * @return first two number groups of the java version string.
+   */
   static int[] parseJavaVersion(final String jdkVer) {
+    final int p0, p1;
     try {
-      String[] parts = jdkVer.trim().split("[^0-9\\.]");
-      if (parts.length == 0) {
-        throw new ExceptionInInitializerError("Improper Java -version string: " + jdkVer);
-      }
-      parts = parts[0].split("\\.");
-      final int p0 = Integer.parseInt(parts[0]);
-      final int p1 = (parts.length > 1) ? Integer.parseInt(parts[1]) : 0;
-      return new int[] {p0, p1};
+      String[] parts = jdkVer.trim().split("[^0-9\\.]");//grab only number groups and "."
+      parts = parts[0].split("\\."); //split out the number groups
+      p0 = Integer.parseInt(parts[0]); //the first number group
+      p1 = (parts.length > 1) ? Integer.parseInt(parts[1]) : 0; //2nd number group, or 0
     } catch (final Exception e) {
-      throw new ExceptionInInitializerError("Improper Java -version string: "
-          + jdkVer + "\n" + e);
+      throw new ExceptionInInitializerError("Improper Java -version string: " + jdkVer + "\n" + e);
     }
+    checkJavaVersion(jdkVer, p0, p1);
+    return new int[] {p0, p1};
   }
 
-  static boolean checkJavaVersion(final String jdk, final int p0, final int p1) {
-    if ( (p0 < 1) || ((p0 == 1) && (p1 < 7)) ) {
-      throw new ExceptionInInitializerError("JDK Major Version must be >= 1.7: " + jdk);
+  static void checkJavaVersion(final String jdkVer, final int p0, final int p1) {
+    if ( (p0 < 1) || ((p0 == 1) && (p1 < 8)) || (p0 >= 9)  ) {
+      throw new ExceptionInInitializerError(
+          "Unsupported JDK Major Version, must be 1.8: " + jdkVer);
     }
-    return  !( (p0 == 1) && (p1 == 7) );
   }
 
   static long getFieldOffset(final Class<?> c, final String fieldName) {
diff --git a/src/main/java/org/apache/datasketches/memory/WritableMemoryImpl.java b/src/main/java/org/apache/datasketches/memory/WritableMemoryImpl.java
index ec0442a..9a5f812 100644
--- a/src/main/java/org/apache/datasketches/memory/WritableMemoryImpl.java
+++ b/src/main/java/org/apache/datasketches/memory/WritableMemoryImpl.java
@@ -308,22 +308,14 @@ abstract class WritableMemoryImpl extends BaseWritableMemoryImpl {
   public long getAndAddLong(final long offsetBytes, final long delta) { //JDK 8+
     assertValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE);
     final long addr = getCumulativeOffset(offsetBytes);
-    if (UnsafeUtil.JDK8_OR_ABOVE) {
-      return unsafe.getAndAddLong(getUnsafeObject(), addr, delta);
-    } else {
-      return JDK7Compatible.getAndAddLong(getUnsafeObject(), addr, delta);
-    }
+    return unsafe.getAndAddLong(getUnsafeObject(), addr, delta);
   }
 
   @Override
   public long getAndSetLong(final long offsetBytes, final long newValue) { //JDK 8+
     assertValidAndBoundsForWrite(offsetBytes, ARRAY_LONG_INDEX_SCALE);
     final long addr = getCumulativeOffset(offsetBytes);
-    if (UnsafeUtil.JDK8_OR_ABOVE) {
-      return unsafe.getAndSetLong(getUnsafeObject(), addr, newValue);
-    } else {
-      return JDK7Compatible.getAndSetLong(getUnsafeObject(), addr, newValue);
-    }
+    return unsafe.getAndSetLong(getUnsafeObject(), addr, newValue);
   }
 
   @Override
diff --git a/src/test/java/org/apache/datasketches/memory/UnsafeUtilTest.java b/src/test/java/org/apache/datasketches/memory/UnsafeUtilTest.java
index b7c18c9..2afa8e3 100644
--- a/src/test/java/org/apache/datasketches/memory/UnsafeUtilTest.java
+++ b/src/test/java/org/apache/datasketches/memory/UnsafeUtilTest.java
@@ -20,7 +20,6 @@
 package org.apache.datasketches.memory;
 
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
@@ -54,16 +53,31 @@ public class UnsafeUtilTest {
   public void checkJdkString() {
     String jdkVer;
     int[] p = new int[2];
-    String[] good1_8Strings = {"1.8.0_121", "1.8.0_162", "9.0.4", "10.0.1", "11", "12b", "12_.2"};
+    String[] good1_8Strings = {"1.8.0_121", "1.8.0_162"};
     int len = good1_8Strings.length;
     for (int i = 0; i < len; i++) {
       jdkVer = good1_8Strings[i];
       p = UnsafeUtil.parseJavaVersion(jdkVer);
-      assertTrue(UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]));
+      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]);
+      int jdkMajor = (p[0] == 1) ? p[1] : p[0]; //model the actual JDK_MAJOR
+      if (p[0] == 1) { assertTrue(jdkMajor == p[1]); }
+      if (p[0] > 1 ) { assertTrue(jdkMajor == p[0]); }
+    }
+    try {
+      jdkVer = "9.0.4"; //ver 9 string
+      p = UnsafeUtil.parseJavaVersion(jdkVer);
+      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]);
+    } catch (Error e) {
+      println("" + e);
+    }
+
+    try {
+      jdkVer = "1.7.0_80"; //1.7 string
+      p = UnsafeUtil.parseJavaVersion(jdkVer);
+      UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]);
+    } catch (Error e) {
+      println("" + e);
     }
-    jdkVer = "1.7.0_80"; //1.7 string
-    p = UnsafeUtil.parseJavaVersion(jdkVer);
-    assertFalse(UnsafeUtil.checkJavaVersion(jdkVer, p[0], p[1]));
     try {
       jdkVer = "1.6.0_65"; //valid string but < 1.7
       p = UnsafeUtil.parseJavaVersion(jdkVer);


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@datasketches.apache.org
For additional commands, e-mail: commits-help@datasketches.apache.org