hg: jdk7/tl/jdk: 6880672: Replace quicksort in java.util.Arrays with dual-pivot implementation
Jonathan Gibbons
Jonathan.Gibbons at Sun.COM
Fri Oct 30 00:21:30 UTC 2009
Alan,
Can I suggest you do a full build of JDK on JPRT with
SKIP_BUILD_CYCLE=false to test this fix?
-- Jon
Joshua Bloch wrote:
> My review of this patch: looks good to me.
>
> Josh
>
> On Thu, Oct 29, 2009 at 4:02 PM, Alan Bateman <Alan.Bateman at sun.com
> <mailto:Alan.Bateman at sun.com>> wrote:
>
> Jonathan Gibbons wrote:
>
> :
> Alan,
>
> My hudson falls over with a stack overflow at
> DualPivotQuicksort.java:477 when doing a full build
> (SKIP_BOOT_CYCLE=false)
>
> at
> java.util.DualPivotQuicksort.dualPivotQuicksort(DualPivotQuicksort.java:477)
>
> at
> java.util.DualPivotQuicksort.dualPivotQuicksort(DualPivotQuicksort.java:477)
>
> at
> java.util.DualPivotQuicksort.dualPivotQuicksort(DualPivotQuicksort.java:477)
>
> at
> java.util.DualPivotQuicksort.dualPivotQuicksort(DualPivotQuicksort.java:477)
>
> at
> java.util.DualPivotQuicksort.dualPivotQuicksort(DualPivotQuicksort.java:477)
>
> at
> java.util.DualPivotQuicksort.dualPivotQuicksort(DualPivotQuicksort.java:477)
>
> at
> java.util.DualPivotQuicksort.dualPivotQuicksort(DualPivotQuicksort.java:477)
>
> gnumake[4]: ***
> [/x/hudson/jobs/jdk7.tl.langtools-jdk/workspace/tl/build/solaris-sparc/classes/sun/text/resources/CharacterBreakIteratorData]
> Error 1
> gnumake[4]: Leaving directory
> `/x/hudson/jobs/jdk7.tl.langtools-jdk/workspace/tl/jdk/make/java/text'
> gnumake[3]: *** [all] Error 1
> gnumake[3]: Leaving directory
> `/x/hudson/jobs/jdk7.tl.langtools-jdk/workspace/tl/jdk/make/java'
> gnumake[2]: *** [all] Error 1
> gnumake[2]: Leaving directory
> `/x/hudson/jobs/jdk7.tl.langtools-jdk/workspace/tl/jdk/make'
> gnumake[1]: *** [jdk-build] Error 2
> gnumake[1]: Leaving directory
> `/x/hudson/jobs/jdk7.tl.langtools-jdk/workspace/tl'
> gnumake: *** [build_product_image] Error 2
> Sending e-mails to: jonathan.gibbons at sun.com
> <mailto:jonathan.gibbons at sun.com>
> finished: FAILURE
>
>
> Full log for Sun folk at:
>
> http://javac.sfbay:8080/hudson/job/jdk7.tl.langtools-jdk/80/console
>
> -- Jon
>
> Sorry about that - Vladimir also found this today and I've just
> created 6896573 to track it. The fix is attached so we'll get that
> in before TL integrates. The lesson here is that we should have
> included new tests with this (Vladimir has been developing tests
> to integrate - we just need to dial them down so that they run in
> a reasonable time).
>
> -Alan.
>
>
> diff -r b05abb410c52
> src/share/classes/java/util/DualPivotQuicksort.java
> --- a/src/share/classes/java/util/DualPivotQuicksort.java
> Thu Oct 29 11:18:37 2009 +0000
> +++ b/src/share/classes/java/util/DualPivotQuicksort.java
> Thu Oct 29 22:49:11 2009 +0000
> @@ -36,7 +36,7 @@ package java.util;
> * @author Jon Bentley
> * @author Josh Bloch
> *
> - * @version 2009.10.22 m765.827.v4
> + * @version 2009.10.29 m765.827.v5
> */
> final class DualPivotQuicksort {
>
> @@ -473,9 +473,10 @@ final class DualPivotQuicksort {
> a[great--] = pivot2;
> }
> }
> - } else { // Use Dual-Pivot Quicksort on large arrays
> - dualPivotQuicksort(a, left, right);
> - }
> + }
> +
> + // Sort center part recursively, excluding known pivot values
> + sort(a, less, great);
> }
>
> /** The number of distinct short values */
> @@ -507,7 +508,7 @@ final class DualPivotQuicksort {
> for (int i = left; i <= right; i++) {
> count[a[i] - Short.MIN_VALUE]++;
> }
> - for (int i = 0, k = left; i < count.length && k <
> right; i++) {
> + for (int i = 0, k = left; i < count.length && k <=
> right; i++) {
> short value = (short) (i + Short.MIN_VALUE);
>
> for (int s = count[i]; s > 0; s--) {
> @@ -723,13 +724,13 @@ final class DualPivotQuicksort {
> a[j + 1] = ak;
> }
> } else if (right - left + 1 >
> COUNTING_SORT_THRESHOLD_FOR_BYTE) {
> - // Use counting sort on large arrays
> + // Use counting sort on huge arrays
> int[] count = new int[NUM_BYTE_VALUES];
>
> for (int i = left; i <= right; i++) {
> count[a[i] - Byte.MIN_VALUE]++;
> }
> - for (int i = 0, k = left; i < count.length && k <
> right; i++) {
> + for (int i = 0, k = left; i < count.length && k <=
> right; i++) {
> byte value = (byte) (i + Byte.MIN_VALUE);
>
> for (int s = count[i]; s > 0; s--) {
> @@ -951,7 +952,7 @@ final class DualPivotQuicksort {
> for (int i = left; i <= right; i++) {
> count[a[i]]++;
> }
> - for (int i = 0, k = left; i < count.length && k <
> right; i++) {
> + for (int i = 0, k = left; i < count.length && k <=
> right; i++) {
> for (int s = count[i]; s > 0; s--) {
> a[k++] = (char) i;
> }
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/core-libs-dev/attachments/20091029/d6ca5a5e/attachment.html>
More information about the core-libs-dev
mailing list