Hi All,

Like all simple issues this one has ballooned slightly... I've prepared a patch 
and jtreg test for this bug, but have some questions, some process related and 
some technical.

The patch for the actual bug itself is against the hotspot sources.  Does this 
mean that these changes must be pushed through the hotspot-comp forest first 
and then make it in to jdk7u-dev (and jdk8) in the next hotspot bulk 
integration?  If so I imagine I should submit this patch independently through 
the hotspot-dev mailing list?

The patch to increase test coverage to cover this issue is against the jdk 
sources, however the issue here is more complicated.  While modifying the 
LimitDirectMemory.sh jtreg test to cover this issue I've run in to some 
problems with the test - the code that is intended to test the parsing of 
'illegal' values was broken.  I've 'fixed' this code in the patch to 
approximate the current behavior of the tip of the jdk7u-dev forest, but the 
test doesn't currently pass with these modifications (it fails for 
-XX:MaxDirectMemorySize=-1).  It's not clear to me to what extent the details 
of the behavior for these illegal values is important: is the text of the 
message important, is the current behavior with -1 a problem?  I'm also not 
sure whether these test changes should be part of a separate commit under a 
different bug-id?

As a further question (I seem to be full of questions today - sorry!) should 
the jdk changes go through the jdk8 forest first before being merged in to 
jdk7u-dev or are we okay to go in the other direction?

Thanks,

Chris

P.S. This bug-id is not yet public so the bug synopsis in the subject may be 
incorrect.

========================================

# HG changeset patch
# User Chris Dennis <cden...@terracottatech.com>
# Date 1338815867 14400
# Node ID d5791a95b56c237de6baefd826bb6cbce01354eb
# Parent  f08a3a0e60c32cb0e8350e72fdc54849759096a4
7172708 : provide correct PRI?PTR definitions for 64-bit windows

diff --git a/src/share/vm/utilities/globalDefinitions_visCPP.hpp 
b/src/share/vm/utilities/globalDefinitions_visCPP.hpp
--- a/src/share/vm/utilities/globalDefinitions_visCPP.hpp
+++ b/src/share/vm/utilities/globalDefinitions_visCPP.hpp
@@ -220,9 +220,15 @@
 #define PRIu64       "I64u"
 #define PRIx64       "I64x"
 
+#ifdef _LP64
+#define PRIdPTR       "I64d"
+#define PRIuPTR       "I64u"
+#define PRIxPTR       "I64x"
+#else
 #define PRIdPTR       "d"
 #define PRIuPTR       "u"
 #define PRIxPTR       "x"
+#endif
 
 #define offset_of(klass,field) offsetof(klass,field)
 
# HG changeset patch
# User Chris Dennis <cden...@terracottatech.com>
# Date 1338816442 14400
# Node ID b5f3b100e8597fa2d217b98dbfc9992080498ccd
# Parent  3335ab17d9264bb60aac68e789cf6cf95aedeceb
7172708: Add test coverage to ensure large MaxDirectMemorySize values are 
parsed correctly.
XXXXXXX: Fix LimitDirectMemory.sh test to properly test illegal 
MaxDirectMemorySize values.

diff --git a/test/java/nio/Buffer/LimitDirectMemory.java 
b/test/java/nio/Buffer/LimitDirectMemory.java
--- a/test/java/nio/Buffer/LimitDirectMemory.java
+++ b/test/java/nio/Buffer/LimitDirectMemory.java
@@ -28,16 +28,25 @@
     private static int K = 1024;
 
     public static void main(String [] args) throws Exception {
-        if (args.length < 2)
+        if (args.length < 3)
             throw new RuntimeException();
-        boolean throwp = parseThrow(args[0]);
-        int size = parseSize(args[1]);
-        int incr = (args.length > 2 ? parseSize(args[2]) : size);
+        long cmdmax = parseSize(args[0]);
+        boolean throwp = parseThrow(args[1]);
+        int size = (int)parseSize(args[2]);
+        int incr = (args.length > 3 ? (int)parseSize(args[3]) : size);
 
         Properties p = System.getProperties();
         if (p.getProperty("sun.nio.MaxDirectMemorySize") != null)
             throw new RuntimeException("sun.nio.MaxDirectMemorySize defined");
 
+        if (p.getProperty("sun.arch.data.model").equals("32"))
+            cmdmax = cmdmax & 0xffffffffL;
+
+        long max = sun.misc.VM.maxDirectMemory();
+        if (max != cmdmax)
+            throw new RuntimeException("MaxDirectMemorySize does not match 
jvm="
+                                       + max + " cmd=" + cmdmax);
+
         ByteBuffer [] b = new ByteBuffer[K];
 
         // Fill up most/all of the direct memory
@@ -68,22 +77,22 @@
         throw new RuntimeException("Unrecognized expectation: " + s);
     }
 
-    private static int parseSize(String size) throws Exception {
+    private static long parseSize(String size) throws Exception {
 
         if (size.equals("DEFAULT"))
-            return (int)Runtime.getRuntime().maxMemory();
+            return Runtime.getRuntime().maxMemory();
         if (size.equals("DEFAULT+1"))
-            return (int)Runtime.getRuntime().maxMemory() + 1;
+            return Runtime.getRuntime().maxMemory() + 1;
         if (size.equals("DEFAULT+1M"))
-            return (int)Runtime.getRuntime().maxMemory() + (1 << 20);
+            return Runtime.getRuntime().maxMemory() + (1 << 20);
         if (size.equals("DEFAULT-1"))
-            return (int)Runtime.getRuntime().maxMemory() - 1;
+            return Runtime.getRuntime().maxMemory() - 1;
         if (size.equals("DEFAULT/2"))
-            return (int)Runtime.getRuntime().maxMemory() / 2;
+            return Runtime.getRuntime().maxMemory() / 2;
 
         int idx = 0, len = size.length();
 
-        int result = 1;
+        long result = 1;
         for (int i = 0; i < len; i++) {
             if (Character.isDigit(size.charAt(i))) idx++;
             else break;
@@ -92,7 +101,7 @@
         if (idx == 0)
             throw new RuntimeException("No digits detected: " + size);
 
-        result = Integer.parseInt(size.substring(0, idx));
+        result = Long.parseLong(size.substring(0, idx));
 
         if (idx < len) {
             for (int i = idx; i < len; i++) {
diff --git a/test/java/nio/Buffer/LimitDirectMemory.sh 
b/test/java/nio/Buffer/LimitDirectMemory.sh
--- a/test/java/nio/Buffer/LimitDirectMemory.sh
+++ b/test/java/nio/Buffer/LimitDirectMemory.sh
@@ -47,10 +47,10 @@
   echo "Testing: -XX:MaxDirectMemorySize=$* -cp ${TESTCLASSES} \
      LimitDirectMemory true DEFAULT DEFAULT+1M"
   ${TESTJAVA}/bin/java -XX:MaxDirectMemorySize=$* -cp ${TESTCLASSES} \
-     LimitDirectMemory true DEFAULT DEFAULT+1M > ${TMP1} 2>&1
+     LimitDirectMemory DEFAULT true DEFAULT DEFAULT+1M > ${TMP1} 2>&1
   cat ${TMP1}
-  cat ${TMP1} | grep -s "Unrecognized VM option: \'MaxDirectMemorySize="
-  if [ $? -ne 0 ]
+  cat ${TMP1} | grep -q "Could not create the Java Virtual Machine"
+  if [ $? -eq 0 ]
     then echo "--- failed as expected"
   else
     echo "--- failed"
@@ -58,29 +58,32 @@
   fi
 }
 
-# $java LimitDirectMemory throwp fill_direct_memory size_per_buffer
+# $java LimitDirectMemory max_direct_memory throwp fill_direct_memory 
size_per_buffer
 
 # Memory is properly limited using multiple buffers.
-runTest -XX:MaxDirectMemorySize=10 -cp ${TESTCLASSES} LimitDirectMemory true 
10 1
-runTest -XX:MaxDirectMemorySize=1k -cp ${TESTCLASSES} LimitDirectMemory true 
1k 100
-runTest -XX:MaxDirectMemorySize=10m -cp ${TESTCLASSES} LimitDirectMemory true 
10m 10m
+runTest -XX:MaxDirectMemorySize=10 -cp ${TESTCLASSES} LimitDirectMemory 10 
true 10 1
+runTest -XX:MaxDirectMemorySize=1k -cp ${TESTCLASSES} LimitDirectMemory 1k 
true 1k 100
+runTest -XX:MaxDirectMemorySize=10m -cp ${TESTCLASSES} LimitDirectMemory 10m 
true 10m 10m
 
 # We can increase the amount of available memory.
 runTest -XX:MaxDirectMemorySize=65M -cp ${TESTCLASSES} \
-  LimitDirectMemory false 64M 65M
+  LimitDirectMemory 65M false 64M 65M
 
 # Exactly the default amount of memory is available.
-runTest -cp ${TESTCLASSES} LimitDirectMemory false 10 1
-runTest -Xmx64m -cp ${TESTCLASSES} LimitDirectMemory false 0 DEFAULT
-runTest -Xmx64m -cp ${TESTCLASSES} LimitDirectMemory true 0 DEFAULT+1
+runTest -cp ${TESTCLASSES} LimitDirectMemory DEFAULT false 10 1
+runTest -Xmx64m -cp ${TESTCLASSES} LimitDirectMemory DEFAULT false 0 DEFAULT
+runTest -Xmx64m -cp ${TESTCLASSES} LimitDirectMemory DEFAULT true 0 DEFAULT+1
 
 # We should be able to eliminate direct memory allocation entirely.
-runTest -XX:MaxDirectMemorySize=0 -cp ${TESTCLASSES} LimitDirectMemory true 0 1
+runTest -XX:MaxDirectMemorySize=0 -cp ${TESTCLASSES} LimitDirectMemory 0 true 
0 1
 
 # Setting the system property should not work so we should be able to allocate
 # the default amount.
 runTest -Dsun.nio.MaxDirectMemorySize=1K -Xmx64m -cp ${TESTCLASSES} \
-  LimitDirectMemory false DEFAULT-1 DEFAULT/2
+  LimitDirectMemory DEFAULT false DEFAULT-1 DEFAULT/2
+
+# On 64-bit JVMs we should be able to specify long sizes
+runTest -XX:MaxDirectMemorySize=5g -cp ${TESTCLASSES} LimitDirectMemory 5g 
false 0 1
 
 # Various bad values fail to launch the VM.
 launchFail foo

Reply via email to