David,

My feeling on this is that the Hotspot changes should go through 
hotspot-runtime-dev, and that since they represent a fix to a recent regression 
(in 1.7.0_04) they should probably go now without waiting for the test changes 
in the jdk project.  I'll start a new thread on hotspot-runtime-dev offering 
this patch as a fix for 7172708.

Chris 

On Jun 4, 2012, at 7:54 PM, David Holmes wrote:

> Hi Chris,
> 
> Hotspot changes need to go via the hotspot-dev list (or hotspot-runtime-dev) 
> to get pushed into hs24 (for JDK8) and then separately backported to hs23.2 
> (for bulk integration into 7u).
> 
> David
> 
> On 4/06/2012 11:38 PM, Chris Dennis wrote:
>> 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