From weijun.wang at sun.com Tue Jun 1 02:53:54 2010 From: weijun.wang at sun.com (weijun.wang at sun.com) Date: Tue, 01 Jun 2010 02:53:54 +0000 Subject: hg: jdk7/tl/jdk: 6950931: test fails on windows sun/security/tools/jarsigner/crl.sh Message-ID: <20100601025426.DB80C46EA9@hg.openjdk.java.net> Changeset: f3189453d134 Author: weijun Date: 2010-06-01 10:52 +0800 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/f3189453d134 6950931: test fails on windows sun/security/tools/jarsigner/crl.sh Reviewed-by: wetmore, xuelei ! test/sun/security/tools/jarsigner/crl.sh From dmytro_sheyko at hotmail.com Tue Jun 1 07:59:07 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Tue, 1 Jun 2010 14:59:07 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4BFD1021.1030404@mail.ru> References: , , <4BF2AAEE.1040706@mail.ru>, <4BF3BFFD.8010007@mail.ru>,<4BF3C05C.7010300@mail.ru> , <4BF69AFB.8060406@mail.ru> , <4BFB716B.4020107@mail.ru> , <4BFD1021.1030404@mail.ru> Message-ID: Hi Vladimir, I cannot write 7-comparison sort briefly as well. However I think we can optimize sorting network a bit. We can consider such properties as 1. size, i.e. number of comparators 2. delay, i.e. number of parallel steps (some comparisons and swaps can be done concurrently) 3. average number of swaps. The current sorting network [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] has size 9 and delay 5. These values are good enough. Generally we cannot write it shorter (in order to improve size) and combine more than 2 comparison in a parallel step (in order to improve delay). However the average number of swaps seems too high. It performs 576 swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) I tried every permutation of 5 distinct values. There is a profile per comparator: (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] The first two comparison offer probability of swap as 50%, which is natural. However the sixth comparator (i.e. [0 3]) swaps with probability 90%, i.e. almost always! The one of the best sorting network (I have found) with the same size and delay is following [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] Its average number of swaps is 376. And here is a profile: (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] Regards, Dmytro Sheyko > Date: Wed, 26 May 2010 16:12:17 +0400 > From: iaroslavski at mail.ru > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > CC: core-libs-dev at openjdk.java.net > > Hello Dmytro, > > Theoretical investigations are based on simple model, > which doesn't take into account many optimizations > like "equal pivots", "scan equal to pivots", etc. > Model based on the implementation will be too complex > to be analyzed. > > But it is easy to count comparisons and assignments, > if I change them by functions with counter. > > Also I tried to write 7-comparison sort, but the code > was too long (a lot of inner if-then-else) instead of > 9 compact lines. Do you have suggestion how to implement > a nice 7-comparison sort? I tried also selection and bubble > sorts, but insertion sort shows better time. > > Josh, > Could you please review the last changes (especially javadoc > and comments)? > > Thank you, > Vladimir > > Dmytro Sheyko wrote: > > Hi Vladimir, > > > > As for me, everything seems good. > > > > Returning to the theoretical background, could you estimate number of > > comparison and assignments? These should be less than in your initial > > version. > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > candidates instead of 9-comparison sorting network? > > > > Thank you, > > Dmytro Sheyko > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > From: iaroslavski at mail.ru > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > To: dmytro_sheyko at hotmail.com > > > CC: core-libs-dev at openjdk.java.net > > > > > > I added more comments, please, review attached version. > > > > > > >> So, we win 2-3% ! > > > > > > On [partial] sorted inputs new version runs more faster than few > > percents: > > > > > > organ pipes > > > this: 6896 > > > prev: 7424 > > > jdk7: 8018 > > > jdk6: 12502 > > > > > > ascendant > > > this: 2877 > > > prev: 3845 > > > jdk7: 4583 > > > jdk6: 9019 > > > > > > descendant > > > this: 3287 > > > prev: 4110 > > > jdk7: 4897 > > > jdk6: 9132 > > > > > > Dmytro Sheyko wrote: > > > > That's great! Thank you. > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > From: iaroslavski at mail.ru > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > To: dmytro_sheyko at hotmail.com > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > Hello, > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > value (if any) or all leading negative" and with my optimization > > > > > for all types. I added two while loops before partitioning to > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > if (pivot1 != pivot2) { > > > > > /* ... */ > > > > > a[e2] = a[less]; > > > > > a[e4] = a[great]; > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > /* ... */ > > > > > outer: > > > > > for (int k = less; k <= great; k++) { > > > > > ... > > > > > } > > > > > > > > > > Here is benchmark result (in compare with quicksort from JDK 6): > > > > > > > > > > client server > > > > > ------ ------ > > > > > previous version: 60.70% 48.20% > > > > > current version: 57.22% 46.18% > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > Thank you, > > > > > Vladimir > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > Hi Vladimir, > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > modification. It > > > > > > appeared that number of negative zeros were changed during general > > > > sort. > > > > > > As I can see you already fixed this issue. Well, my > > modification was > > > > > > based on assumption that we can speed up eliminating explicit array > > > > > > range checks. > > > > > > However, such assumption is wrong because Hotspot anyway emits > > range > > > > > > checks at its discretion and therefore processZeros generally > > does not > > > > > > work as fast as I expected. > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > As for the latest code you posted. Doesn't it make sense to skip > > > > leading > > > > > > negative zeros before farther processing? In this case we avoid > > > > > > unnecessary assigning +0.0 and then -0.0 to the same location a[k] > > > > (i.e. > > > > > > where k == p). > > > > > > > > > > > > /* > > > > > > * Skip the last negative value (if any) or all leading negative > > > > > > zeros > > > > > > */ > > > > > > while (left <= right && Double.doubleToRawLongBits(a[left]) < 0) { > > > > > > left++; > > > > > > } > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > double ak = a[k]; > > > > > > if (ak != 0.0d) { > > > > > > return; > > > > > > } > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > a[k] = 0.0d; > > > > > > a[p++] = -0.0d; > > > > > > } > > > > > > } > > > > > > > > > > > > Thank you, > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > From: iaroslavski at mail.ru > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did little bit > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code became > > > > > > > > consistent with main sort method and more compact. Also I use > > > > > > > > more usual "i--" and "i++" in for loops (instead of "--i", > > "++i. > > > > > > > > > > > > > > > > To accent the difference between float/double and other types, > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > /* > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > */ > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > /* > > > > > > > > ..... > > > > > > > > */ > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > Thank you, > > > > > > > > Vladimir > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > >> Vladimir, > > > > > > > >> > > > > > > > >> I can see that you changed sortNegZeroAndNaN(float[]...) but > > > > probably > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > >> > > > > > > > >> You really puzzled me with failed testcase and note that > > sorting > > > > > > > >> algorithm (without special attention to zeros) generally may > > > > change > > > > > > > >> number of negative zeros. > > > > > > > >> I will provide my comments later. > > > > > > > >> > > > > > > > >> As for counting sort, I think we should use single format > > > > style over > > > > > > > >> the file (unless we have valuable reason not to do this). I > > > > mean to > > > > > > > >> choose > > > > > > > >> 1) > > > > > > > >> if (toIndex - fromIndex > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > >> return; > > > > > > > >> } > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > >> 2) > > > > > > > >> if (toIndex - fromIndex > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > >> } else { > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > >> } > > > > > > > >> I prefer the second one. > > > > > > > >> > > > > > > > >> Thanks a lot, > > > > > > > >> Dmytro Sheyko > > > > > > > >> > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > >> > Subject: Re: New portion of improvements for Dual-Pivot > > > > Quicksort > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > >> > > > > > > > > >> > Hello, > > > > > > > >> > > > > > > > > >> > I've run your modification for counting sort, it real > > faster. > > > > > > > >> > I attached new version with your changes (I did little bit > > > > > > > >> > format it) and included my case with float/double. > > > > > > > >> > > > > > > > > >> > Note that you modification doesn't pass test from > > Sorting class, > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > >> > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = 9, n = > > > > 10, p = 9 > > > > > > > >> > > > > > > > > >> > I suggest shorter method (which is based on your idea to > > skip > > > > > > counting > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > index (or > > > > > > it will > > > > > > > >> > be index of first positive element if no zeros at all, > > or last > > > > > > > >> negative, > > > > > > > >> > if no positive and zero elements) and then swap negative > > > > zero to the > > > > > > > >> > beginning of the sub-range. > > > > > > > >> > > > > > > > > >> > int hi = right; > > > > > > > >> > > > > > > > > >> > while (left < hi) { > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > >> > float middleValue = a[middle]; > > > > > > > >> > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > >> > left = middle + 1; > > > > > > > >> > } else { > > > > > > > >> > hi = middle; > > > > > > > >> > } > > > > > > > >> > } > > > > > > > >> > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > >> > float ak = a[k]; > > > > > > > >> > if (ak != 0.0f) { > > > > > > > >> > return; > > > > > > > >> > } > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > > > > > > >> > a[k] = +0.0f; > > > > > > > >> > a[p++] = -0.0f; > > > > > > > >> > } > > > > > > > >> > } > > > > > > > >> > > > > > > > > >> > Important note: in partitioning loop there are several > > places > > > > > > > >> > (marked by // !) where potential bug with -0.0 could be > > > > > > > >> > (when pivot and a[great] are zeros with different signs): > > > > > > > >> > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > >> > a[k] = a[less]; > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > >> > + a[less++] = a[great]; > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > >> > a[k] = a[great]; > > > > > > > >> > } > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > >> > + a[great--] = ak; > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > >> > a[k] = a[less]; > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > >> > + a[less++] = ak; > > > > > > > >> > } > > > > > > > >> > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > >> > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for all types > > > > > > > >> > and "pivot1 -> a[great]" in float/double sections only. > > > > > > > >> > > > > > > > > >> > Please, review format changes for counting sort and new > > version > > > > > > > >> > of Phase 3 for float/double. > > > > > > > >> > > > > > > > > >> > Thank you, > > > > > > > >> > Vladimir > > > > > > > >> > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > >> > > Hi, > > > > > > > >> > > > > > > > > > >> > > About counting sort again. > > > > > > > >> > > > > > > > > > >> > > 1. This condition "i < count.length && k <= right" is > > > > excessive. > > > > > > > >> Any one > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > >> > > 2. No need to calculate "short value = (short) (i + > > > > > > > >> Short.MIN_VALUE)" > > > > > > > >> > > when "count[i]" is zero. > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > better loop > > > > > > > >> backward. > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit looping > > > > earlier > > > > > > > >> > > assuming that typically we work with positive numbers. > > > > > > > >> > > For unsigned primitives (char) we would better loop > > forward > > > > > > because > > > > > > > >> > > typically we work with characters about zero (ASCII). > > > > > > > >> > > > > > > > > > >> > > - 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--) { > > > > > > > >> > > - a[k++] = value; > > > > > > > >> > > - } > > > > > > > >> > > - } > > > > > > > >> > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = toIndex - 1; k >= > > > > > > > >> > > fromIndex; --i) { > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > >> > > + int s = count[i]; > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > >> > > + } > > > > > > > >> > > > > > > > > > >> > > Thanks, > > > > > > > >> > > Dmytro Sheyko > > > > > > > >> > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > Dual-Pivot > > > > > > > >> Quicksort > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > >> > > > > > > > > > > >> > > > Sounds good! > > > > > > > >> > > > Will consider too... > > > > > > > >> > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? Dmytro Sheyko > > > > > > > >> > > : > > > > > > > >> > > > > > > > > > > >> > > > > Hi, > > > > > > > >> > > > > > > > > > > > >> > > > > Regarding counting sort. We can check whether we > > should > > > > > > > >> switch to > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > >> > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > Dual-Pivot > > > > > > > >> Quicksort > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > >> > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > >> > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run tests again > > > > > > with you > > > > > > > >> > > changes. > > > > > > > >> > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > >> > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > >> > > > > > > Hello, > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > >> Double.doubleToLongBits and > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > Float.floatToIntBits. > > > > > > > >> > > > > > > No need to handle NaN's because they all are > > placed to > > > > > > > >> the end > > > > > > > >> > > of array. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > Long.MIN_VALUE and > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > Integer.MIN_VALUE. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more efficient > > (or at > > > > > > > >> least not > > > > > > > >> > > worse) > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > Float.floatToIntBits(ak)) > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && Float.floatToIntBits(ak) < 0) > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > negative zeros > > > > > > after > > > > > > > >> > > sorting. > > > > > > > >> > > > > > > General sorting algorithm puts both negative and > > > > positive > > > > > > > >> zeros > > > > > > > >> > > together > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > >> > > > > > > Therefore we have to process less elements because > > > > > > > >> usually we > > > > > > > >> > > have less > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; jjb at google.com > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > iaroslavski at mail.ru > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of improvements for > > > > > > Dual-Pivot > > > > > > > >> > > Quicksort > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, review the > > changes. > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 ?????? ?? > > Dmytro > > > > Sheyko > > > > > > > >> > > > > > > : > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero using binary > > > > search) > > > > > > > >> over > > > > > > > >> > > C (Count > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > core-libs-dev at openjdk.java.net; > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > improvements for > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 +0400 > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested variants, and > > > > found that > > > > > > > >> case "C" > > > > > > > >> > > > > > > > > > (very interesting approach to find first > > > > position > > > > > > > >> of zero > > > > > > > >> > > > > > > > > > by counting negative elements) works > > slower than > > > > > > > >> original > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are very close > > > > to each > > > > > > > >> other > > > > > > > >> > > > > > > > > > and little bit faster than original. I > > > > prefer case > > > > > > > >> "F": > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do you agree? > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated DualPivotQuicksort > > file and > > > > > > > >> send it > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 ?????? > > ?? Dmytro > > > > > > > >> Sheyko > > > > > > > >> > > > > > > : > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > comments/proposals > > > > > > > >> regarding > > > > > > > >> > > dealing > > > > > > > >> > > > > > > with negative zeros. > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero we can > > > > avoid range > > > > > > > >> check > > > > > > > >> > > (i >= > > > > > > > >> > > > > > > left) if we have at least one negative value. > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > 09:04:19 2010 > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed May 12 > > > > 12:10:46 > > > > > > > >> 2010 > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > left && > > > > a[i] == > > > > > > > >> > > 0.0f; i--) { > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > + > > > > > > > >> > > > > > > > > > > + // there is at least one negative > > value, so > > > > > > range > > > > > > > >> > > check is > > > > > > > >> > > > > > > not needed > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; /*i >= > > left &&*/ > > > > > > > >> a[i] == > > > > > > > >> > > 0.0f; i--) { > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > >> > > > > > > > > > > + } > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of positive zeros > > > > > > back into > > > > > > > >> > > negative zeros > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of the first > > > > zero by > > > > > > > >> counting > > > > > > > >> > > > > > > negative values during preprocessing phase. > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > 09:04:19 2010 > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed May 12 > > > > 12:01:24 > > > > > > > >> 2010 > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros and move > > > > NaNs to > > > > > > > >> end of > > > > > > > >> > > array. > > > > > > > >> > > > > > > > > > > */ > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > numNegativeValues = 0; > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // i.e., ak is NaN > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > + int zeroIndex = numNegativeValues; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= left && > > > > a[i] == > > > > > > > >> 0.0f; > > > > > > > >> > > i--) { > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to find > > the first > > > > > > > >> zero and > > > > > > > >> > > thus > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > 09:04:19 2010 > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed May 12 > > > > 12:03:58 > > > > > > > >> 2010 > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > - > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > left && > > > > a[i] == > > > > > > > >> > > 0.0f; i--) { > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > >> > > > > > > > > > > - } > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > left, n); > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of positive zeros > > > > > > back into > > > > > > > >> > > negative zeros > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = zeroIndex + > > > > > > > >> > > numNegativeZeros; i < > > > > > > > >> > > > > > > m; i++) { > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > element > > > > in the > > > > > > > >> > > specified > > > > > > > >> > > > > > > range via > > > > > > > >> > > > > > > > > > > + * Returns the index of the first zero > > > > element > > > > > > > >> in the > > > > > > > >> > > > > > > specified range via > > > > > > > >> > > > > > > > > > > * binary search. The range is assumed > > to be > > > > > > > >> sorted, and > > > > > > > >> > > must > > > > > > > >> > > > > > > contain > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > >> > > > > > > > > > > * > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > >> > > > > > > > > > > * @param low the index of the first > > element, > > > > > > > >> inclusive, > > > > > > > >> > > to be > > > > > > > >> > > > > > > searched > > > > > > > >> > > > > > > > > > > * @param high the index of the last > > element, > > > > > > > >> inclusive, > > > > > > > >> > > to be > > > > > > > >> > > > > > > searched > > > > > > > >> > > > > > > > > > > */ > > > > > > > >> > > > > > > > > > > - private static int > > findAnyZero(float[] a, > > > > > > int low, > > > > > > > >> > > int high) { > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > >> > > > > > > > > > > + private static int > > findFirstZero(float[] > > > > a, int > > > > > > > >> low, > > > > > > > >> > > int high) { > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values appeared more > > > > expensive > > > > > > > >> than > > > > > > > >> > > any other > > > > > > > >> > > > > > > variants. > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > efficient > > > > as the > > > > > > > >> current > > > > > > > >> > > > > > > solution is in its worst case - when we have > > only one > > > > > > > >> negative > > > > > > > >> > > zero (in > > > > > > > >> > > > > > > the half of array). > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > have many > > > > > > zeros. > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > dmytro_sheyko at hotmail.com > > > > > > > >> > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > >> iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > improvements for > > > > > > > >> > > Dual-Pivot > > > > > > > >> > > > > > > Quicksort > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 23:51:27 +0400 > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly testing > > "great - > > > > > > > >> less > 5 * > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > >> > > > > > > > > > > > and found that more symmetric code > > "less > > > > < e1 && > > > > > > > >> > > great > e5" > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has not been > > > > changed. > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest version in > > > > attachment. > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > ?????? ?? > > > > Joshua > > > > > > > >> Bloch > > > > > > > >> > > > > > > : > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > e5) { > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * seventh) { > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > >> > > > > > > > > > > > >Josh _________________________________________________________________ Hotmail: Powerful Free email with security by Microsoft. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: From dmytro_sheyko at hotmail.com Tue Jun 1 09:38:56 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Tue, 1 Jun 2010 16:38:56 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: , , , , , <4BF2AAEE.1040706@mail.ru>, , , <4BF3BFFD.8010007@mail.ru>, <4BF3C05C.7010300@mail.ru>, , , <4BF69AFB.8060406@mail.ru>, , , <4BFB716B.4020107@mail.ru>, , , <4BFD1021.1030404@mail.ru>, Message-ID: Corrections. 1. The sixth comparator in current network (that swaps with 90% probability) is [2 3] not [0 3]. 2. The average number of swaps are 576/120 = 4.8 for current network and 376/120 = 3.1(3...) for proposed network. From: dmytro_sheyko at hotmail.com To: iaroslavski at mail.ru; joshua.bloch at google.com Subject: RE: New portion of improvements for Dual-Pivot Quicksort Date: Tue, 1 Jun 2010 14:59:07 +0700 CC: core-libs-dev at openjdk.java.net Hi Vladimir, I cannot write 7-comparison sort briefly as well. However I think we can optimize sorting network a bit. We can consider such properties as 1. size, i.e. number of comparators 2. delay, i.e. number of parallel steps (some comparisons and swaps can be done concurrently) 3. average number of swaps. The current sorting network [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] has size 9 and delay 5. These values are good enough. Generally we cannot write it shorter (in order to improve size) and combine more than 2 comparison in a parallel step (in order to improve delay). However the average number of swaps seems too high. It performs 576 swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) I tried every permutation of 5 distinct values. There is a profile per comparator: (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] The first two comparison offer probability of swap as 50%, which is natural. However the sixth comparator (i.e. [0 3]) swaps with probability 90%, i.e. almost always! The one of the best sorting network (I have found) with the same size and delay is following [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] Its average number of swaps is 376. And here is a profile: (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] Regards, Dmytro Sheyko > Date: Wed, 26 May 2010 16:12:17 +0400 > From: iaroslavski at mail.ru > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > CC: core-libs-dev at openjdk.java.net > > Hello Dmytro, > > Theoretical investigations are based on simple model, > which doesn't take into account many optimizations > like "equal pivots", "scan equal to pivots", etc. > Model based on the implementation will be too complex > to be analyzed. > > But it is easy to count comparisons and assignments, > if I change them by functions with counter. > > Also I tried to write 7-comparison sort, but the code > was too long (a lot of inner if-then-else) instead of > 9 compact lines. Do you have suggestion how to implement > a nice 7-comparison sort? I tried also selection and bubble > sorts, but insertion sort shows better time. > > Josh, > Could you please review the last changes (especially javadoc > and comments)? > > Thank you, > Vladimir > > Dmytro Sheyko wrote: > > Hi Vladimir, > > > > As for me, everything seems good. > > > > Returning to the theoretical background, could you estimate number of > > comparison and assignments? These should be less than in your initial > > version. > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > candidates instead of 9-comparison sorting network? > > > > Thank you, > > Dmytro Sheyko > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > From: iaroslavski at mail.ru > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > To: dmytro_sheyko at hotmail.com > > > CC: core-libs-dev at openjdk.java.net > > > > > > I added more comments, please, review attached version. > > > > > > >> So, we win 2-3% ! > > > > > > On [partial] sorted inputs new version runs more faster than few > > percents: > > > > > > organ pipes > > > this: 6896 > > > prev: 7424 > > > jdk7: 8018 > > > jdk6: 12502 > > > > > > ascendant > > > this: 2877 > > > prev: 3845 > > > jdk7: 4583 > > > jdk6: 9019 > > > > > > descendant > > > this: 3287 > > > prev: 4110 > > > jdk7: 4897 > > > jdk6: 9132 > > > > > > Dmytro Sheyko wrote: > > > > That's great! Thank you. > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > From: iaroslavski at mail.ru > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > To: dmytro_sheyko at hotmail.com > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > Hello, > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > value (if any) or all leading negative" and with my optimization > > > > > for all types. I added two while loops before partitioning to > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > if (pivot1 != pivot2) { > > > > > /* ... */ > > > > > a[e2] = a[less]; > > > > > a[e4] = a[great]; > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > /* ... */ > > > > > outer: > > > > > for (int k = less; k <= great; k++) { > > > > > ... > > > > > } > > > > > > > > > > Here is benchmark result (in compare with quicksort from JDK 6): > > > > > > > > > > client server > > > > > ------ ------ > > > > > previous version: 60.70% 48.20% > > > > > current version: 57.22% 46.18% > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > Thank you, > > > > > Vladimir > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > Hi Vladimir, > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > modification. It > > > > > > appeared that number of negative zeros were changed during general > > > > sort. > > > > > > As I can see you already fixed this issue. Well, my > > modification was > > > > > > based on assumption that we can speed up eliminating explicit array > > > > > > range checks. > > > > > > However, such assumption is wrong because Hotspot anyway emits > > range > > > > > > checks at its discretion and therefore processZeros generally > > does not > > > > > > work as fast as I expected. > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > As for the latest code you posted. Doesn't it make sense to skip > > > > leading > > > > > > negative zeros before farther processing? In this case we avoid > > > > > > unnecessary assigning +0.0 and then -0.0 to the same location a[k] > > > > (i.e. > > > > > > where k == p). > > > > > > > > > > > > /* > > > > > > * Skip the last negative value (if any) or all leading negative > > > > > > zeros > > > > > > */ > > > > > > while (left <= right && Double.doubleToRawLongBits(a[left]) < 0) { > > > > > > left++; > > > > > > } > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > double ak = a[k]; > > > > > > if (ak != 0.0d) { > > > > > > return; > > > > > > } > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > a[k] = 0.0d; > > > > > > a[p++] = -0.0d; > > > > > > } > > > > > > } > > > > > > > > > > > > Thank you, > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > From: iaroslavski at mail.ru > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did little bit > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code became > > > > > > > > consistent with main sort method and more compact. Also I use > > > > > > > > more usual "i--" and "i++" in for loops (instead of "--i", > > "++i. > > > > > > > > > > > > > > > > To accent the difference between float/double and other types, > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > /* > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > */ > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > /* > > > > > > > > ..... > > > > > > > > */ > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > Thank you, > > > > > > > > Vladimir > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > >> Vladimir, > > > > > > > >> > > > > > > > >> I can see that you changed sortNegZeroAndNaN(float[]...) but > > > > probably > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > >> > > > > > > > >> You really puzzled me with failed testcase and note that > > sorting > > > > > > > >> algorithm (without special attention to zeros) generally may > > > > change > > > > > > > >> number of negative zeros. > > > > > > > >> I will provide my comments later. > > > > > > > >> > > > > > > > >> As for counting sort, I think we should use single format > > > > style over > > > > > > > >> the file (unless we have valuable reason not to do this). I > > > > mean to > > > > > > > >> choose > > > > > > > >> 1) > > > > > > > >> if (toIndex - fromIndex > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > >> return; > > > > > > > >> } > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > >> 2) > > > > > > > >> if (toIndex - fromIndex > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > >> } else { > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > >> } > > > > > > > >> I prefer the second one. > > > > > > > >> > > > > > > > >> Thanks a lot, > > > > > > > >> Dmytro Sheyko > > > > > > > >> > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > >> > Subject: Re: New portion of improvements for Dual-Pivot > > > > Quicksort > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > >> > > > > > > > > >> > Hello, > > > > > > > >> > > > > > > > > >> > I've run your modification for counting sort, it real > > faster. > > > > > > > >> > I attached new version with your changes (I did little bit > > > > > > > >> > format it) and included my case with float/double. > > > > > > > >> > > > > > > > > >> > Note that you modification doesn't pass test from > > Sorting class, > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > >> > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = 9, n = > > > > 10, p = 9 > > > > > > > >> > > > > > > > > >> > I suggest shorter method (which is based on your idea to > > skip > > > > > > counting > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > index (or > > > > > > it will > > > > > > > >> > be index of first positive element if no zeros at all, > > or last > > > > > > > >> negative, > > > > > > > >> > if no positive and zero elements) and then swap negative > > > > zero to the > > > > > > > >> > beginning of the sub-range. > > > > > > > >> > > > > > > > > >> > int hi = right; > > > > > > > >> > > > > > > > > >> > while (left < hi) { > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > >> > float middleValue = a[middle]; > > > > > > > >> > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > >> > left = middle + 1; > > > > > > > >> > } else { > > > > > > > >> > hi = middle; > > > > > > > >> > } > > > > > > > >> > } > > > > > > > >> > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > >> > float ak = a[k]; > > > > > > > >> > if (ak != 0.0f) { > > > > > > > >> > return; > > > > > > > >> > } > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > > > > > > >> > a[k] = +0.0f; > > > > > > > >> > a[p++] = -0.0f; > > > > > > > >> > } > > > > > > > >> > } > > > > > > > >> > > > > > > > > >> > Important note: in partitioning loop there are several > > places > > > > > > > >> > (marked by // !) where potential bug with -0.0 could be > > > > > > > >> > (when pivot and a[great] are zeros with different signs): > > > > > > > >> > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > >> > a[k] = a[less]; > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > >> > + a[less++] = a[great]; > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > >> > a[k] = a[great]; > > > > > > > >> > } > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > >> > + a[great--] = ak; > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > >> > a[k] = a[less]; > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > >> > + a[less++] = ak; > > > > > > > >> > } > > > > > > > >> > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > >> > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for all types > > > > > > > >> > and "pivot1 -> a[great]" in float/double sections only. > > > > > > > >> > > > > > > > > >> > Please, review format changes for counting sort and new > > version > > > > > > > >> > of Phase 3 for float/double. > > > > > > > >> > > > > > > > > >> > Thank you, > > > > > > > >> > Vladimir > > > > > > > >> > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > >> > > Hi, > > > > > > > >> > > > > > > > > > >> > > About counting sort again. > > > > > > > >> > > > > > > > > > >> > > 1. This condition "i < count.length && k <= right" is > > > > excessive. > > > > > > > >> Any one > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > >> > > 2. No need to calculate "short value = (short) (i + > > > > > > > >> Short.MIN_VALUE)" > > > > > > > >> > > when "count[i]" is zero. > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > better loop > > > > > > > >> backward. > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit looping > > > > earlier > > > > > > > >> > > assuming that typically we work with positive numbers. > > > > > > > >> > > For unsigned primitives (char) we would better loop > > forward > > > > > > because > > > > > > > >> > > typically we work with characters about zero (ASCII). > > > > > > > >> > > > > > > > > > >> > > - 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--) { > > > > > > > >> > > - a[k++] = value; > > > > > > > >> > > - } > > > > > > > >> > > - } > > > > > > > >> > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = toIndex - 1; k >= > > > > > > > >> > > fromIndex; --i) { > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > >> > > + int s = count[i]; > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > >> > > + } > > > > > > > >> > > > > > > > > > >> > > Thanks, > > > > > > > >> > > Dmytro Sheyko > > > > > > > >> > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > Dual-Pivot > > > > > > > >> Quicksort > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > >> > > > > > > > > > > >> > > > Sounds good! > > > > > > > >> > > > Will consider too... > > > > > > > >> > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? Dmytro Sheyko > > > > > > > >> > > : > > > > > > > >> > > > > > > > > > > >> > > > > Hi, > > > > > > > >> > > > > > > > > > > > >> > > > > Regarding counting sort. We can check whether we > > should > > > > > > > >> switch to > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > >> > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > Dual-Pivot > > > > > > > >> Quicksort > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > >> > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > >> > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run tests again > > > > > > with you > > > > > > > >> > > changes. > > > > > > > >> > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > >> > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > >> > > > > > > Hello, > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > >> Double.doubleToLongBits and > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > Float.floatToIntBits. > > > > > > > >> > > > > > > No need to handle NaN's because they all are > > placed to > > > > > > > >> the end > > > > > > > >> > > of array. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > Long.MIN_VALUE and > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > Integer.MIN_VALUE. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more efficient > > (or at > > > > > > > >> least not > > > > > > > >> > > worse) > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > Float.floatToIntBits(ak)) > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && Float.floatToIntBits(ak) < 0) > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > negative zeros > > > > > > after > > > > > > > >> > > sorting. > > > > > > > >> > > > > > > General sorting algorithm puts both negative and > > > > positive > > > > > > > >> zeros > > > > > > > >> > > together > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > >> > > > > > > Therefore we have to process less elements because > > > > > > > >> usually we > > > > > > > >> > > have less > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > >> > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; jjb at google.com > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > iaroslavski at mail.ru > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of improvements for > > > > > > Dual-Pivot > > > > > > > >> > > Quicksort > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, review the > > changes. > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 ?????? ?? > > Dmytro > > > > Sheyko > > > > > > > >> > > > > > > : > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero using binary > > > > search) > > > > > > > >> over > > > > > > > >> > > C (Count > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > core-libs-dev at openjdk.java.net; > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > improvements for > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 +0400 > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested variants, and > > > > found that > > > > > > > >> case "C" > > > > > > > >> > > > > > > > > > (very interesting approach to find first > > > > position > > > > > > > >> of zero > > > > > > > >> > > > > > > > > > by counting negative elements) works > > slower than > > > > > > > >> original > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are very close > > > > to each > > > > > > > >> other > > > > > > > >> > > > > > > > > > and little bit faster than original. I > > > > prefer case > > > > > > > >> "F": > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do you agree? > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated DualPivotQuicksort > > file and > > > > > > > >> send it > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 ?????? > > ?? Dmytro > > > > > > > >> Sheyko > > > > > > > >> > > > > > > : > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > comments/proposals > > > > > > > >> regarding > > > > > > > >> > > dealing > > > > > > > >> > > > > > > with negative zeros. > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero we can > > > > avoid range > > > > > > > >> check > > > > > > > >> > > (i >= > > > > > > > >> > > > > > > left) if we have at least one negative value. > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > 09:04:19 2010 > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed May 12 > > > > 12:10:46 > > > > > > > >> 2010 > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > left && > > > > a[i] == > > > > > > > >> > > 0.0f; i--) { > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > + > > > > > > > >> > > > > > > > > > > + // there is at least one negative > > value, so > > > > > > range > > > > > > > >> > > check is > > > > > > > >> > > > > > > not needed > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; /*i >= > > left &&*/ > > > > > > > >> a[i] == > > > > > > > >> > > 0.0f; i--) { > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > >> > > > > > > > > > > + } > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of positive zeros > > > > > > back into > > > > > > > >> > > negative zeros > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of the first > > > > zero by > > > > > > > >> counting > > > > > > > >> > > > > > > negative values during preprocessing phase. > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > 09:04:19 2010 > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed May 12 > > > > 12:01:24 > > > > > > > >> 2010 > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros and move > > > > NaNs to > > > > > > > >> end of > > > > > > > >> > > array. > > > > > > > >> > > > > > > > > > > */ > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > numNegativeValues = 0; > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // i.e., ak is NaN > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > + int zeroIndex = numNegativeValues; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= left && > > > > a[i] == > > > > > > > >> 0.0f; > > > > > > > >> > > i--) { > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to find > > the first > > > > > > > >> zero and > > > > > > > >> > > thus > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > 09:04:19 2010 > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed May 12 > > > > 12:03:58 > > > > > > > >> 2010 > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, left, n); > > > > > > > >> > > > > > > > > > > - > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > left && > > > > a[i] == > > > > > > > >> > > 0.0f; i--) { > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > >> > > > > > > > > > > - } > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > left, n); > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of positive zeros > > > > > > back into > > > > > > > >> > > negative zeros > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = zeroIndex + > > > > > > > >> > > numNegativeZeros; i < > > > > > > > >> > > > > > > m; i++) { > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > element > > > > in the > > > > > > > >> > > specified > > > > > > > >> > > > > > > range via > > > > > > > >> > > > > > > > > > > + * Returns the index of the first zero > > > > element > > > > > > > >> in the > > > > > > > >> > > > > > > specified range via > > > > > > > >> > > > > > > > > > > * binary search. The range is assumed > > to be > > > > > > > >> sorted, and > > > > > > > >> > > must > > > > > > > >> > > > > > > contain > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > >> > > > > > > > > > > * > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > >> > > > > > > > > > > * @param low the index of the first > > element, > > > > > > > >> inclusive, > > > > > > > >> > > to be > > > > > > > >> > > > > > > searched > > > > > > > >> > > > > > > > > > > * @param high the index of the last > > element, > > > > > > > >> inclusive, > > > > > > > >> > > to be > > > > > > > >> > > > > > > searched > > > > > > > >> > > > > > > > > > > */ > > > > > > > >> > > > > > > > > > > - private static int > > findAnyZero(float[] a, > > > > > > int low, > > > > > > > >> > > int high) { > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > >> > > > > > > > > > > + private static int > > findFirstZero(float[] > > > > a, int > > > > > > > >> low, > > > > > > > >> > > int high) { > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > } > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values appeared more > > > > expensive > > > > > > > >> than > > > > > > > >> > > any other > > > > > > > >> > > > > > > variants. > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > efficient > > > > as the > > > > > > > >> current > > > > > > > >> > > > > > > solution is in its worst case - when we have > > only one > > > > > > > >> negative > > > > > > > >> > > zero (in > > > > > > > >> > > > > > > the half of array). > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > have many > > > > > > zeros. > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > dmytro_sheyko at hotmail.com > > > > > > > >> > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > >> iaroslavski at mail.ru > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > improvements for > > > > > > > >> > > Dual-Pivot > > > > > > > >> > > > > > > Quicksort > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 23:51:27 +0400 > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly testing > > "great - > > > > > > > >> less > 5 * > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > >> > > > > > > > > > > > and found that more symmetric code > > "less > > > > < e1 && > > > > > > > >> > > great > e5" > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has not been > > > > changed. > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest version in > > > > attachment. > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > ?????? ?? > > > > Joshua > > > > > > > >> Bloch > > > > > > > >> > > > > > > : > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > e5) { > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * seventh) { > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > >> > > > > > > > > > > > >Josh Hotmail: Powerful Free email with security by Microsoft. Get it now. _________________________________________________________________ Hotmail: Trusted email with Microsoft?s powerful SPAM protection. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: From iaroslavski at mail.ru Tue Jun 1 11:40:19 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Tue, 01 Jun 2010 15:40:19 +0400 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: <4BF2AAEE.1040706@mail.ru> <4BF3BFFD.8010007@mail.ru> <4BF3C05C.7010300@mail.ru> <4BF69AFB.8060406@mail.ru> <4BFB716B.4020107@mail.ru> <4BFD1021.1030404@mail.ru> Message-ID: <4C04F1A3.4040907@mail.ru> Hi Dmytro, Very interesting investigation, thank you very much! I tried you suggested sorting network, but all versions work the same. Then I used bubble sort (10 comparisons) and it shows better results: on client it is faster on 0.2%, server - 0.8%, not too much, but faster. The schema is (bubble sort with changes of direction): [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] And moreover: if we use insertion sort for sorting of 5 candidates: int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; if (ae2 < a[e1]) { a[e2] = a[e1]; a[e1] = ae2; } if (ae3 < a[e2]) { if (ae3 < a[e1]) { a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae3; } else { a[e3] = a[e2]; a[e2] = ae3; } } if (ae4 < a[e2]) { if (ae4 < a[e1]) { a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae4; } else { a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae4; } } else { if (ae4 < a[e3]) { a[e4] = a[e3]; a[e3] = ae4; } } if (ae5 < a[e2]) { if (ae5 < a[e1]) { a[e5]=a[e4];a[e4]=a[e3];a[e3]=a[e2];a[e2]=a[e1];a[e1]=ae5; } else { a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae5; } } else { if (ae5 < a[e3]) { a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = ae5; } else { if (ae5 < a[e4]) { a[e5] = a[e4]; a[e4] = ae5; } } } it shows better results than bubble sort: client - 0.37%, server - 1.03% Which sorting algorithm we should use? 1. Network - compact, 9 lines of code 2. Bubble - also compact, 10 lines of code 3. Insertion - faster, but 39 lines of code Regards, Vladimir Dmytro Sheyko wrote: > Corrections. > 1. The sixth comparator in current network (that swaps with 90% > probability) is [2 3] not [0 3]. > 2. The average number of swaps are > 576/120 = 4.8 for current network and > 376/120 = 3.1(3...) for proposed network. > > ------------------------------------------------------------------------ > From: dmytro_sheyko at hotmail.com > To: iaroslavski at mail.ru; joshua.bloch at google.com > Subject: RE: New portion of improvements for Dual-Pivot Quicksort > Date: Tue, 1 Jun 2010 14:59:07 +0700 > CC: core-libs-dev at openjdk.java.net > > Hi Vladimir, > > I cannot write 7-comparison sort briefly as well. However I think we can > optimize sorting network a bit. > We can consider such properties as > 1. size, i.e. number of comparators > 2. delay, i.e. number of parallel steps (some comparisons and swaps can > be done concurrently) > 3. average number of swaps. > > The current sorting network > [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] > has size 9 and delay 5. > These values are good enough. Generally we cannot write it shorter (in > order to improve size) and combine more than 2 comparison in a parallel > step (in order to improve delay). > > However the average number of swaps seems too high. It performs 576 > swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) > I tried every permutation of 5 distinct values. > There is a profile per comparator: > (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] > The first two comparison offer probability of swap as 50%, which is > natural. However the sixth comparator (i.e. [0 3]) swaps with > probability 90%, i.e. almost always! > > The one of the best sorting network (I have found) with the same size > and delay is following > [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] > Its average number of swaps is 376. > And here is a profile: > (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] > > Regards, > Dmytro Sheyko > > > Date: Wed, 26 May 2010 16:12:17 +0400 > > From: iaroslavski at mail.ru > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > > CC: core-libs-dev at openjdk.java.net > > > > Hello Dmytro, > > > > Theoretical investigations are based on simple model, > > which doesn't take into account many optimizations > > like "equal pivots", "scan equal to pivots", etc. > > Model based on the implementation will be too complex > > to be analyzed. > > > > But it is easy to count comparisons and assignments, > > if I change them by functions with counter. > > > > Also I tried to write 7-comparison sort, but the code > > was too long (a lot of inner if-then-else) instead of > > 9 compact lines. Do you have suggestion how to implement > > a nice 7-comparison sort? I tried also selection and bubble > > sorts, but insertion sort shows better time. > > > > Josh, > > Could you please review the last changes (especially javadoc > > and comments)? > > > > Thank you, > > Vladimir > > > > Dmytro Sheyko wrote: > > > Hi Vladimir, > > > > > > As for me, everything seems good. > > > > > > Returning to the theoretical background, could you estimate number of > > > comparison and assignments? These should be less than in your initial > > > version. > > > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > > candidates instead of 9-comparison sorting network? > > > > > > Thank you, > > > Dmytro Sheyko > > > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > > From: iaroslavski at mail.ru > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > To: dmytro_sheyko at hotmail.com > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > I added more comments, please, review attached version. > > > > > > > > >> So, we win 2-3% ! > > > > > > > > On [partial] sorted inputs new version runs more faster than few > > > percents: > > > > > > > > organ pipes > > > > this: 6896 > > > > prev: 7424 > > > > jdk7: 8018 > > > > jdk6: 12502 > > > > > > > > ascendant > > > > this: 2877 > > > > prev: 3845 > > > > jdk7: 4583 > > > > jdk6: 9019 > > > > > > > > descendant > > > > this: 3287 > > > > prev: 4110 > > > > jdk7: 4897 > > > > jdk6: 9132 > > > > > > > > Dmytro Sheyko wrote: > > > > > That's great! Thank you. > > > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > > From: iaroslavski at mail.ru > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > Hello, > > > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > > value (if any) or all leading negative" and with my optimization > > > > > > for all types. I added two while loops before partitioning to > > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > > > if (pivot1 != pivot2) { > > > > > > /* ... */ > > > > > > a[e2] = a[less]; > > > > > > a[e4] = a[great]; > > > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > > > /* ... */ > > > > > > outer: > > > > > > for (int k = less; k <= great; k++) { > > > > > > ... > > > > > > } > > > > > > > > > > > > Here is benchmark result (in compare with quicksort from JDK 6): > > > > > > > > > > > > client server > > > > > > ------ ------ > > > > > > previous version: 60.70% 48.20% > > > > > > current version: 57.22% 46.18% > > > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > > > Thank you, > > > > > > Vladimir > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > > modification. It > > > > > > > appeared that number of negative zeros were changed during > general > > > > > sort. > > > > > > > As I can see you already fixed this issue. Well, my > > > modification was > > > > > > > based on assumption that we can speed up eliminating > explicit array > > > > > > > range checks. > > > > > > > However, such assumption is wrong because Hotspot anyway emits > > > range > > > > > > > checks at its discretion and therefore processZeros generally > > > does not > > > > > > > work as fast as I expected. > > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > > > As for the latest code you posted. Doesn't it make sense to > skip > > > > > leading > > > > > > > negative zeros before farther processing? In this case we avoid > > > > > > > unnecessary assigning +0.0 and then -0.0 to the same > location a[k] > > > > > (i.e. > > > > > > > where k == p). > > > > > > > > > > > > > > /* > > > > > > > * Skip the last negative value (if any) or all leading negative > > > > > > > zeros > > > > > > > */ > > > > > > > while (left <= right && Double.doubleToRawLongBits(a[left]) > < 0) { > > > > > > > left++; > > > > > > > } > > > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > > double ak = a[k]; > > > > > > > if (ak != 0.0d) { > > > > > > > return; > > > > > > > } > > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > > a[k] = 0.0d; > > > > > > > a[p++] = -0.0d; > > > > > > > } > > > > > > > } > > > > > > > > > > > > > > Thank you, > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > Quicksort > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did > little bit > > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code became > > > > > > > > > consistent with main sort method and more compact. Also > I use > > > > > > > > > more usual "i--" and "i++" in for loops (instead of "--i", > > > "++i. > > > > > > > > > > > > > > > > > > To accent the difference between float/double and other > types, > > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > > > /* > > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > > */ > > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > > > /* > > > > > > > > > ..... > > > > > > > > > */ > > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > >> Vladimir, > > > > > > > > >> > > > > > > > > >> I can see that you changed > sortNegZeroAndNaN(float[]...) but > > > > > probably > > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > > >> > > > > > > > > >> You really puzzled me with failed testcase and note that > > > sorting > > > > > > > > >> algorithm (without special attention to zeros) > generally may > > > > > change > > > > > > > > >> number of negative zeros. > > > > > > > > >> I will provide my comments later. > > > > > > > > >> > > > > > > > > >> As for counting sort, I think we should use single format > > > > > style over > > > > > > > > >> the file (unless we have valuable reason not to do > this). I > > > > > mean to > > > > > > > > >> choose > > > > > > > > >> 1) > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > >> return; > > > > > > > > >> } > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > >> 2) > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > >> } else { > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > >> } > > > > > > > > >> I prefer the second one. > > > > > > > > >> > > > > > > > > >> Thanks a lot, > > > > > > > > >> Dmytro Sheyko > > > > > > > > >> > > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > > >> > Subject: Re: New portion of improvements for Dual-Pivot > > > > > Quicksort > > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > > >> > > > > > > > > > >> > Hello, > > > > > > > > >> > > > > > > > > > >> > I've run your modification for counting sort, it real > > > faster. > > > > > > > > >> > I attached new version with your changes (I did > little bit > > > > > > > > >> > format it) and included my case with float/double. > > > > > > > > >> > > > > > > > > > >> > Note that you modification doesn't pass test from > > > Sorting class, > > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > > >> > > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = > 9, n = > > > > > 10, p = 9 > > > > > > > > >> > > > > > > > > > >> > I suggest shorter method (which is based on your > idea to > > > skip > > > > > > > counting > > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > > index (or > > > > > > > it will > > > > > > > > >> > be index of first positive element if no zeros at all, > > > or last > > > > > > > > >> negative, > > > > > > > > >> > if no positive and zero elements) and then swap negative > > > > > zero to the > > > > > > > > >> > beginning of the sub-range. > > > > > > > > >> > > > > > > > > > >> > int hi = right; > > > > > > > > >> > > > > > > > > > >> > while (left < hi) { > > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > > >> > float middleValue = a[middle]; > > > > > > > > >> > > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > > >> > left = middle + 1; > > > > > > > > >> > } else { > > > > > > > > >> > hi = middle; > > > > > > > > >> > } > > > > > > > > >> > } > > > > > > > > >> > > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > > >> > float ak = a[k]; > > > > > > > > >> > if (ak != 0.0f) { > > > > > > > > >> > return; > > > > > > > > >> > } > > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > > > > > > > >> > a[k] = +0.0f; > > > > > > > > >> > a[p++] = -0.0f; > > > > > > > > >> > } > > > > > > > > >> > } > > > > > > > > >> > > > > > > > > > >> > Important note: in partitioning loop there are several > > > places > > > > > > > > >> > (marked by // !) where potential bug with -0.0 could be > > > > > > > > >> > (when pivot and a[great] are zeros with different > signs): > > > > > > > > >> > > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > > >> > a[k] = a[less]; > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > >> > + a[less++] = a[great]; > > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > > >> > a[k] = a[great]; > > > > > > > > >> > } > > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > > >> > + a[great--] = ak; > > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > > >> > a[k] = a[less]; > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > >> > + a[less++] = ak; > > > > > > > > >> > } > > > > > > > > >> > > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > > >> > > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for all types > > > > > > > > >> > and "pivot1 -> a[great]" in float/double sections only. > > > > > > > > >> > > > > > > > > > >> > Please, review format changes for counting sort and new > > > version > > > > > > > > >> > of Phase 3 for float/double. > > > > > > > > >> > > > > > > > > > >> > Thank you, > > > > > > > > >> > Vladimir > > > > > > > > >> > > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > > >> > > Hi, > > > > > > > > >> > > > > > > > > > > >> > > About counting sort again. > > > > > > > > >> > > > > > > > > > > >> > > 1. This condition "i < count.length && k <= right" is > > > > > excessive. > > > > > > > > >> Any one > > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > > >> > > 2. No need to calculate "short value = (short) (i + > > > > > > > > >> Short.MIN_VALUE)" > > > > > > > > >> > > when "count[i]" is zero. > > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > > better loop > > > > > > > > >> backward. > > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit > looping > > > > > earlier > > > > > > > > >> > > assuming that typically we work with positive numbers. > > > > > > > > >> > > For unsigned primitives (char) we would better loop > > > forward > > > > > > > because > > > > > > > > >> > > typically we work with characters about zero (ASCII). > > > > > > > > >> > > > > > > > > > > >> > > - 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--) { > > > > > > > > >> > > - a[k++] = value; > > > > > > > > >> > > - } > > > > > > > > >> > > - } > > > > > > > > >> > > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = toIndex - > 1; k >= > > > > > > > > >> > > fromIndex; --i) { > > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > > >> > > + int s = count[i]; > > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > > >> > > + } > > > > > > > > >> > > > > > > > > > > >> > > Thanks, > > > > > > > > >> > > Dmytro Sheyko > > > > > > > > >> > > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; > iaroslavski at mail.ru > > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > > Dual-Pivot > > > > > > > > >> Quicksort > > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > > >> > > > > > > > > > > > >> > > > Sounds good! > > > > > > > > >> > > > Will consider too... > > > > > > > > >> > > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? Dmytro > Sheyko > > > > > > > > >> > > : > > > > > > > > >> > > > > > > > > > > > >> > > > > Hi, > > > > > > > > >> > > > > > > > > > > > > >> > > > > Regarding counting sort. We can check whether we > > > should > > > > > > > > >> switch to > > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > > >> > > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > > Dual-Pivot > > > > > > > > >> Quicksort > > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run > tests again > > > > > > > with you > > > > > > > > >> > > changes. > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > > >> > > > > > Vladimir > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > > >> > > > > > > Hello, > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > > >> Double.doubleToLongBits and > > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > > Float.floatToIntBits. > > > > > > > > >> > > > > > > No need to handle NaN's because they all are > > > placed to > > > > > > > > >> the end > > > > > > > > >> > > of array. > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > > Long.MIN_VALUE and > > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > > Integer.MIN_VALUE. > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more efficient > > > (or at > > > > > > > > >> least not > > > > > > > > >> > > worse) > > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > > Float.floatToIntBits(ak)) > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && Float.floatToIntBits(ak) > < 0) > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > > negative zeros > > > > > > > after > > > > > > > > >> > > sorting. > > > > > > > > >> > > > > > > General sorting algorithm puts both > negative and > > > > > positive > > > > > > > > >> zeros > > > > > > > > >> > > together > > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > > >> > > > > > > Therefore we have to process less elements > because > > > > > > > > >> usually we > > > > > > > > >> > > have less > > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; > jjb at google.com > > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > iaroslavski at mail.ru > > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of > improvements for > > > > > > > Dual-Pivot > > > > > > > > >> > > Quicksort > > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, review the > > > changes. > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 ?????? ?? > > > Dmytro > > > > > Sheyko > > > > > > > > >> > > > > > > : > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero using > binary > > > > > search) > > > > > > > > >> over > > > > > > > > >> > > C (Count > > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > > core-libs-dev at openjdk.java.net; > > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > > improvements for > > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 +0400 > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested variants, and > > > > > found that > > > > > > > > >> case "C" > > > > > > > > >> > > > > > > > > > (very interesting approach to find first > > > > > position > > > > > > > > >> of zero > > > > > > > > >> > > > > > > > > > by counting negative elements) works > > > slower than > > > > > > > > >> original > > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are very > close > > > > > to each > > > > > > > > >> other > > > > > > > > >> > > > > > > > > > and little bit faster than original. I > > > > > prefer case > > > > > > > > >> "F": > > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do you > agree? > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated DualPivotQuicksort > > > file and > > > > > > > > >> send it > > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 ?????? > > > ?? Dmytro > > > > > > > > >> Sheyko > > > > > > > > >> > > > > > > : > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > > comments/proposals > > > > > > > > >> regarding > > > > > > > > >> > > dealing > > > > > > > > >> > > > > > > with negative zeros. > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero we can > > > > > avoid range > > > > > > > > >> check > > > > > > > > >> > > (i >= > > > > > > > > >> > > > > > > left) if we have at least one negative value. > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > 09:04:19 2010 > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed > May 12 > > > > > 12:10:46 > > > > > > > > >> 2010 > > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > left, n); > > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > left && > > > > > a[i] == > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, left, n); > > > > > > > > >> > > > > > > > > > > + > > > > > > > > >> > > > > > > > > > > + // there is at least one negative > > > value, so > > > > > > > range > > > > > > > > >> > > check is > > > > > > > > >> > > > > > > not needed > > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; /*i >= > > > left &&*/ > > > > > > > > >> a[i] == > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > > >> > > > > > > > > > > + } > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > positive zeros > > > > > > > back into > > > > > > > > >> > > negative zeros > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of the > first > > > > > zero by > > > > > > > > >> counting > > > > > > > > >> > > > > > > negative values during preprocessing phase. > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > 09:04:19 2010 > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed > May 12 > > > > > 12:01:24 > > > > > > > > >> 2010 > > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros > and move > > > > > NaNs to > > > > > > > > >> end of > > > > > > > > >> > > array. > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > > numNegativeValues = 0; > > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // i.e., ak > is NaN > > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > left, n); > > > > > > > > >> > > > > > > > > > > + int zeroIndex = numNegativeValues; > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= > left && > > > > > a[i] == > > > > > > > > >> 0.0f; > > > > > > > > >> > > i--) { > > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to find > > > the first > > > > > > > > >> zero and > > > > > > > > >> > > thus > > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > 09:04:19 2010 > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed > May 12 > > > > > 12:03:58 > > > > > > > > >> 2010 > > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > left, n); > > > > > > > > >> > > > > > > > > > > - > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > left && > > > > > a[i] == > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > >> > > > > > > > > > > - } > > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > > left, n); > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > positive zeros > > > > > > > back into > > > > > > > > >> > > negative zeros > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = > zeroIndex + > > > > > > > > >> > > numNegativeZeros; i < > > > > > > > > >> > > > > > > m; i++) { > > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > > element > > > > > in the > > > > > > > > >> > > specified > > > > > > > > >> > > > > > > range via > > > > > > > > >> > > > > > > > > > > + * Returns the index of the first > zero > > > > > element > > > > > > > > >> in the > > > > > > > > >> > > > > > > specified range via > > > > > > > > >> > > > > > > > > > > * binary search. The range is assumed > > > to be > > > > > > > > >> sorted, and > > > > > > > > >> > > must > > > > > > > > >> > > > > > > contain > > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > > >> > > > > > > > > > > * > > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > > >> > > > > > > > > > > * @param low the index of the first > > > element, > > > > > > > > >> inclusive, > > > > > > > > >> > > to be > > > > > > > > >> > > > > > > searched > > > > > > > > >> > > > > > > > > > > * @param high the index of the last > > > element, > > > > > > > > >> inclusive, > > > > > > > > >> > > to be > > > > > > > > >> > > > > > > searched > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > >> > > > > > > > > > > - private static int > > > findAnyZero(float[] a, > > > > > > > int low, > > > > > > > > >> > > int high) { > > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > > >> > > > > > > > > > > + private static int > > > findFirstZero(float[] > > > > > a, int > > > > > > > > >> low, > > > > > > > > >> > > int high) { > > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > } > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values appeared more > > > > > expensive > > > > > > > > >> than > > > > > > > > >> > > any other > > > > > > > > >> > > > > > > variants. > > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > > efficient > > > > > as the > > > > > > > > >> current > > > > > > > > >> > > > > > > solution is in its worst case - when we have > > > only one > > > > > > > > >> negative > > > > > > > > >> > > zero (in > > > > > > > > >> > > > > > > the half of array). > > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > > have many > > > > > > > zeros. > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > > dmytro_sheyko at hotmail.com > > > > > > > > >> > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > > >> iaroslavski at mail.ru > > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > > improvements for > > > > > > > > >> > > Dual-Pivot > > > > > > > > >> > > > > > > Quicksort > > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 23:51:27 +0400 > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly testing > > > "great - > > > > > > > > >> less > 5 * > > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > > >> > > > > > > > > > > > and found that more symmetric code > > > "less > > > > > < e1 && > > > > > > > > >> > > great > e5" > > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has not been > > > > > changed. > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest version in > > > > > attachment. > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > > ?????? ?? > > > > > Joshua > > > > > > > > >> Bloch > > > > > > > > >> > > > > > > : > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > e5) { > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * > seventh) { > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > > >> > > > > > > > > > > > >Josh From dmytro_sheyko at hotmail.com Tue Jun 1 12:35:49 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Tue, 1 Jun 2010 19:35:49 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4C04F1A3.4040907@mail.ru> References: , , <4BF2AAEE.1040706@mail.ru>, <4BF3BFFD.8010007@mail.ru>,<4BF3C05C.7010300@mail.ru> , <4BF69AFB.8060406@mail.ru> , <4BFB716B.4020107@mail.ru> , <4BFD1021.1030404@mail.ru> , , <4C04F1A3.4040907@mail.ru> Message-ID: Have you tried it with "long"? It seems that comparing and exchanging longs are more expensive than other types (including double) on 32bit platform. So we can observe much difference. > Date: Tue, 1 Jun 2010 15:40:19 +0400 > From: iaroslavski at mail.ru > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > To: dmytro_sheyko at hotmail.com > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > Hi Dmytro, > > Very interesting investigation, thank you very much! > > I tried you suggested sorting network, but all versions work the same. > Then I used bubble sort (10 comparisons) and it shows better > results: on client it is faster on 0.2%, server - 0.8%, not too > much, but faster. > > The schema is (bubble sort with changes of direction): > [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > And moreover: if we use insertion sort for sorting of 5 candidates: > > int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > if (ae2 < a[e1]) { > a[e2] = a[e1]; a[e1] = ae2; > } > if (ae3 < a[e2]) { > if (ae3 < a[e1]) { > a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae3; > } else { > a[e3] = a[e2]; a[e2] = ae3; > } > } > if (ae4 < a[e2]) { > if (ae4 < a[e1]) { > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae4; > } else { > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae4; > } > } else { > if (ae4 < a[e3]) { > a[e4] = a[e3]; a[e3] = ae4; > } > } > if (ae5 < a[e2]) { > if (ae5 < a[e1]) { > a[e5]=a[e4];a[e4]=a[e3];a[e3]=a[e2];a[e2]=a[e1];a[e1]=ae5; > } else { > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae5; > } > } else { > if (ae5 < a[e3]) { > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = ae5; > } > else { > if (ae5 < a[e4]) { > a[e5] = a[e4]; a[e4] = ae5; > } > } > } > > it shows better results than bubble sort: > client - 0.37%, server - 1.03% > > Which sorting algorithm we should use? > > 1. Network - compact, 9 lines of code > 2. Bubble - also compact, 10 lines of code > 3. Insertion - faster, but 39 lines of code > > Regards, > Vladimir > > Dmytro Sheyko wrote: > > Corrections. > > 1. The sixth comparator in current network (that swaps with 90% > > probability) is [2 3] not [0 3]. > > 2. The average number of swaps are > > 576/120 = 4.8 for current network and > > 376/120 = 3.1(3...) for proposed network. > > > > ------------------------------------------------------------------------ > > From: dmytro_sheyko at hotmail.com > > To: iaroslavski at mail.ru; joshua.bloch at google.com > > Subject: RE: New portion of improvements for Dual-Pivot Quicksort > > Date: Tue, 1 Jun 2010 14:59:07 +0700 > > CC: core-libs-dev at openjdk.java.net > > > > Hi Vladimir, > > > > I cannot write 7-comparison sort briefly as well. However I think we can > > optimize sorting network a bit. > > We can consider such properties as > > 1. size, i.e. number of comparators > > 2. delay, i.e. number of parallel steps (some comparisons and swaps can > > be done concurrently) > > 3. average number of swaps. > > > > The current sorting network > > [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] > > has size 9 and delay 5. > > These values are good enough. Generally we cannot write it shorter (in > > order to improve size) and combine more than 2 comparison in a parallel > > step (in order to improve delay). > > > > However the average number of swaps seems too high. It performs 576 > > swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) > > I tried every permutation of 5 distinct values. > > There is a profile per comparator: > > (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] > > The first two comparison offer probability of swap as 50%, which is > > natural. However the sixth comparator (i.e. [0 3]) swaps with > > probability 90%, i.e. almost always! > > > > The one of the best sorting network (I have found) with the same size > > and delay is following > > [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] > > Its average number of swaps is 376. > > And here is a profile: > > (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] > > > > Regards, > > Dmytro Sheyko > > > > > Date: Wed, 26 May 2010 16:12:17 +0400 > > > From: iaroslavski at mail.ru > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > > > CC: core-libs-dev at openjdk.java.net > > > > > > Hello Dmytro, > > > > > > Theoretical investigations are based on simple model, > > > which doesn't take into account many optimizations > > > like "equal pivots", "scan equal to pivots", etc. > > > Model based on the implementation will be too complex > > > to be analyzed. > > > > > > But it is easy to count comparisons and assignments, > > > if I change them by functions with counter. > > > > > > Also I tried to write 7-comparison sort, but the code > > > was too long (a lot of inner if-then-else) instead of > > > 9 compact lines. Do you have suggestion how to implement > > > a nice 7-comparison sort? I tried also selection and bubble > > > sorts, but insertion sort shows better time. > > > > > > Josh, > > > Could you please review the last changes (especially javadoc > > > and comments)? > > > > > > Thank you, > > > Vladimir > > > > > > Dmytro Sheyko wrote: > > > > Hi Vladimir, > > > > > > > > As for me, everything seems good. > > > > > > > > Returning to the theoretical background, could you estimate number of > > > > comparison and assignments? These should be less than in your initial > > > > version. > > > > > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > > > candidates instead of 9-comparison sorting network? > > > > > > > > Thank you, > > > > Dmytro Sheyko > > > > > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > > > From: iaroslavski at mail.ru > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > To: dmytro_sheyko at hotmail.com > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > I added more comments, please, review attached version. > > > > > > > > > > >> So, we win 2-3% ! > > > > > > > > > > On [partial] sorted inputs new version runs more faster than few > > > > percents: > > > > > > > > > > organ pipes > > > > > this: 6896 > > > > > prev: 7424 > > > > > jdk7: 8018 > > > > > jdk6: 12502 > > > > > > > > > > ascendant > > > > > this: 2877 > > > > > prev: 3845 > > > > > jdk7: 4583 > > > > > jdk6: 9019 > > > > > > > > > > descendant > > > > > this: 3287 > > > > > prev: 4110 > > > > > jdk7: 4897 > > > > > jdk6: 9132 > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > That's great! Thank you. > > > > > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > > > From: iaroslavski at mail.ru > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > > > value (if any) or all leading negative" and with my optimization > > > > > > > for all types. I added two while loops before partitioning to > > > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > > > > > if (pivot1 != pivot2) { > > > > > > > /* ... */ > > > > > > > a[e2] = a[less]; > > > > > > > a[e4] = a[great]; > > > > > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > > > > > /* ... */ > > > > > > > outer: > > > > > > > for (int k = less; k <= great; k++) { > > > > > > > ... > > > > > > > } > > > > > > > > > > > > > > Here is benchmark result (in compare with quicksort from JDK 6): > > > > > > > > > > > > > > client server > > > > > > > ------ ------ > > > > > > > previous version: 60.70% 48.20% > > > > > > > current version: 57.22% 46.18% > > > > > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > > > > > Thank you, > > > > > > > Vladimir > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > > > modification. It > > > > > > > > appeared that number of negative zeros were changed during > > general > > > > > > sort. > > > > > > > > As I can see you already fixed this issue. Well, my > > > > modification was > > > > > > > > based on assumption that we can speed up eliminating > > explicit array > > > > > > > > range checks. > > > > > > > > However, such assumption is wrong because Hotspot anyway emits > > > > range > > > > > > > > checks at its discretion and therefore processZeros generally > > > > does not > > > > > > > > work as fast as I expected. > > > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > > > > > As for the latest code you posted. Doesn't it make sense to > > skip > > > > > > leading > > > > > > > > negative zeros before farther processing? In this case we avoid > > > > > > > > unnecessary assigning +0.0 and then -0.0 to the same > > location a[k] > > > > > > (i.e. > > > > > > > > where k == p). > > > > > > > > > > > > > > > > /* > > > > > > > > * Skip the last negative value (if any) or all leading negative > > > > > > > > zeros > > > > > > > > */ > > > > > > > > while (left <= right && Double.doubleToRawLongBits(a[left]) > > < 0) { > > > > > > > > left++; > > > > > > > > } > > > > > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > > > double ak = a[k]; > > > > > > > > if (ak != 0.0d) { > > > > > > > > return; > > > > > > > > } > > > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > > > a[k] = 0.0d; > > > > > > > > a[p++] = -0.0d; > > > > > > > > } > > > > > > > > } > > > > > > > > > > > > > > > > Thank you, > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > Quicksort > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did > > little bit > > > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code became > > > > > > > > > > consistent with main sort method and more compact. Also > > I use > > > > > > > > > > more usual "i--" and "i++" in for loops (instead of "--i", > > > > "++i. > > > > > > > > > > > > > > > > > > > > To accent the difference between float/double and other > > types, > > > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > > > */ > > > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > ..... > > > > > > > > > > */ > > > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > >> Vladimir, > > > > > > > > > >> > > > > > > > > > >> I can see that you changed > > sortNegZeroAndNaN(float[]...) but > > > > > > probably > > > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > > > >> > > > > > > > > > >> You really puzzled me with failed testcase and note that > > > > sorting > > > > > > > > > >> algorithm (without special attention to zeros) > > generally may > > > > > > change > > > > > > > > > >> number of negative zeros. > > > > > > > > > >> I will provide my comments later. > > > > > > > > > >> > > > > > > > > > >> As for counting sort, I think we should use single format > > > > > > style over > > > > > > > > > >> the file (unless we have valuable reason not to do > > this). I > > > > > > mean to > > > > > > > > > >> choose > > > > > > > > > >> 1) > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > >> return; > > > > > > > > > >> } > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > >> 2) > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > >> } else { > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > >> } > > > > > > > > > >> I prefer the second one. > > > > > > > > > >> > > > > > > > > > >> Thanks a lot, > > > > > > > > > >> Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > > > >> > Subject: Re: New portion of improvements for Dual-Pivot > > > > > > Quicksort > > > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > > > >> > > > > > > > > > > >> > Hello, > > > > > > > > > >> > > > > > > > > > > >> > I've run your modification for counting sort, it real > > > > faster. > > > > > > > > > >> > I attached new version with your changes (I did > > little bit > > > > > > > > > >> > format it) and included my case with float/double. > > > > > > > > > >> > > > > > > > > > > >> > Note that you modification doesn't pass test from > > > > Sorting class, > > > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > > > >> > > > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = > > 9, n = > > > > > > 10, p = 9 > > > > > > > > > >> > > > > > > > > > > >> > I suggest shorter method (which is based on your > > idea to > > > > skip > > > > > > > > counting > > > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > > > index (or > > > > > > > > it will > > > > > > > > > >> > be index of first positive element if no zeros at all, > > > > or last > > > > > > > > > >> negative, > > > > > > > > > >> > if no positive and zero elements) and then swap negative > > > > > > zero to the > > > > > > > > > >> > beginning of the sub-range. > > > > > > > > > >> > > > > > > > > > > >> > int hi = right; > > > > > > > > > >> > > > > > > > > > > >> > while (left < hi) { > > > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > > > >> > float middleValue = a[middle]; > > > > > > > > > >> > > > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > > > >> > left = middle + 1; > > > > > > > > > >> > } else { > > > > > > > > > >> > hi = middle; > > > > > > > > > >> > } > > > > > > > > > >> > } > > > > > > > > > >> > > > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > > > >> > float ak = a[k]; > > > > > > > > > >> > if (ak != 0.0f) { > > > > > > > > > >> > return; > > > > > > > > > >> > } > > > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > > > > > > > > >> > a[k] = +0.0f; > > > > > > > > > >> > a[p++] = -0.0f; > > > > > > > > > >> > } > > > > > > > > > >> > } > > > > > > > > > >> > > > > > > > > > > >> > Important note: in partitioning loop there are several > > > > places > > > > > > > > > >> > (marked by // !) where potential bug with -0.0 could be > > > > > > > > > >> > (when pivot and a[great] are zeros with different > > signs): > > > > > > > > > >> > > > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > >> > + a[less++] = a[great]; > > > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > > > >> > a[k] = a[great]; > > > > > > > > > >> > } > > > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > > > >> > + a[great--] = ak; > > > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > >> > + a[less++] = ak; > > > > > > > > > >> > } > > > > > > > > > >> > > > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > > > >> > > > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for all types > > > > > > > > > >> > and "pivot1 -> a[great]" in float/double sections only. > > > > > > > > > >> > > > > > > > > > > >> > Please, review format changes for counting sort and new > > > > version > > > > > > > > > >> > of Phase 3 for float/double. > > > > > > > > > >> > > > > > > > > > > >> > Thank you, > > > > > > > > > >> > Vladimir > > > > > > > > > >> > > > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > > > >> > > Hi, > > > > > > > > > >> > > > > > > > > > > > >> > > About counting sort again. > > > > > > > > > >> > > > > > > > > > > > >> > > 1. This condition "i < count.length && k <= right" is > > > > > > excessive. > > > > > > > > > >> Any one > > > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > > > >> > > 2. No need to calculate "short value = (short) (i + > > > > > > > > > >> Short.MIN_VALUE)" > > > > > > > > > >> > > when "count[i]" is zero. > > > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > > > better loop > > > > > > > > > >> backward. > > > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit > > looping > > > > > > earlier > > > > > > > > > >> > > assuming that typically we work with positive numbers. > > > > > > > > > >> > > For unsigned primitives (char) we would better loop > > > > forward > > > > > > > > because > > > > > > > > > >> > > typically we work with characters about zero (ASCII). > > > > > > > > > >> > > > > > > > > > > > >> > > - 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--) { > > > > > > > > > >> > > - a[k++] = value; > > > > > > > > > >> > > - } > > > > > > > > > >> > > - } > > > > > > > > > >> > > > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = toIndex - > > 1; k >= > > > > > > > > > >> > > fromIndex; --i) { > > > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > > > >> > > + int s = count[i]; > > > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > > > >> > > + } > > > > > > > > > >> > > > > > > > > > > > >> > > Thanks, > > > > > > > > > >> > > Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; > > iaroslavski at mail.ru > > > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > > > Dual-Pivot > > > > > > > > > >> Quicksort > > > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > > > >> > > > > > > > > > > > > >> > > > Sounds good! > > > > > > > > > >> > > > Will consider too... > > > > > > > > > >> > > > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? Dmytro > > Sheyko > > > > > > > > > >> > > : > > > > > > > > > >> > > > > > > > > > > > > >> > > > > Hi, > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > Regarding counting sort. We can check whether we > > > > should > > > > > > > > > >> switch to > > > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > > > Dual-Pivot > > > > > > > > > >> Quicksort > > > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run > > tests again > > > > > > > > with you > > > > > > > > > >> > > changes. > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > > > >> > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > > > >> > > > > > > Hello, > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > > > >> Double.doubleToLongBits and > > > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > > > Float.floatToIntBits. > > > > > > > > > >> > > > > > > No need to handle NaN's because they all are > > > > placed to > > > > > > > > > >> the end > > > > > > > > > >> > > of array. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > > > Long.MIN_VALUE and > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > > > Integer.MIN_VALUE. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more efficient > > > > (or at > > > > > > > > > >> least not > > > > > > > > > >> > > worse) > > > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > > > Float.floatToIntBits(ak)) > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && Float.floatToIntBits(ak) > > < 0) > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > > > negative zeros > > > > > > > > after > > > > > > > > > >> > > sorting. > > > > > > > > > >> > > > > > > General sorting algorithm puts both > > negative and > > > > > > positive > > > > > > > > > >> zeros > > > > > > > > > >> > > together > > > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > > > >> > > > > > > Therefore we have to process less elements > > because > > > > > > > > > >> usually we > > > > > > > > > >> > > have less > > > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; > > jjb at google.com > > > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of > > improvements for > > > > > > > > Dual-Pivot > > > > > > > > > >> > > Quicksort > > > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, review the > > > > changes. > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 ?????? ?? > > > > Dmytro > > > > > > Sheyko > > > > > > > > > >> > > > > > > : > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero using > > binary > > > > > > search) > > > > > > > > > >> over > > > > > > > > > >> > > C (Count > > > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > > > core-libs-dev at openjdk.java.net; > > > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > > > improvements for > > > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 +0400 > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested variants, and > > > > > > found that > > > > > > > > > >> case "C" > > > > > > > > > >> > > > > > > > > > (very interesting approach to find first > > > > > > position > > > > > > > > > >> of zero > > > > > > > > > >> > > > > > > > > > by counting negative elements) works > > > > slower than > > > > > > > > > >> original > > > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are very > > close > > > > > > to each > > > > > > > > > >> other > > > > > > > > > >> > > > > > > > > > and little bit faster than original. I > > > > > > prefer case > > > > > > > > > >> "F": > > > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do you > > agree? > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated DualPivotQuicksort > > > > file and > > > > > > > > > >> send it > > > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 ?????? > > > > ?? Dmytro > > > > > > > > > >> Sheyko > > > > > > > > > >> > > > > > > : > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > > > comments/proposals > > > > > > > > > >> regarding > > > > > > > > > >> > > dealing > > > > > > > > > >> > > > > > > with negative zeros. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero we can > > > > > > avoid range > > > > > > > > > >> check > > > > > > > > > >> > > (i >= > > > > > > > > > >> > > > > > > left) if we have at least one negative value. > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > > 09:04:19 2010 > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed > > May 12 > > > > > > 12:10:46 > > > > > > > > > >> 2010 > > > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > left, n); > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > left && > > > > > > a[i] == > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, left, n); > > > > > > > > > >> > > > > > > > > > > + > > > > > > > > > >> > > > > > > > > > > + // there is at least one negative > > > > value, so > > > > > > > > range > > > > > > > > > >> > > check is > > > > > > > > > >> > > > > > > not needed > > > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; /*i >= > > > > left &&*/ > > > > > > > > > >> a[i] == > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > + } > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > positive zeros > > > > > > > > back into > > > > > > > > > >> > > negative zeros > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of the > > first > > > > > > zero by > > > > > > > > > >> counting > > > > > > > > > >> > > > > > > negative values during preprocessing phase. > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > > 09:04:19 2010 > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed > > May 12 > > > > > > 12:01:24 > > > > > > > > > >> 2010 > > > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros > > and move > > > > > > NaNs to > > > > > > > > > >> end of > > > > > > > > > >> > > array. > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > > > numNegativeValues = 0; > > > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // i.e., ak > > is NaN > > > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > left, n); > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = numNegativeValues; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= > > left && > > > > > > a[i] == > > > > > > > > > >> 0.0f; > > > > > > > > > >> > > i--) { > > > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to find > > > > the first > > > > > > > > > >> zero and > > > > > > > > > >> > > thus > > > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > > 09:04:19 2010 > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed > > May 12 > > > > > > 12:03:58 > > > > > > > > > >> 2010 > > > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > left, n); > > > > > > > > > >> > > > > > > > > > > - > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > left && > > > > > > a[i] == > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > - } > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > > > left, n); > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > positive zeros > > > > > > > > back into > > > > > > > > > >> > > negative zeros > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = > > zeroIndex + > > > > > > > > > >> > > numNegativeZeros; i < > > > > > > > > > >> > > > > > > m; i++) { > > > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > > > element > > > > > > in the > > > > > > > > > >> > > specified > > > > > > > > > >> > > > > > > range via > > > > > > > > > >> > > > > > > > > > > + * Returns the index of the first > > zero > > > > > > element > > > > > > > > > >> in the > > > > > > > > > >> > > > > > > specified range via > > > > > > > > > >> > > > > > > > > > > * binary search. The range is assumed > > > > to be > > > > > > > > > >> sorted, and > > > > > > > > > >> > > must > > > > > > > > > >> > > > > > > contain > > > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > > > >> > > > > > > > > > > * > > > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > > > >> > > > > > > > > > > * @param low the index of the first > > > > element, > > > > > > > > > >> inclusive, > > > > > > > > > >> > > to be > > > > > > > > > >> > > > > > > searched > > > > > > > > > >> > > > > > > > > > > * @param high the index of the last > > > > element, > > > > > > > > > >> inclusive, > > > > > > > > > >> > > to be > > > > > > > > > >> > > > > > > searched > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > >> > > > > > > > > > > - private static int > > > > findAnyZero(float[] a, > > > > > > > > int low, > > > > > > > > > >> > > int high) { > > > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > > > >> > > > > > > > > > > + private static int > > > > findFirstZero(float[] > > > > > > a, int > > > > > > > > > >> low, > > > > > > > > > >> > > int high) { > > > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values appeared more > > > > > > expensive > > > > > > > > > >> than > > > > > > > > > >> > > any other > > > > > > > > > >> > > > > > > variants. > > > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > > > efficient > > > > > > as the > > > > > > > > > >> current > > > > > > > > > >> > > > > > > solution is in its worst case - when we have > > > > only one > > > > > > > > > >> negative > > > > > > > > > >> > > zero (in > > > > > > > > > >> > > > > > > the half of array). > > > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > > > have many > > > > > > > > zeros. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > > > dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > > > >> iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > > > improvements for > > > > > > > > > >> > > Dual-Pivot > > > > > > > > > >> > > > > > > Quicksort > > > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 23:51:27 +0400 > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly testing > > > > "great - > > > > > > > > > >> less > 5 * > > > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > > > >> > > > > > > > > > > > and found that more symmetric code > > > > "less > > > > > > < e1 && > > > > > > > > > >> > > great > e5" > > > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has not been > > > > > > changed. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest version in > > > > > > attachment. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > > > ?????? ?? > > > > > > Joshua > > > > > > > > > >> Bloch > > > > > > > > > >> > > > > > > : > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > e5) { > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * > > seventh) { > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > > > >> > > > > > > > > > > > >Josh _________________________________________________________________ Hotmail: Powerful Free email with security by Microsoft. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: From dmytro_sheyko at hotmail.com Tue Jun 1 12:47:33 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Tue, 1 Jun 2010 19:47:33 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4C04F1A3.4040907@mail.ru> References: , , <4BF2AAEE.1040706@mail.ru>, <4BF3BFFD.8010007@mail.ru>,<4BF3C05C.7010300@mail.ru> , <4BF69AFB.8060406@mail.ru> , <4BFB716B.4020107@mail.ru> , <4BFD1021.1030404@mail.ru> , , <4C04F1A3.4040907@mail.ru> Message-ID: Hi Vladimir, > Which sorting algorithm we should use? > > 1. Network - compact, 9 lines of code > 2. Bubble - also compact, 10 lines of code > 3. Insertion - faster, but 39 lines of code I think that the gain is not worth the complexity. So, maybe, just leave it as it is. > Date: Tue, 1 Jun 2010 15:40:19 +0400 > From: iaroslavski at mail.ru > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > To: dmytro_sheyko at hotmail.com > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > Hi Dmytro, > > Very interesting investigation, thank you very much! > > I tried you suggested sorting network, but all versions work the same. > Then I used bubble sort (10 comparisons) and it shows better > results: on client it is faster on 0.2%, server - 0.8%, not too > much, but faster. > > The schema is (bubble sort with changes of direction): > [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > And moreover: if we use insertion sort for sorting of 5 candidates: > > int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > if (ae2 < a[e1]) { > a[e2] = a[e1]; a[e1] = ae2; > } > if (ae3 < a[e2]) { > if (ae3 < a[e1]) { > a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae3; > } else { > a[e3] = a[e2]; a[e2] = ae3; > } > } > if (ae4 < a[e2]) { > if (ae4 < a[e1]) { > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae4; > } else { > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae4; > } > } else { > if (ae4 < a[e3]) { > a[e4] = a[e3]; a[e3] = ae4; > } > } > if (ae5 < a[e2]) { > if (ae5 < a[e1]) { > a[e5]=a[e4];a[e4]=a[e3];a[e3]=a[e2];a[e2]=a[e1];a[e1]=ae5; > } else { > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae5; > } > } else { > if (ae5 < a[e3]) { > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = ae5; > } > else { > if (ae5 < a[e4]) { > a[e5] = a[e4]; a[e4] = ae5; > } > } > } > > it shows better results than bubble sort: > client - 0.37%, server - 1.03% > > Which sorting algorithm we should use? > > 1. Network - compact, 9 lines of code > 2. Bubble - also compact, 10 lines of code > 3. Insertion - faster, but 39 lines of code > > Regards, > Vladimir > > Dmytro Sheyko wrote: > > Corrections. > > 1. The sixth comparator in current network (that swaps with 90% > > probability) is [2 3] not [0 3]. > > 2. The average number of swaps are > > 576/120 = 4.8 for current network and > > 376/120 = 3.1(3...) for proposed network. > > > > ------------------------------------------------------------------------ > > From: dmytro_sheyko at hotmail.com > > To: iaroslavski at mail.ru; joshua.bloch at google.com > > Subject: RE: New portion of improvements for Dual-Pivot Quicksort > > Date: Tue, 1 Jun 2010 14:59:07 +0700 > > CC: core-libs-dev at openjdk.java.net > > > > Hi Vladimir, > > > > I cannot write 7-comparison sort briefly as well. However I think we can > > optimize sorting network a bit. > > We can consider such properties as > > 1. size, i.e. number of comparators > > 2. delay, i.e. number of parallel steps (some comparisons and swaps can > > be done concurrently) > > 3. average number of swaps. > > > > The current sorting network > > [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] > > has size 9 and delay 5. > > These values are good enough. Generally we cannot write it shorter (in > > order to improve size) and combine more than 2 comparison in a parallel > > step (in order to improve delay). > > > > However the average number of swaps seems too high. It performs 576 > > swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) > > I tried every permutation of 5 distinct values. > > There is a profile per comparator: > > (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] > > The first two comparison offer probability of swap as 50%, which is > > natural. However the sixth comparator (i.e. [0 3]) swaps with > > probability 90%, i.e. almost always! > > > > The one of the best sorting network (I have found) with the same size > > and delay is following > > [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] > > Its average number of swaps is 376. > > And here is a profile: > > (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] > > > > Regards, > > Dmytro Sheyko > > > > > Date: Wed, 26 May 2010 16:12:17 +0400 > > > From: iaroslavski at mail.ru > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > > > CC: core-libs-dev at openjdk.java.net > > > > > > Hello Dmytro, > > > > > > Theoretical investigations are based on simple model, > > > which doesn't take into account many optimizations > > > like "equal pivots", "scan equal to pivots", etc. > > > Model based on the implementation will be too complex > > > to be analyzed. > > > > > > But it is easy to count comparisons and assignments, > > > if I change them by functions with counter. > > > > > > Also I tried to write 7-comparison sort, but the code > > > was too long (a lot of inner if-then-else) instead of > > > 9 compact lines. Do you have suggestion how to implement > > > a nice 7-comparison sort? I tried also selection and bubble > > > sorts, but insertion sort shows better time. > > > > > > Josh, > > > Could you please review the last changes (especially javadoc > > > and comments)? > > > > > > Thank you, > > > Vladimir > > > > > > Dmytro Sheyko wrote: > > > > Hi Vladimir, > > > > > > > > As for me, everything seems good. > > > > > > > > Returning to the theoretical background, could you estimate number of > > > > comparison and assignments? These should be less than in your initial > > > > version. > > > > > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > > > candidates instead of 9-comparison sorting network? > > > > > > > > Thank you, > > > > Dmytro Sheyko > > > > > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > > > From: iaroslavski at mail.ru > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > To: dmytro_sheyko at hotmail.com > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > I added more comments, please, review attached version. > > > > > > > > > > >> So, we win 2-3% ! > > > > > > > > > > On [partial] sorted inputs new version runs more faster than few > > > > percents: > > > > > > > > > > organ pipes > > > > > this: 6896 > > > > > prev: 7424 > > > > > jdk7: 8018 > > > > > jdk6: 12502 > > > > > > > > > > ascendant > > > > > this: 2877 > > > > > prev: 3845 > > > > > jdk7: 4583 > > > > > jdk6: 9019 > > > > > > > > > > descendant > > > > > this: 3287 > > > > > prev: 4110 > > > > > jdk7: 4897 > > > > > jdk6: 9132 > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > That's great! Thank you. > > > > > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > > > From: iaroslavski at mail.ru > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > > > value (if any) or all leading negative" and with my optimization > > > > > > > for all types. I added two while loops before partitioning to > > > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > > > > > if (pivot1 != pivot2) { > > > > > > > /* ... */ > > > > > > > a[e2] = a[less]; > > > > > > > a[e4] = a[great]; > > > > > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > > > > > /* ... */ > > > > > > > outer: > > > > > > > for (int k = less; k <= great; k++) { > > > > > > > ... > > > > > > > } > > > > > > > > > > > > > > Here is benchmark result (in compare with quicksort from JDK 6): > > > > > > > > > > > > > > client server > > > > > > > ------ ------ > > > > > > > previous version: 60.70% 48.20% > > > > > > > current version: 57.22% 46.18% > > > > > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > > > > > Thank you, > > > > > > > Vladimir > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > > > modification. It > > > > > > > > appeared that number of negative zeros were changed during > > general > > > > > > sort. > > > > > > > > As I can see you already fixed this issue. Well, my > > > > modification was > > > > > > > > based on assumption that we can speed up eliminating > > explicit array > > > > > > > > range checks. > > > > > > > > However, such assumption is wrong because Hotspot anyway emits > > > > range > > > > > > > > checks at its discretion and therefore processZeros generally > > > > does not > > > > > > > > work as fast as I expected. > > > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > > > > > As for the latest code you posted. Doesn't it make sense to > > skip > > > > > > leading > > > > > > > > negative zeros before farther processing? In this case we avoid > > > > > > > > unnecessary assigning +0.0 and then -0.0 to the same > > location a[k] > > > > > > (i.e. > > > > > > > > where k == p). > > > > > > > > > > > > > > > > /* > > > > > > > > * Skip the last negative value (if any) or all leading negative > > > > > > > > zeros > > > > > > > > */ > > > > > > > > while (left <= right && Double.doubleToRawLongBits(a[left]) > > < 0) { > > > > > > > > left++; > > > > > > > > } > > > > > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > > > double ak = a[k]; > > > > > > > > if (ak != 0.0d) { > > > > > > > > return; > > > > > > > > } > > > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > > > a[k] = 0.0d; > > > > > > > > a[p++] = -0.0d; > > > > > > > > } > > > > > > > > } > > > > > > > > > > > > > > > > Thank you, > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > Quicksort > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did > > little bit > > > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code became > > > > > > > > > > consistent with main sort method and more compact. Also > > I use > > > > > > > > > > more usual "i--" and "i++" in for loops (instead of "--i", > > > > "++i. > > > > > > > > > > > > > > > > > > > > To accent the difference between float/double and other > > types, > > > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > > > */ > > > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > ..... > > > > > > > > > > */ > > > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > >> Vladimir, > > > > > > > > > >> > > > > > > > > > >> I can see that you changed > > sortNegZeroAndNaN(float[]...) but > > > > > > probably > > > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > > > >> > > > > > > > > > >> You really puzzled me with failed testcase and note that > > > > sorting > > > > > > > > > >> algorithm (without special attention to zeros) > > generally may > > > > > > change > > > > > > > > > >> number of negative zeros. > > > > > > > > > >> I will provide my comments later. > > > > > > > > > >> > > > > > > > > > >> As for counting sort, I think we should use single format > > > > > > style over > > > > > > > > > >> the file (unless we have valuable reason not to do > > this). I > > > > > > mean to > > > > > > > > > >> choose > > > > > > > > > >> 1) > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > >> return; > > > > > > > > > >> } > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > >> 2) > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > >> } else { > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > >> } > > > > > > > > > >> I prefer the second one. > > > > > > > > > >> > > > > > > > > > >> Thanks a lot, > > > > > > > > > >> Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > > > >> > Subject: Re: New portion of improvements for Dual-Pivot > > > > > > Quicksort > > > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > > > >> > > > > > > > > > > >> > Hello, > > > > > > > > > >> > > > > > > > > > > >> > I've run your modification for counting sort, it real > > > > faster. > > > > > > > > > >> > I attached new version with your changes (I did > > little bit > > > > > > > > > >> > format it) and included my case with float/double. > > > > > > > > > >> > > > > > > > > > > >> > Note that you modification doesn't pass test from > > > > Sorting class, > > > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > > > >> > > > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = > > 9, n = > > > > > > 10, p = 9 > > > > > > > > > >> > > > > > > > > > > >> > I suggest shorter method (which is based on your > > idea to > > > > skip > > > > > > > > counting > > > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > > > index (or > > > > > > > > it will > > > > > > > > > >> > be index of first positive element if no zeros at all, > > > > or last > > > > > > > > > >> negative, > > > > > > > > > >> > if no positive and zero elements) and then swap negative > > > > > > zero to the > > > > > > > > > >> > beginning of the sub-range. > > > > > > > > > >> > > > > > > > > > > >> > int hi = right; > > > > > > > > > >> > > > > > > > > > > >> > while (left < hi) { > > > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > > > >> > float middleValue = a[middle]; > > > > > > > > > >> > > > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > > > >> > left = middle + 1; > > > > > > > > > >> > } else { > > > > > > > > > >> > hi = middle; > > > > > > > > > >> > } > > > > > > > > > >> > } > > > > > > > > > >> > > > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > > > >> > float ak = a[k]; > > > > > > > > > >> > if (ak != 0.0f) { > > > > > > > > > >> > return; > > > > > > > > > >> > } > > > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > > > > > > > > >> > a[k] = +0.0f; > > > > > > > > > >> > a[p++] = -0.0f; > > > > > > > > > >> > } > > > > > > > > > >> > } > > > > > > > > > >> > > > > > > > > > > >> > Important note: in partitioning loop there are several > > > > places > > > > > > > > > >> > (marked by // !) where potential bug with -0.0 could be > > > > > > > > > >> > (when pivot and a[great] are zeros with different > > signs): > > > > > > > > > >> > > > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > >> > + a[less++] = a[great]; > > > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > > > >> > a[k] = a[great]; > > > > > > > > > >> > } > > > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > > > >> > + a[great--] = ak; > > > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > >> > + a[less++] = ak; > > > > > > > > > >> > } > > > > > > > > > >> > > > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > > > >> > > > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for all types > > > > > > > > > >> > and "pivot1 -> a[great]" in float/double sections only. > > > > > > > > > >> > > > > > > > > > > >> > Please, review format changes for counting sort and new > > > > version > > > > > > > > > >> > of Phase 3 for float/double. > > > > > > > > > >> > > > > > > > > > > >> > Thank you, > > > > > > > > > >> > Vladimir > > > > > > > > > >> > > > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > > > >> > > Hi, > > > > > > > > > >> > > > > > > > > > > > >> > > About counting sort again. > > > > > > > > > >> > > > > > > > > > > > >> > > 1. This condition "i < count.length && k <= right" is > > > > > > excessive. > > > > > > > > > >> Any one > > > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > > > >> > > 2. No need to calculate "short value = (short) (i + > > > > > > > > > >> Short.MIN_VALUE)" > > > > > > > > > >> > > when "count[i]" is zero. > > > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > > > better loop > > > > > > > > > >> backward. > > > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit > > looping > > > > > > earlier > > > > > > > > > >> > > assuming that typically we work with positive numbers. > > > > > > > > > >> > > For unsigned primitives (char) we would better loop > > > > forward > > > > > > > > because > > > > > > > > > >> > > typically we work with characters about zero (ASCII). > > > > > > > > > >> > > > > > > > > > > > >> > > - 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--) { > > > > > > > > > >> > > - a[k++] = value; > > > > > > > > > >> > > - } > > > > > > > > > >> > > - } > > > > > > > > > >> > > > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = toIndex - > > 1; k >= > > > > > > > > > >> > > fromIndex; --i) { > > > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > > > >> > > + int s = count[i]; > > > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > > > >> > > + } > > > > > > > > > >> > > > > > > > > > > > >> > > Thanks, > > > > > > > > > >> > > Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; > > iaroslavski at mail.ru > > > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > > > Dual-Pivot > > > > > > > > > >> Quicksort > > > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > > > >> > > > > > > > > > > > > >> > > > Sounds good! > > > > > > > > > >> > > > Will consider too... > > > > > > > > > >> > > > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? Dmytro > > Sheyko > > > > > > > > > >> > > : > > > > > > > > > >> > > > > > > > > > > > > >> > > > > Hi, > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > Regarding counting sort. We can check whether we > > > > should > > > > > > > > > >> switch to > > > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > > > Dual-Pivot > > > > > > > > > >> Quicksort > > > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run > > tests again > > > > > > > > with you > > > > > > > > > >> > > changes. > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > > > >> > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > > > >> > > > > > > Hello, > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > > > >> Double.doubleToLongBits and > > > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > > > Float.floatToIntBits. > > > > > > > > > >> > > > > > > No need to handle NaN's because they all are > > > > placed to > > > > > > > > > >> the end > > > > > > > > > >> > > of array. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > > > Long.MIN_VALUE and > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > > > Integer.MIN_VALUE. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more efficient > > > > (or at > > > > > > > > > >> least not > > > > > > > > > >> > > worse) > > > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > > > Float.floatToIntBits(ak)) > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && Float.floatToIntBits(ak) > > < 0) > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > > > negative zeros > > > > > > > > after > > > > > > > > > >> > > sorting. > > > > > > > > > >> > > > > > > General sorting algorithm puts both > > negative and > > > > > > positive > > > > > > > > > >> zeros > > > > > > > > > >> > > together > > > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > > > >> > > > > > > Therefore we have to process less elements > > because > > > > > > > > > >> usually we > > > > > > > > > >> > > have less > > > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; > > jjb at google.com > > > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of > > improvements for > > > > > > > > Dual-Pivot > > > > > > > > > >> > > Quicksort > > > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, review the > > > > changes. > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 ?????? ?? > > > > Dmytro > > > > > > Sheyko > > > > > > > > > >> > > > > > > : > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero using > > binary > > > > > > search) > > > > > > > > > >> over > > > > > > > > > >> > > C (Count > > > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > > > core-libs-dev at openjdk.java.net; > > > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > > > improvements for > > > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 +0400 > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested variants, and > > > > > > found that > > > > > > > > > >> case "C" > > > > > > > > > >> > > > > > > > > > (very interesting approach to find first > > > > > > position > > > > > > > > > >> of zero > > > > > > > > > >> > > > > > > > > > by counting negative elements) works > > > > slower than > > > > > > > > > >> original > > > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are very > > close > > > > > > to each > > > > > > > > > >> other > > > > > > > > > >> > > > > > > > > > and little bit faster than original. I > > > > > > prefer case > > > > > > > > > >> "F": > > > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do you > > agree? > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated DualPivotQuicksort > > > > file and > > > > > > > > > >> send it > > > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 ?????? > > > > ?? Dmytro > > > > > > > > > >> Sheyko > > > > > > > > > >> > > > > > > : > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > > > comments/proposals > > > > > > > > > >> regarding > > > > > > > > > >> > > dealing > > > > > > > > > >> > > > > > > with negative zeros. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero we can > > > > > > avoid range > > > > > > > > > >> check > > > > > > > > > >> > > (i >= > > > > > > > > > >> > > > > > > left) if we have at least one negative value. > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > > 09:04:19 2010 > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed > > May 12 > > > > > > 12:10:46 > > > > > > > > > >> 2010 > > > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > left, n); > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > left && > > > > > > a[i] == > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, left, n); > > > > > > > > > >> > > > > > > > > > > + > > > > > > > > > >> > > > > > > > > > > + // there is at least one negative > > > > value, so > > > > > > > > range > > > > > > > > > >> > > check is > > > > > > > > > >> > > > > > > not needed > > > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; /*i >= > > > > left &&*/ > > > > > > > > > >> a[i] == > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > + } > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > positive zeros > > > > > > > > back into > > > > > > > > > >> > > negative zeros > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of the > > first > > > > > > zero by > > > > > > > > > >> counting > > > > > > > > > >> > > > > > > negative values during preprocessing phase. > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > > 09:04:19 2010 > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed > > May 12 > > > > > > 12:01:24 > > > > > > > > > >> 2010 > > > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros > > and move > > > > > > NaNs to > > > > > > > > > >> end of > > > > > > > > > >> > > array. > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > > > numNegativeValues = 0; > > > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // i.e., ak > > is NaN > > > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > left, n); > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = numNegativeValues; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= > > left && > > > > > > a[i] == > > > > > > > > > >> 0.0f; > > > > > > > > > >> > > i--) { > > > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to find > > > > the first > > > > > > > > > >> zero and > > > > > > > > > >> > > thus > > > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java Tue May 11 > > > > > > > > 09:04:19 2010 > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed > > May 12 > > > > > > 12:03:58 > > > > > > > > > >> 2010 > > > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > left, n); > > > > > > > > > >> > > > > > > > > > > - > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > left && > > > > > > a[i] == > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > >> > > > > > > > > > > - } > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > > > left, n); > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > positive zeros > > > > > > > > back into > > > > > > > > > >> > > negative zeros > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = > > zeroIndex + > > > > > > > > > >> > > numNegativeZeros; i < > > > > > > > > > >> > > > > > > m; i++) { > > > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > > > element > > > > > > in the > > > > > > > > > >> > > specified > > > > > > > > > >> > > > > > > range via > > > > > > > > > >> > > > > > > > > > > + * Returns the index of the first > > zero > > > > > > element > > > > > > > > > >> in the > > > > > > > > > >> > > > > > > specified range via > > > > > > > > > >> > > > > > > > > > > * binary search. The range is assumed > > > > to be > > > > > > > > > >> sorted, and > > > > > > > > > >> > > must > > > > > > > > > >> > > > > > > contain > > > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > > > >> > > > > > > > > > > * > > > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > > > >> > > > > > > > > > > * @param low the index of the first > > > > element, > > > > > > > > > >> inclusive, > > > > > > > > > >> > > to be > > > > > > > > > >> > > > > > > searched > > > > > > > > > >> > > > > > > > > > > * @param high the index of the last > > > > element, > > > > > > > > > >> inclusive, > > > > > > > > > >> > > to be > > > > > > > > > >> > > > > > > searched > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > >> > > > > > > > > > > - private static int > > > > findAnyZero(float[] a, > > > > > > > > int low, > > > > > > > > > >> > > int high) { > > > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > > > >> > > > > > > > > > > + private static int > > > > findFirstZero(float[] > > > > > > a, int > > > > > > > > > >> low, > > > > > > > > > >> > > int high) { > > > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values appeared more > > > > > > expensive > > > > > > > > > >> than > > > > > > > > > >> > > any other > > > > > > > > > >> > > > > > > variants. > > > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > > > efficient > > > > > > as the > > > > > > > > > >> current > > > > > > > > > >> > > > > > > solution is in its worst case - when we have > > > > only one > > > > > > > > > >> negative > > > > > > > > > >> > > zero (in > > > > > > > > > >> > > > > > > the half of array). > > > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > > > have many > > > > > > > > zeros. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > > > dmytro_sheyko at hotmail.com > > > > > > > > > >> > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > > > >> iaroslavski at mail.ru > > > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > > > improvements for > > > > > > > > > >> > > Dual-Pivot > > > > > > > > > >> > > > > > > Quicksort > > > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 23:51:27 +0400 > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly testing > > > > "great - > > > > > > > > > >> less > 5 * > > > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > > > >> > > > > > > > > > > > and found that more symmetric code > > > > "less > > > > > > < e1 && > > > > > > > > > >> > > great > e5" > > > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has not been > > > > > > changed. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest version in > > > > > > attachment. > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > > > ?????? ?? > > > > > > Joshua > > > > > > > > > >> Bloch > > > > > > > > > >> > > > > > > : > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > e5) { > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * > > seventh) { > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > > > >> > > > > > > > > > > > >Josh _________________________________________________________________ Hotmail: Trusted email with powerful SPAM protection. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: From alan.bateman at oracle.com Tue Jun 1 14:20:06 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Tue, 01 Jun 2010 14:20:06 +0000 Subject: hg: jdk7/tl/corba: 5 new changesets Message-ID: <20100601142010.C03DC46EAB@hg.openjdk.java.net> Changeset: 91006f157c46 Author: ohair Date: 2010-05-25 15:52 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/91006f157c46 6943119: Rebrand source copyright notices Reviewed-by: darcy ! make/Makefile ! make/com/Makefile ! make/com/sun/Makefile ! make/com/sun/corba/Makefile ! make/com/sun/corba/minclude/com_sun_corba_se_PortableActivationIDL.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_activation.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_corba.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_core.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_dynamicany.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_encoding.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_interceptors.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_io.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_ior.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_legacy.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_logging.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_monitoring.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_naming_cosnaming.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_naming_namingutil.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_naming_pcosnaming.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_oa_poa.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_oa_toa.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_orb.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_orbutil.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_presentation_rmi.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_protocol.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_resolver.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_transport.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_impl_util.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_internal_LegacyFiles.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_pept.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_activation.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_copyobject.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_encoding.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_extension.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_ior.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_legacy_connection.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_legacy_interceptor.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_logging.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_monitoring.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_oa.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_orb.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_orbutil.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_presentation_rmi.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_protocol.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_resolver.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_servicecontext.jmk ! make/com/sun/corba/minclude/com_sun_corba_se_spi_transport.jmk ! make/com/sun/corba/minclude/com_sun_tools_corba_se_idl_toJavaPortable.jmk ! make/com/sun/corba/minclude/ioser_io.jmk ! make/com/sun/corba/minclude/javax_activity.jmk ! make/com/sun/corba/minclude/javax_rmi.jmk ! make/com/sun/corba/minclude/javax_rmi_CORBA.jmk ! make/com/sun/corba/minclude/javax_transaction.jmk ! make/com/sun/corba/minclude/org_omg_CORBA.jmk ! make/com/sun/corba/minclude/org_omg_CORBAX.jmk ! make/com/sun/corba/minclude/org_omg_CORBA_2_3.jmk ! make/com/sun/corba/minclude/org_omg_CosNaming.jmk ! make/com/sun/corba/minclude/org_omg_DynamicAny.jmk ! make/com/sun/corba/minclude/org_omg_IOP.jmk ! make/com/sun/corba/minclude/org_omg_Messaging.jmk ! make/com/sun/corba/minclude/org_omg_PortableInterceptor.jmk ! make/com/sun/corba/minclude/org_omg_PortableServer.jmk ! make/com/sun/corba/minclude/org_omg_SendingContext.jmk ! make/com/sun/corba/minclude/sun_corba.jmk ! make/com/sun/corba/se/Makefile ! make/com/sun/corba/se/PortableActivationIDL/Makefile ! make/com/sun/corba/se/connection/FILES_java.gmk ! make/com/sun/corba/se/connection/Makefile ! make/com/sun/corba/se/core/Makefile ! make/com/sun/corba/se/corespi/Makefile ! make/com/sun/corba/se/impl/Makefile ! make/com/sun/corba/se/impl/activation/Makefile ! make/com/sun/corba/se/impl/activation/orbd/Makefile ! make/com/sun/corba/se/impl/activation/servertool/Makefile ! make/com/sun/corba/se/impl/interceptors/Makefile ! make/com/sun/corba/se/impl/logging/Makefile ! make/com/sun/corba/se/impl/monitoring/Makefile ! make/com/sun/corba/se/impl/naming/Makefile ! make/com/sun/corba/se/impl/naming/cosnaming/Makefile ! make/com/sun/corba/se/impl/naming/namingutil/Makefile ! make/com/sun/corba/se/impl/naming/pcosnaming/Makefile ! make/com/sun/corba/se/impl/oa/Makefile ! make/com/sun/corba/se/impl/oa/poa/Makefile ! make/com/sun/corba/se/impl/oa/toa/Makefile ! make/com/sun/corba/se/interceptor/FILES_java.gmk ! make/com/sun/corba/se/interceptor/Makefile ! make/com/sun/corba/se/pept/Makefile ! make/com/sun/corba/se/rmi/Makefile ! make/com/sun/corba/se/rmi/rmic/Makefile ! make/com/sun/corba/se/rmi/rmic/SUN_RMI_RMIC_IIOP_java.gmk ! make/com/sun/corba/se/sources/Makefile ! make/com/sun/corba/se/spi/Makefile ! make/com/sun/corba/se/spi/activation/Makefile ! make/com/sun/corba/se/spi/copyobject/Makefile ! make/com/sun/corba/se/spi/encoding/Makefile ! make/com/sun/corba/se/spi/extension/Makefile ! make/com/sun/corba/se/spi/legacy/Makefile ! make/com/sun/corba/se/spi/legacy/connection/Makefile ! make/com/sun/corba/se/spi/legacy/interceptor/Makefile ! make/com/sun/corba/se/spi/logging/Makefile ! make/com/sun/corba/se/spi/monitoring/Makefile ! make/common/BuildToolJar.gmk ! make/common/CancelImplicits.gmk ! make/common/Classes.gmk ! make/common/Defs-linux.gmk ! make/common/Defs-solaris.gmk ! make/common/Defs-windows.gmk ! make/common/Defs.gmk ! make/common/Library.gmk ! make/common/Mapfile-vers.gmk ! make/common/Rules.gmk ! make/common/internal/NativeCompileRules.gmk ! make/common/internal/Resources.gmk ! make/common/shared/Compiler-gcc.gmk ! make/common/shared/Compiler-msvc.gmk ! make/common/shared/Compiler-sun.gmk ! make/common/shared/Compiler.gmk ! make/common/shared/Defs-java.gmk ! make/common/shared/Defs-linux.gmk ! make/common/shared/Defs-solaris.gmk ! make/common/shared/Defs-utils.gmk ! make/common/shared/Defs-windows.gmk ! make/common/shared/Defs.gmk ! make/common/shared/Platform.gmk ! make/javax/Makefile ! make/javax/xa/Makefile ! make/jprt.properties ! make/org/Makefile ! make/org/omg/CORBA/Makefile ! make/org/omg/CORBAX_java.gmk ! make/org/omg/CosNaming/Makefile ! make/org/omg/DynamicAny/Makefile ! make/org/omg/Makefile ! make/org/omg/PortableInterceptor/Makefile ! make/org/omg/PortableServer/Makefile ! make/org/omg/idl/FILES_java.gmk ! make/org/omg/idl/Makefile ! make/org/omg/sources/Makefile ! make/sun/Makefile ! make/sun/corba/Makefile ! make/sun/corba/org/Makefile ! make/sun/corba/org/omg/FILES_java.gmk ! make/sun/corba/org/omg/Makefile ! make/sun/rmi/Makefile ! make/sun/rmi/corbalogcompile/Makefile ! make/sun/rmi/corbalogsources/Makefile ! make/sun/rmi/rmic/FILES.gmk ! make/sun/rmi/rmic/Makefile ! make/tools/Makefile ! make/tools/idlj/Makefile ! make/tools/logutil/Makefile ! make/tools/src/build/tools/stripproperties/StripProperties.java ! make/tools/strip_properties/Makefile ! src/share/classes/com/sun/corba/se/GiopIDL/GIOP.idl ! src/share/classes/com/sun/corba/se/GiopIDL/messages.idl ! src/share/classes/com/sun/corba/se/PortableActivationIDL/activation.idl ! src/share/classes/com/sun/corba/se/impl/activation/CommandHandler.java ! src/share/classes/com/sun/corba/se/impl/activation/NameServiceStartThread.java ! src/share/classes/com/sun/corba/se/impl/activation/ORBD.java ! src/share/classes/com/sun/corba/se/impl/activation/ProcessMonitorThread.java ! src/share/classes/com/sun/corba/se/impl/activation/RepositoryImpl.java ! src/share/classes/com/sun/corba/se/impl/activation/ServerMain.java ! src/share/classes/com/sun/corba/se/impl/activation/ServerManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/activation/ServerTableEntry.java ! src/share/classes/com/sun/corba/se/impl/activation/ServerTool.java ! src/share/classes/com/sun/corba/se/impl/copyobject/CopierManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/copyobject/FallbackObjectCopierImpl.java ! src/share/classes/com/sun/corba/se/impl/copyobject/JavaInputStream.sjava ! src/share/classes/com/sun/corba/se/impl/copyobject/JavaOutputStream.sjava ! src/share/classes/com/sun/corba/se/impl/copyobject/JavaStreamObjectCopierImpl.java ! src/share/classes/com/sun/corba/se/impl/copyobject/ORBStreamObjectCopierImpl.java ! src/share/classes/com/sun/corba/se/impl/copyobject/ReferenceObjectCopierImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/AnyImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/AnyImplHelper.java ! src/share/classes/com/sun/corba/se/impl/corba/AsynchInvoke.java ! src/share/classes/com/sun/corba/se/impl/corba/CORBAObjectImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/ContextImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/ContextListImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/EnvironmentImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/ExceptionListImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/NVListImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/NamedValueImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/PrincipalImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/RequestImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/ServerRequestImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/TCUtility.java ! src/share/classes/com/sun/corba/se/impl/corba/TypeCodeFactory.java ! src/share/classes/com/sun/corba/se/impl/corba/TypeCodeImpl.java ! src/share/classes/com/sun/corba/se/impl/corba/TypeCodeImplHelper.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynAnyBasicImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynAnyCollectionImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynAnyComplexImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynAnyConstructedImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynAnyFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynAnyImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynAnyUtil.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynArrayImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynEnumImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynFixedImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynSequenceImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynStructImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynUnionImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynValueBoxImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynValueCommonImpl.java ! src/share/classes/com/sun/corba/se/impl/dynamicany/DynValueImpl.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerFactory.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerRead.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerReadGrow.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerReadStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerWrite.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerWriteCollect.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerWriteGrow.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferManagerWriteStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/BufferQueue.java ! src/share/classes/com/sun/corba/se/impl/encoding/ByteBufferWithInfo.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDRInputObject.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDRInputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDRInputStreamBase.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDRInputStream_1_0.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDRInputStream_1_1.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDRInputStream_1_2.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDROutputObject.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDROutputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDROutputStreamBase.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDROutputStream_1_0.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDROutputStream_1_1.java ! src/share/classes/com/sun/corba/se/impl/encoding/CDROutputStream_1_2.java ! src/share/classes/com/sun/corba/se/impl/encoding/CachedCodeBase.java ! src/share/classes/com/sun/corba/se/impl/encoding/CodeSetCache.java ! src/share/classes/com/sun/corba/se/impl/encoding/CodeSetComponentInfo.java ! src/share/classes/com/sun/corba/se/impl/encoding/CodeSetConversion.java ! src/share/classes/com/sun/corba/se/impl/encoding/EncapsInputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/EncapsOutputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/IDLJavaSerializationInputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/IDLJavaSerializationOutputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/MarkAndResetHandler.java ! src/share/classes/com/sun/corba/se/impl/encoding/MarshalInputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/MarshalOutputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/OSFCodeSetRegistry.java ! src/share/classes/com/sun/corba/se/impl/encoding/RestorableInputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/TypeCodeInputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/TypeCodeOutputStream.java ! src/share/classes/com/sun/corba/se/impl/encoding/TypeCodeReader.java ! src/share/classes/com/sun/corba/se/impl/encoding/WrapperInputStream.java ! src/share/classes/com/sun/corba/se/impl/interceptors/CDREncapsCodec.java ! src/share/classes/com/sun/corba/se/impl/interceptors/ClientRequestInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/CodecFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/IORInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/InterceptorInvoker.java ! src/share/classes/com/sun/corba/se/impl/interceptors/InterceptorList.java ! src/share/classes/com/sun/corba/se/impl/interceptors/ORBInitInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/PICurrent.java ! src/share/classes/com/sun/corba/se/impl/interceptors/PIHandlerImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/PINoOpHandlerImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/RequestInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/ServerRequestInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/interceptors/SlotTable.java ! src/share/classes/com/sun/corba/se/impl/interceptors/SlotTableStack.java ! src/share/classes/com/sun/corba/se/impl/interceptors/ThreadCurrentStack.sjava ! src/share/classes/com/sun/corba/se/impl/io/FVDCodeBaseImpl.java ! src/share/classes/com/sun/corba/se/impl/io/IIOPInputStream.java ! src/share/classes/com/sun/corba/se/impl/io/IIOPOutputStream.java ! src/share/classes/com/sun/corba/se/impl/io/InputStreamHook.java ! src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClass.java ! src/share/classes/com/sun/corba/se/impl/io/ObjectStreamClassCorbaExt.java ! src/share/classes/com/sun/corba/se/impl/io/ObjectStreamField.java ! src/share/classes/com/sun/corba/se/impl/io/OptionalDataException.java ! src/share/classes/com/sun/corba/se/impl/io/OutputStreamHook.java ! src/share/classes/com/sun/corba/se/impl/io/TypeMismatchException.java ! src/share/classes/com/sun/corba/se/impl/io/ValueHandlerImpl.java ! src/share/classes/com/sun/corba/se/impl/io/ValueUtility.java ! src/share/classes/com/sun/corba/se/impl/ior/ByteBuffer.java ! src/share/classes/com/sun/corba/se/impl/ior/EncapsulationUtility.java ! src/share/classes/com/sun/corba/se/impl/ior/FreezableList.java ! src/share/classes/com/sun/corba/se/impl/ior/GenericIdentifiable.java ! src/share/classes/com/sun/corba/se/impl/ior/GenericTaggedComponent.java ! src/share/classes/com/sun/corba/se/impl/ior/GenericTaggedProfile.java ! src/share/classes/com/sun/corba/se/impl/ior/IORImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/IORTemplateImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/IORTemplateListImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/IdentifiableFactoryFinderBase.java ! src/share/classes/com/sun/corba/se/impl/ior/JIDLObjectKeyTemplate.java ! src/share/classes/com/sun/corba/se/impl/ior/NewObjectKeyTemplateBase.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectAdapterIdArray.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectAdapterIdBase.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectAdapterIdNumber.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectIdImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectKeyFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectKeyImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectKeyTemplateBase.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectReferenceFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectReferenceProducerBase.java ! src/share/classes/com/sun/corba/se/impl/ior/ObjectReferenceTemplateImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/OldJIDLObjectKeyTemplate.java ! src/share/classes/com/sun/corba/se/impl/ior/OldObjectKeyTemplateBase.java ! src/share/classes/com/sun/corba/se/impl/ior/OldPOAObjectKeyTemplate.java ! src/share/classes/com/sun/corba/se/impl/ior/POAObjectKeyTemplate.java ! src/share/classes/com/sun/corba/se/impl/ior/StubIORImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/TaggedComponentFactoryFinderImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/TaggedProfileFactoryFinderImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/TaggedProfileTemplateFactoryFinderImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/WireObjectKeyTemplate.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/AlternateIIOPAddressComponentImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/CodeSetsComponentImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/IIOPAddressBase.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/IIOPAddressClosureImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/IIOPAddressImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/IIOPProfileImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/IIOPProfileTemplateImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/JavaCodebaseComponentImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/JavaSerializationComponent.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/MaxStreamFormatVersionComponentImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/ORBTypeComponentImpl.java ! src/share/classes/com/sun/corba/se/impl/ior/iiop/RequestPartitioningComponentImpl.java ! src/share/classes/com/sun/corba/se/impl/javax/rmi/CORBA/StubDelegateImpl.java ! src/share/classes/com/sun/corba/se/impl/javax/rmi/CORBA/Util.java ! src/share/classes/com/sun/corba/se/impl/javax/rmi/PortableRemoteObject.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/DefaultSocketFactory.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/EndPointInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/LegacyServerSocketManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/SocketFactoryAcceptorImpl.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/SocketFactoryConnectionImpl.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/SocketFactoryContactInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/SocketFactoryContactInfoListImpl.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/SocketFactoryContactInfoListIteratorImpl.java ! src/share/classes/com/sun/corba/se/impl/legacy/connection/USLPort.java ! src/share/classes/com/sun/corba/se/impl/monitoring/MonitoredAttributeInfoFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/monitoring/MonitoredAttributeInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/monitoring/MonitoredObjectFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/monitoring/MonitoredObjectImpl.java ! src/share/classes/com/sun/corba/se/impl/monitoring/MonitoringManagerFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/monitoring/MonitoringManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/BindingIteratorImpl.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/InterOperableNamingImpl.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/InternalBindingKey.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/InternalBindingValue.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/NamingContextDataStore.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/NamingContextImpl.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/NamingUtils.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/TransientBindingIterator.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/TransientNameServer.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/TransientNameService.java ! src/share/classes/com/sun/corba/se/impl/naming/cosnaming/TransientNamingContext.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/CorbalocURL.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/CorbanameURL.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/IIOPEndpointInfo.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/INSURL.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/INSURLBase.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/INSURLHandler.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/NamingConstants.java ! src/share/classes/com/sun/corba/se/impl/naming/namingutil/Utility.java ! src/share/classes/com/sun/corba/se/impl/naming/pcosnaming/InternalBindingKey.java ! src/share/classes/com/sun/corba/se/impl/naming/pcosnaming/InternalBindingValue.java ! src/share/classes/com/sun/corba/se/impl/naming/pcosnaming/NameServer.java ! src/share/classes/com/sun/corba/se/impl/naming/pcosnaming/NameService.java ! src/share/classes/com/sun/corba/se/impl/naming/pcosnaming/NamingContextImpl.java ! src/share/classes/com/sun/corba/se/impl/naming/pcosnaming/PersistentBindingIterator.java ! src/share/classes/com/sun/corba/se/impl/naming/pcosnaming/ServantManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/NullServantImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/AOMEntry.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/ActiveObjectMap.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/BadServerIdHandler.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/DelegateImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/IdAssignmentPolicyImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/IdUniquenessPolicyImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/ImplicitActivationPolicyImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/LifespanPolicyImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POACurrent.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAFactory.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediator.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorBase.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorBase_R.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorFactory.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_NR_UDS.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_NR_USM.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_R_AOM.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_R_UDS.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/POAPolicyMediatorImpl_R_USM.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/Policies.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/RequestProcessingPolicyImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/ServantRetentionPolicyImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/poa/ThreadPolicyImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/toa/TOA.java ! src/share/classes/com/sun/corba/se/impl/oa/toa/TOAFactory.java ! src/share/classes/com/sun/corba/se/impl/oa/toa/TOAImpl.java ! src/share/classes/com/sun/corba/se/impl/oa/toa/TransientObjectManager.java ! src/share/classes/com/sun/corba/se/impl/orb/AppletDataCollector.java ! src/share/classes/com/sun/corba/se/impl/orb/DataCollectorBase.java ! src/share/classes/com/sun/corba/se/impl/orb/DataCollectorFactory.java ! src/share/classes/com/sun/corba/se/impl/orb/NormalDataCollector.java ! src/share/classes/com/sun/corba/se/impl/orb/NormalParserAction.java ! src/share/classes/com/sun/corba/se/impl/orb/NormalParserData.java ! src/share/classes/com/sun/corba/se/impl/orb/ORBConfiguratorImpl.java ! src/share/classes/com/sun/corba/se/impl/orb/ORBDataParserImpl.java ! src/share/classes/com/sun/corba/se/impl/orb/ORBImpl.java ! src/share/classes/com/sun/corba/se/impl/orb/ORBSingleton.java ! src/share/classes/com/sun/corba/se/impl/orb/ORBVersionImpl.java ! src/share/classes/com/sun/corba/se/impl/orb/ParserAction.java ! src/share/classes/com/sun/corba/se/impl/orb/ParserActionBase.java ! src/share/classes/com/sun/corba/se/impl/orb/ParserActionFactory.java ! src/share/classes/com/sun/corba/se/impl/orb/ParserDataBase.java ! src/share/classes/com/sun/corba/se/impl/orb/ParserTable.java ! src/share/classes/com/sun/corba/se/impl/orb/PrefixParserAction.java ! src/share/classes/com/sun/corba/se/impl/orb/PrefixParserData.java ! src/share/classes/com/sun/corba/se/impl/orb/PropertyOnlyDataCollector.java ! src/share/classes/com/sun/corba/se/impl/orbutil/CacheTable.java ! src/share/classes/com/sun/corba/se/impl/orbutil/CorbaResourceUtil.java ! src/share/classes/com/sun/corba/se/impl/orbutil/DenseIntMapImpl.java ! src/share/classes/com/sun/corba/se/impl/orbutil/GetPropertyAction.java ! src/share/classes/com/sun/corba/se/impl/orbutil/HexOutputStream.java ! src/share/classes/com/sun/corba/se/impl/orbutil/IIOPInputStream_1_3.java ! src/share/classes/com/sun/corba/se/impl/orbutil/IIOPInputStream_1_3_1.java ! src/share/classes/com/sun/corba/se/impl/orbutil/IIOPOutputStream_1_3.java ! src/share/classes/com/sun/corba/se/impl/orbutil/IIOPOutputStream_1_3_1.java ! src/share/classes/com/sun/corba/se/impl/orbutil/LegacyHookGetFields.java ! src/share/classes/com/sun/corba/se/impl/orbutil/LegacyHookPutFields.java ! src/share/classes/com/sun/corba/se/impl/orbutil/LogKeywords.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ORBClassLoader.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ORBConstants.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ORBUtility.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClassUtil_1_3.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamClass_1_3_1.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ObjectStreamField.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ObjectUtility.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ObjectWriter.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepIdDelegator.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepIdDelegator_1_3.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepIdDelegator_1_3_1.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryIdCache_1_3.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryIdCache_1_3_1.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryIdFactory.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryIdInterface.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryIdStrings.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryIdUtility.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryId_1_3.java ! src/share/classes/com/sun/corba/se/impl/orbutil/RepositoryId_1_3_1.java ! src/share/classes/com/sun/corba/se/impl/orbutil/StackImpl.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ValueHandlerImpl_1_3.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ValueHandlerImpl_1_3_1.java ! src/share/classes/com/sun/corba/se/impl/orbutil/closure/Constant.java ! src/share/classes/com/sun/corba/se/impl/orbutil/closure/Future.java ! src/share/classes/com/sun/corba/se/impl/orbutil/concurrent/CondVar.java ! src/share/classes/com/sun/corba/se/impl/orbutil/concurrent/DebugMutex.java ! src/share/classes/com/sun/corba/se/impl/orbutil/concurrent/Mutex.java ! src/share/classes/com/sun/corba/se/impl/orbutil/concurrent/ReentrantMutex.java ! src/share/classes/com/sun/corba/se/impl/orbutil/concurrent/Sync.java ! src/share/classes/com/sun/corba/se/impl/orbutil/concurrent/SyncUtil.java ! src/share/classes/com/sun/corba/se/impl/orbutil/fsm/GuardedAction.java ! src/share/classes/com/sun/corba/se/impl/orbutil/fsm/NameBase.java ! src/share/classes/com/sun/corba/se/impl/orbutil/fsm/StateEngineImpl.java ! src/share/classes/com/sun/corba/se/impl/orbutil/graph/Graph.java ! src/share/classes/com/sun/corba/se/impl/orbutil/graph/GraphImpl.java ! src/share/classes/com/sun/corba/se/impl/orbutil/graph/Node.java ! src/share/classes/com/sun/corba/se/impl/orbutil/graph/NodeData.java ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_de.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_es.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_fr.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_it.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_ja.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_ko.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_sv.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_CN.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/resources/sunorb_zh_TW.properties ! src/share/classes/com/sun/corba/se/impl/orbutil/threadpool/ThreadPoolImpl.java ! src/share/classes/com/sun/corba/se/impl/orbutil/threadpool/ThreadPoolManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/orbutil/threadpool/TimeoutException.java ! src/share/classes/com/sun/corba/se/impl/orbutil/threadpool/WorkQueueImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/DynamicAccessPermission.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/DynamicMethodMarshallerImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/DynamicStubImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/ExceptionHandler.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/ExceptionHandlerImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLNameTranslatorImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLNameTranslatorImpl_save.sjava ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLType.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLTypeException.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/IDLTypesUtil.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/InvocationHandlerFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/PresentationManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/ReflectiveTie.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubConnectImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryBase.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryDynamicBase.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryBase.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryDynamicBase.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryProxyImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryFactoryStaticImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryProxyImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubFactoryStaticImpl.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/StubInvocationHandlerImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/AddressingDispositionException.java ! src/share/classes/com/sun/corba/se/impl/protocol/BootstrapServerRequestDispatcher.java ! src/share/classes/com/sun/corba/se/impl/protocol/CorbaClientDelegateImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/CorbaClientRequestDispatcherImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/CorbaInvocationInfo.java ! src/share/classes/com/sun/corba/se/impl/protocol/CorbaMessageMediatorImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/CorbaServerRequestDispatcherImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/FullServantCacheLocalCRDImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/INSServerRequestDispatcher.java ! src/share/classes/com/sun/corba/se/impl/protocol/InfoOnlyServantCacheLocalCRDImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/JIDLLocalCRDImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/LocalClientRequestDispatcherBase.java ! src/share/classes/com/sun/corba/se/impl/protocol/MinimalServantCacheLocalCRDImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/NotLocalLocalCRDImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/POALocalCRDImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/RequestCanceledException.java ! src/share/classes/com/sun/corba/se/impl/protocol/RequestDispatcherRegistryImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/ServantCacheLocalCRDBase.java ! src/share/classes/com/sun/corba/se/impl/protocol/SharedCDRClientRequestDispatcherImpl.java ! src/share/classes/com/sun/corba/se/impl/protocol/SpecialMethod.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/AddressingDispositionHelper.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage_1_0.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage_1_1.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/CancelRequestMessage_1_2.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/FragmentMessage.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/FragmentMessage_1_1.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/FragmentMessage_1_2.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/IORAddressingInfo.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/IORAddressingInfoHelper.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/KeyAddr.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage_1_0.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage_1_1.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyMessage_1_2.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateReplyOrReplyMessage.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage_1_0.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage_1_1.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/LocateRequestMessage_1_2.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/Message.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/MessageBase.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/MessageHandler.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/Message_1_0.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/Message_1_1.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/Message_1_2.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/ProfileAddr.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/ReferenceAddr.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage_1_0.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage_1_1.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/ReplyMessage_1_2.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage_1_0.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage_1_1.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/RequestMessage_1_2.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/TargetAddress.java ! src/share/classes/com/sun/corba/se/impl/protocol/giopmsgheaders/TargetAddressHelper.java ! src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientRequestImpl.sjava ! src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalClientResponseImpl.sjava ! src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerRequestImpl.sjava ! src/share/classes/com/sun/corba/se/impl/protocol/oldlocal/LocalServerResponseImpl.sjava ! src/share/classes/com/sun/corba/se/impl/resolver/BootstrapResolverImpl.java ! src/share/classes/com/sun/corba/se/impl/resolver/CompositeResolverImpl.java ! src/share/classes/com/sun/corba/se/impl/resolver/FileResolverImpl.java ! src/share/classes/com/sun/corba/se/impl/resolver/INSURLOperationImpl.java ! src/share/classes/com/sun/corba/se/impl/resolver/LocalResolverImpl.java ! src/share/classes/com/sun/corba/se/impl/resolver/ORBDefaultInitRefResolverImpl.java ! src/share/classes/com/sun/corba/se/impl/resolver/ORBInitRefResolverImpl.java ! src/share/classes/com/sun/corba/se/impl/resolver/SplitLocalResolverImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/BufferConnectionImpl.sjava ! src/share/classes/com/sun/corba/se/impl/transport/ByteBufferPoolImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaConnectionCacheBase.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaContactInfoBase.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaContactInfoListImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaContactInfoListIteratorImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaInboundConnectionCacheImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaOutboundConnectionCacheImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaResponseWaitingRoomImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/CorbaTransportManagerImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/DefaultIORToSocketInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/DefaultSocketFactoryImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/EventHandlerBase.java ! src/share/classes/com/sun/corba/se/impl/transport/ListenerThreadImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/ReadTCPTimeoutsImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/ReaderThreadImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/SelectorImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/SharedCDRContactInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelAcceptorImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelConnectionImpl.java ! src/share/classes/com/sun/corba/se/impl/transport/SocketOrChannelContactInfoImpl.java ! src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java ! src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEnumerator.java ! src/share/classes/com/sun/corba/se/impl/util/JDKBridge.java ! src/share/classes/com/sun/corba/se/impl/util/JDKClassLoader.java ! src/share/classes/com/sun/corba/se/impl/util/ORBProperties.java ! src/share/classes/com/sun/corba/se/impl/util/PackagePrefixChecker.java ! src/share/classes/com/sun/corba/se/impl/util/RepositoryId.java ! src/share/classes/com/sun/corba/se/impl/util/RepositoryIdCache.java ! src/share/classes/com/sun/corba/se/impl/util/SUNVMCID.java ! src/share/classes/com/sun/corba/se/impl/util/Utility.java ! src/share/classes/com/sun/corba/se/impl/util/Version.java ! src/share/classes/com/sun/corba/se/internal/CosNaming/BootstrapServer.java ! src/share/classes/com/sun/corba/se/internal/Interceptors/PIORB.java ! src/share/classes/com/sun/corba/se/internal/POA/POAORB.java ! src/share/classes/com/sun/corba/se/internal/corba/ORBSingleton.java ! src/share/classes/com/sun/corba/se/internal/iiop/ORB.java ! src/share/classes/com/sun/corba/se/org/omg/CORBA/ORB.java ! src/share/classes/com/sun/corba/se/pept/broker/Broker.java ! src/share/classes/com/sun/corba/se/pept/encoding/InputObject.java ! src/share/classes/com/sun/corba/se/pept/encoding/OutputObject.java ! src/share/classes/com/sun/corba/se/pept/package.html ! src/share/classes/com/sun/corba/se/pept/protocol/ClientDelegate.java ! src/share/classes/com/sun/corba/se/pept/protocol/ClientInvocationInfo.java ! src/share/classes/com/sun/corba/se/pept/protocol/ClientRequestDispatcher.java ! src/share/classes/com/sun/corba/se/pept/protocol/MessageMediator.java ! src/share/classes/com/sun/corba/se/pept/protocol/ProtocolHandler.java ! src/share/classes/com/sun/corba/se/pept/protocol/ServerRequestDispatcher.java ! src/share/classes/com/sun/corba/se/pept/transport/Acceptor.java ! src/share/classes/com/sun/corba/se/pept/transport/ByteBufferPool.java ! src/share/classes/com/sun/corba/se/pept/transport/Connection.java ! src/share/classes/com/sun/corba/se/pept/transport/ConnectionCache.java ! src/share/classes/com/sun/corba/se/pept/transport/ContactInfo.java ! src/share/classes/com/sun/corba/se/pept/transport/ContactInfoList.java ! src/share/classes/com/sun/corba/se/pept/transport/ContactInfoListIterator.java ! src/share/classes/com/sun/corba/se/pept/transport/EventHandler.java ! src/share/classes/com/sun/corba/se/pept/transport/InboundConnectionCache.java ! src/share/classes/com/sun/corba/se/pept/transport/ListenerThread.java ! src/share/classes/com/sun/corba/se/pept/transport/OutboundConnectionCache.java ! src/share/classes/com/sun/corba/se/pept/transport/ReaderThread.java ! src/share/classes/com/sun/corba/se/pept/transport/ResponseWaitingRoom.java ! src/share/classes/com/sun/corba/se/pept/transport/Selector.java ! src/share/classes/com/sun/corba/se/pept/transport/TransportManager.java ! src/share/classes/com/sun/corba/se/spi/activation/activation.idl ! src/share/classes/com/sun/corba/se/spi/copyobject/CopierManager.java ! src/share/classes/com/sun/corba/se/spi/copyobject/CopyobjectDefaults.java ! src/share/classes/com/sun/corba/se/spi/copyobject/ObjectCopier.java ! src/share/classes/com/sun/corba/se/spi/copyobject/ObjectCopierFactory.java ! src/share/classes/com/sun/corba/se/spi/copyobject/ReflectiveCopyException.java ! src/share/classes/com/sun/corba/se/spi/encoding/CorbaInputObject.java ! src/share/classes/com/sun/corba/se/spi/encoding/CorbaOutputObject.java ! src/share/classes/com/sun/corba/se/spi/extension/CopyObjectPolicy.java ! src/share/classes/com/sun/corba/se/spi/extension/RequestPartitioningPolicy.java ! src/share/classes/com/sun/corba/se/spi/extension/ServantCachingPolicy.java ! src/share/classes/com/sun/corba/se/spi/extension/ZeroPortPolicy.java ! src/share/classes/com/sun/corba/se/spi/ior/EncapsulationFactoryBase.java ! src/share/classes/com/sun/corba/se/spi/ior/IOR.java ! src/share/classes/com/sun/corba/se/spi/ior/IORFactories.java ! src/share/classes/com/sun/corba/se/spi/ior/IORFactory.java ! src/share/classes/com/sun/corba/se/spi/ior/IORTemplate.java ! src/share/classes/com/sun/corba/se/spi/ior/IORTemplateList.java ! src/share/classes/com/sun/corba/se/spi/ior/Identifiable.java ! src/share/classes/com/sun/corba/se/spi/ior/IdentifiableBase.java ! src/share/classes/com/sun/corba/se/spi/ior/IdentifiableContainerBase.java ! src/share/classes/com/sun/corba/se/spi/ior/IdentifiableFactory.java ! src/share/classes/com/sun/corba/se/spi/ior/IdentifiableFactoryFinder.java ! src/share/classes/com/sun/corba/se/spi/ior/MakeImmutable.java ! src/share/classes/com/sun/corba/se/spi/ior/ObjectAdapterId.java ! src/share/classes/com/sun/corba/se/spi/ior/ObjectId.java ! src/share/classes/com/sun/corba/se/spi/ior/ObjectKey.java ! src/share/classes/com/sun/corba/se/spi/ior/ObjectKeyFactory.java ! src/share/classes/com/sun/corba/se/spi/ior/ObjectKeyTemplate.java ! src/share/classes/com/sun/corba/se/spi/ior/TaggedComponent.java ! src/share/classes/com/sun/corba/se/spi/ior/TaggedComponentBase.java ! src/share/classes/com/sun/corba/se/spi/ior/TaggedComponentFactoryFinder.java ! src/share/classes/com/sun/corba/se/spi/ior/TaggedProfile.java ! src/share/classes/com/sun/corba/se/spi/ior/TaggedProfileTemplate.java ! src/share/classes/com/sun/corba/se/spi/ior/TaggedProfileTemplateBase.java ! src/share/classes/com/sun/corba/se/spi/ior/WriteContents.java ! src/share/classes/com/sun/corba/se/spi/ior/Writeable.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/AlternateIIOPAddressComponent.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/CodeSetsComponent.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/GIOPVersion.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/IIOPAddress.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/IIOPFactories.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/IIOPProfile.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/IIOPProfileTemplate.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/JavaCodebaseComponent.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/MaxStreamFormatVersionComponent.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/ORBTypeComponent.java ! src/share/classes/com/sun/corba/se/spi/ior/iiop/RequestPartitioningComponent.java ! src/share/classes/com/sun/corba/se/spi/ior/package.html ! src/share/classes/com/sun/corba/se/spi/legacy/connection/Connection.java ! src/share/classes/com/sun/corba/se/spi/legacy/connection/GetEndPointInfoAgainException.java ! src/share/classes/com/sun/corba/se/spi/legacy/connection/LegacyServerSocketEndPointInfo.java ! src/share/classes/com/sun/corba/se/spi/legacy/connection/LegacyServerSocketManager.java ! src/share/classes/com/sun/corba/se/spi/legacy/connection/ORBSocketFactory.java ! src/share/classes/com/sun/corba/se/spi/legacy/connection/README.txt ! src/share/classes/com/sun/corba/se/spi/legacy/interceptor/IORInfoExt.java ! src/share/classes/com/sun/corba/se/spi/legacy/interceptor/ORBInitInfoExt.java ! src/share/classes/com/sun/corba/se/spi/legacy/interceptor/RequestInfoExt.java ! src/share/classes/com/sun/corba/se/spi/legacy/interceptor/UnknownType.java ! src/share/classes/com/sun/corba/se/spi/logging/CORBALogDomains.java ! src/share/classes/com/sun/corba/se/spi/logging/LogWrapperBase.java ! src/share/classes/com/sun/corba/se/spi/logging/LogWrapperFactory.java ! src/share/classes/com/sun/corba/se/spi/logging/data/Activation.mc ! src/share/classes/com/sun/corba/se/spi/logging/data/IOR.mc ! src/share/classes/com/sun/corba/se/spi/logging/data/Interceptors.mc ! src/share/classes/com/sun/corba/se/spi/logging/data/Naming.mc ! src/share/classes/com/sun/corba/se/spi/logging/data/OMG.mc ! src/share/classes/com/sun/corba/se/spi/logging/data/ORBUtil.mc ! src/share/classes/com/sun/corba/se/spi/logging/data/POA.mc ! src/share/classes/com/sun/corba/se/spi/logging/data/Util.mc ! src/share/classes/com/sun/corba/se/spi/monitoring/LongMonitoredAttributeBase.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoredAttribute.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoredAttributeBase.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoredAttributeInfo.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoredAttributeInfoFactory.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoredObject.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoredObjectFactory.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoringConstants.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoringFactories.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoringManager.java ! src/share/classes/com/sun/corba/se/spi/monitoring/MonitoringManagerFactory.java ! src/share/classes/com/sun/corba/se/spi/monitoring/StatisticMonitoredAttribute.java ! src/share/classes/com/sun/corba/se/spi/monitoring/StatisticsAccumulator.java ! src/share/classes/com/sun/corba/se/spi/monitoring/StringMonitoredAttributeBase.java ! src/share/classes/com/sun/corba/se/spi/monitoring/package.html ! src/share/classes/com/sun/corba/se/spi/oa/NullServant.java ! src/share/classes/com/sun/corba/se/spi/oa/OADefault.java ! src/share/classes/com/sun/corba/se/spi/oa/OADestroyed.java ! src/share/classes/com/sun/corba/se/spi/oa/OAInvocationInfo.java ! src/share/classes/com/sun/corba/se/spi/oa/ObjectAdapter.java ! src/share/classes/com/sun/corba/se/spi/oa/ObjectAdapterBase.java ! src/share/classes/com/sun/corba/se/spi/oa/ObjectAdapterFactory.java ! src/share/classes/com/sun/corba/se/spi/orb/DataCollector.java ! src/share/classes/com/sun/corba/se/spi/orb/ORB.java ! src/share/classes/com/sun/corba/se/spi/orb/ORBConfigurator.java ! src/share/classes/com/sun/corba/se/spi/orb/ORBData.java ! src/share/classes/com/sun/corba/se/spi/orb/ORBVersion.java ! src/share/classes/com/sun/corba/se/spi/orb/ORBVersionFactory.java ! src/share/classes/com/sun/corba/se/spi/orb/Operation.java ! src/share/classes/com/sun/corba/se/spi/orb/OperationFactory.java ! src/share/classes/com/sun/corba/se/spi/orb/ParserData.java ! src/share/classes/com/sun/corba/se/spi/orb/ParserDataFactory.java ! src/share/classes/com/sun/corba/se/spi/orb/ParserImplBase.java ! src/share/classes/com/sun/corba/se/spi/orb/ParserImplTableBase.java ! src/share/classes/com/sun/corba/se/spi/orb/PropertyParser.java ! src/share/classes/com/sun/corba/se/spi/orb/StringPair.java ! src/share/classes/com/sun/corba/se/spi/orbutil/closure/Closure.java ! src/share/classes/com/sun/corba/se/spi/orbutil/closure/ClosureFactory.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/Action.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/ActionBase.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/FSM.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/FSMImpl.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/FSMTest.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/Guard.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/GuardBase.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/Input.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/InputImpl.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/State.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/StateEngine.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/StateEngineFactory.java ! src/share/classes/com/sun/corba/se/spi/orbutil/fsm/StateImpl.java ! src/share/classes/com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandler.java ! src/share/classes/com/sun/corba/se/spi/orbutil/proxy/CompositeInvocationHandlerImpl.java ! src/share/classes/com/sun/corba/se/spi/orbutil/proxy/DelegateInvocationHandlerImpl.java ! src/share/classes/com/sun/corba/se/spi/orbutil/proxy/InvocationHandlerFactory.java ! src/share/classes/com/sun/corba/se/spi/orbutil/proxy/LinkedInvocationHandler.java ! src/share/classes/com/sun/corba/se/spi/orbutil/threadpool/NoSuchThreadPoolException.java ! src/share/classes/com/sun/corba/se/spi/orbutil/threadpool/NoSuchWorkQueueException.java ! src/share/classes/com/sun/corba/se/spi/orbutil/threadpool/ThreadPool.java ! src/share/classes/com/sun/corba/se/spi/orbutil/threadpool/ThreadPoolChooser.java ! src/share/classes/com/sun/corba/se/spi/orbutil/threadpool/ThreadPoolManager.java ! src/share/classes/com/sun/corba/se/spi/orbutil/threadpool/Work.java ! src/share/classes/com/sun/corba/se/spi/orbutil/threadpool/WorkQueue.java ! src/share/classes/com/sun/corba/se/spi/presentation/rmi/DynamicMethodMarshaller.java ! src/share/classes/com/sun/corba/se/spi/presentation/rmi/DynamicStub.java ! src/share/classes/com/sun/corba/se/spi/presentation/rmi/IDLNameTranslator.java ! src/share/classes/com/sun/corba/se/spi/presentation/rmi/PresentationDefaults.java ! src/share/classes/com/sun/corba/se/spi/presentation/rmi/PresentationManager.java ! src/share/classes/com/sun/corba/se/spi/presentation/rmi/StubAdapter.java ! src/share/classes/com/sun/corba/se/spi/presentation/rmi/StubWrapper.java ! src/share/classes/com/sun/corba/se/spi/protocol/ClientDelegateFactory.java ! src/share/classes/com/sun/corba/se/spi/protocol/CorbaClientDelegate.java ! src/share/classes/com/sun/corba/se/spi/protocol/CorbaMessageMediator.java ! src/share/classes/com/sun/corba/se/spi/protocol/CorbaProtocolHandler.java ! src/share/classes/com/sun/corba/se/spi/protocol/CorbaServerRequestDispatcher.java ! src/share/classes/com/sun/corba/se/spi/protocol/ForwardException.java ! src/share/classes/com/sun/corba/se/spi/protocol/InitialServerRequestDispatcher.java ! src/share/classes/com/sun/corba/se/spi/protocol/LocalClientRequestDispatcher.java ! src/share/classes/com/sun/corba/se/spi/protocol/LocalClientRequestDispatcherFactory.java ! src/share/classes/com/sun/corba/se/spi/protocol/PIHandler.java ! src/share/classes/com/sun/corba/se/spi/protocol/RequestDispatcherDefault.java ! src/share/classes/com/sun/corba/se/spi/protocol/RequestDispatcherRegistry.java ! src/share/classes/com/sun/corba/se/spi/resolver/LocalResolver.java ! src/share/classes/com/sun/corba/se/spi/resolver/Resolver.java ! src/share/classes/com/sun/corba/se/spi/resolver/ResolverDefault.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/CodeSetServiceContext.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/MaxStreamFormatVersionServiceContext.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/ORBVersionServiceContext.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/SendingContextServiceContext.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/ServiceContext.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/ServiceContextData.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/ServiceContextRegistry.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/ServiceContexts.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/UEInfoServiceContext.java ! src/share/classes/com/sun/corba/se/spi/servicecontext/UnknownServiceContext.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaAcceptor.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaConnection.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaConnectionCache.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaContactInfo.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaContactInfoList.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaContactInfoListFactory.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaContactInfoListIterator.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaResponseWaitingRoom.java ! src/share/classes/com/sun/corba/se/spi/transport/CorbaTransportManager.java ! src/share/classes/com/sun/corba/se/spi/transport/IIOPPrimaryToContactInfo.java ! src/share/classes/com/sun/corba/se/spi/transport/IORToSocketInfo.java ! src/share/classes/com/sun/corba/se/spi/transport/IORTransformer.java ! src/share/classes/com/sun/corba/se/spi/transport/ORBSocketFactory.java ! src/share/classes/com/sun/corba/se/spi/transport/ReadTimeouts.java ! src/share/classes/com/sun/corba/se/spi/transport/ReadTimeoutsFactory.java ! src/share/classes/com/sun/corba/se/spi/transport/SocketInfo.java ! src/share/classes/com/sun/corba/se/spi/transport/SocketOrChannelAcceptor.java ! src/share/classes/com/sun/corba/se/spi/transport/TransportDefault.java ! src/share/classes/com/sun/org/omg/CORBA/AttrDescriptionSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/AttributeDescription.java ! src/share/classes/com/sun/org/omg/CORBA/AttributeDescriptionHelper.java ! src/share/classes/com/sun/org/omg/CORBA/AttributeMode.java ! src/share/classes/com/sun/org/omg/CORBA/AttributeModeHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ContextIdSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ContextIdentifierHelper.java ! src/share/classes/com/sun/org/omg/CORBA/DefinitionKindHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ExcDescriptionSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ExceptionDescription.java ! src/share/classes/com/sun/org/omg/CORBA/ExceptionDescriptionHelper.java ! src/share/classes/com/sun/org/omg/CORBA/IDLTypeHelper.java ! src/share/classes/com/sun/org/omg/CORBA/IDLTypeOperations.java ! src/share/classes/com/sun/org/omg/CORBA/IRObjectOperations.java ! src/share/classes/com/sun/org/omg/CORBA/IdentifierHelper.java ! src/share/classes/com/sun/org/omg/CORBA/Initializer.java ! src/share/classes/com/sun/org/omg/CORBA/InitializerHelper.java ! src/share/classes/com/sun/org/omg/CORBA/InitializerSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/OpDescriptionSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/OperationDescription.java ! src/share/classes/com/sun/org/omg/CORBA/OperationDescriptionHelper.java ! src/share/classes/com/sun/org/omg/CORBA/OperationMode.java ! src/share/classes/com/sun/org/omg/CORBA/OperationModeHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ParDescriptionSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ParameterDescription.java ! src/share/classes/com/sun/org/omg/CORBA/ParameterDescriptionHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ParameterMode.java ! src/share/classes/com/sun/org/omg/CORBA/ParameterModeHelper.java ! src/share/classes/com/sun/org/omg/CORBA/Repository.java ! src/share/classes/com/sun/org/omg/CORBA/RepositoryHelper.java ! src/share/classes/com/sun/org/omg/CORBA/RepositoryIdHelper.java ! src/share/classes/com/sun/org/omg/CORBA/RepositoryIdSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/StructMemberHelper.java ! src/share/classes/com/sun/org/omg/CORBA/StructMemberSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ValueDefPackage/FullValueDescription.java ! src/share/classes/com/sun/org/omg/CORBA/ValueDefPackage/FullValueDescriptionHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ValueMemberHelper.java ! src/share/classes/com/sun/org/omg/CORBA/ValueMemberSeqHelper.java ! src/share/classes/com/sun/org/omg/CORBA/VersionSpecHelper.java ! src/share/classes/com/sun/org/omg/CORBA/VisibilityHelper.java ! src/share/classes/com/sun/org/omg/CORBA/_IDLTypeStub.java ! src/share/classes/com/sun/org/omg/CORBA/portable/ValueHelper.java ! src/share/classes/com/sun/org/omg/SendingContext/CodeBase.java ! src/share/classes/com/sun/org/omg/SendingContext/CodeBaseHelper.java ! src/share/classes/com/sun/org/omg/SendingContext/CodeBaseOperations.java ! src/share/classes/com/sun/org/omg/SendingContext/CodeBasePackage/URLHelper.java ! src/share/classes/com/sun/org/omg/SendingContext/CodeBasePackage/URLSeqHelper.java ! src/share/classes/com/sun/org/omg/SendingContext/CodeBasePackage/ValueDescSeqHelper.java ! src/share/classes/com/sun/org/omg/SendingContext/_CodeBaseImplBase.java ! src/share/classes/com/sun/org/omg/SendingContext/_CodeBaseStub.java ! src/share/classes/com/sun/tools/corba/se/idl/Arguments.java ! src/share/classes/com/sun/tools/corba/se/idl/AttributeEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/AttributeGen.java ! src/share/classes/com/sun/tools/corba/se/idl/Comment.java ! src/share/classes/com/sun/tools/corba/se/idl/Compile.java ! src/share/classes/com/sun/tools/corba/se/idl/ConstEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ConstGen.java ! src/share/classes/com/sun/tools/corba/se/idl/DefaultSymtabFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/EnumEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/EnumGen.java ! src/share/classes/com/sun/tools/corba/se/idl/ExceptionEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ExceptionGen.java ! src/share/classes/com/sun/tools/corba/se/idl/Factories.java ! src/share/classes/com/sun/tools/corba/se/idl/ForwardEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ForwardGen.java ! src/share/classes/com/sun/tools/corba/se/idl/ForwardValueEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ForwardValueGen.java ! src/share/classes/com/sun/tools/corba/se/idl/GenFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/GenFileStream.java ! src/share/classes/com/sun/tools/corba/se/idl/Generator.java ! src/share/classes/com/sun/tools/corba/se/idl/IDLID.java ! src/share/classes/com/sun/tools/corba/se/idl/IncludeEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/IncludeGen.java ! src/share/classes/com/sun/tools/corba/se/idl/InterfaceEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/InterfaceGen.java ! src/share/classes/com/sun/tools/corba/se/idl/InterfaceState.java ! src/share/classes/com/sun/tools/corba/se/idl/InterfaceType.java ! src/share/classes/com/sun/tools/corba/se/idl/InvalidArgument.java ! src/share/classes/com/sun/tools/corba/se/idl/InvalidCharacter.java ! src/share/classes/com/sun/tools/corba/se/idl/MethodEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/MethodGen.java ! src/share/classes/com/sun/tools/corba/se/idl/ModuleEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ModuleGen.java ! src/share/classes/com/sun/tools/corba/se/idl/NativeEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/NativeGen.java ! src/share/classes/com/sun/tools/corba/se/idl/NoPragma.java ! src/share/classes/com/sun/tools/corba/se/idl/Noop.java ! src/share/classes/com/sun/tools/corba/se/idl/ParameterEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ParameterGen.java ! src/share/classes/com/sun/tools/corba/se/idl/ParseException.java ! src/share/classes/com/sun/tools/corba/se/idl/Parser.java ! src/share/classes/com/sun/tools/corba/se/idl/PragmaEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/PragmaGen.java ! src/share/classes/com/sun/tools/corba/se/idl/PragmaHandler.java ! src/share/classes/com/sun/tools/corba/se/idl/Preprocessor.java ! src/share/classes/com/sun/tools/corba/se/idl/PrimitiveEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/PrimitiveGen.java ! src/share/classes/com/sun/tools/corba/se/idl/RepositoryID.java ! src/share/classes/com/sun/tools/corba/se/idl/ResourceBundleUtil.java ! src/share/classes/com/sun/tools/corba/se/idl/Scanner.java ! src/share/classes/com/sun/tools/corba/se/idl/SequenceEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/SequenceGen.java ! src/share/classes/com/sun/tools/corba/se/idl/StringEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/StringGen.java ! src/share/classes/com/sun/tools/corba/se/idl/StructEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/StructGen.java ! src/share/classes/com/sun/tools/corba/se/idl/SymtabEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/SymtabFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/Token.java ! src/share/classes/com/sun/tools/corba/se/idl/TokenBuffer.java ! src/share/classes/com/sun/tools/corba/se/idl/TypedefEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/TypedefGen.java ! src/share/classes/com/sun/tools/corba/se/idl/UnionBranch.java ! src/share/classes/com/sun/tools/corba/se/idl/UnionEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/UnionGen.java ! src/share/classes/com/sun/tools/corba/se/idl/Util.java ! src/share/classes/com/sun/tools/corba/se/idl/ValueBoxEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ValueBoxGen.java ! src/share/classes/com/sun/tools/corba/se/idl/ValueEntry.java ! src/share/classes/com/sun/tools/corba/se/idl/ValueGen.java ! src/share/classes/com/sun/tools/corba/se/idl/ValueRepositoryId.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/And.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/BinaryExpr.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/BooleanAnd.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/BooleanNot.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/BooleanOr.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/DefaultExprFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Divide.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Equal.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/EvaluationException.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/ExprFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Expression.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/GreaterEqual.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/GreaterThan.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/LessEqual.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/LessThan.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Minus.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Modulo.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Negative.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Not.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/NotEqual.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Or.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Plus.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Positive.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/ShiftLeft.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/ShiftRight.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Terminal.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Times.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/UnaryExpr.java ! src/share/classes/com/sun/tools/corba/se/idl/constExpr/Xor.java ! src/share/classes/com/sun/tools/corba/se/idl/first.set ! src/share/classes/com/sun/tools/corba/se/idl/follow.set ! src/share/classes/com/sun/tools/corba/se/idl/grammar.idl ! src/share/classes/com/sun/tools/corba/se/idl/grammar3.idl ! src/share/classes/com/sun/tools/corba/se/idl/idl.prp ! src/share/classes/com/sun/tools/corba/se/idl/idl_ja.prp ! src/share/classes/com/sun/tools/corba/se/idl/idl_zh_CN.prp ! src/share/classes/com/sun/tools/corba/se/idl/ir.idl ! src/share/classes/com/sun/tools/corba/se/idl/orb.idl ! src/share/classes/com/sun/tools/corba/se/idl/som/cff/FileLocator.java ! src/share/classes/com/sun/tools/corba/se/idl/som/cff/Messages.java ! src/share/classes/com/sun/tools/corba/se/idl/som/idlemit/MetaPragma.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Arguments.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/AttributeGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/AttributeGen24.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/AuxGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Compile.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ConstGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/DefaultFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/EnumGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ExceptionGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Factories.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ForwardValueGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/GenFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Helper.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Helper24.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Holder.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/InterfaceGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/JavaGenerator.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/MethodGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/MethodGen24.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/MethodGenClone24.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ModuleGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/NameModifier.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/NameModifierImpl.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/NativeGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/PrimitiveGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/SequenceGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Skeleton.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/StringGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/StructGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Stub.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/TCOffsets.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/TypedefGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/UnionGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/Util.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ValueBoxGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ValueBoxGen24.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ValueFactory.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ValueGen.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/ValueGen24.java ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/toJavaPortable.prp ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/toJavaPortable_ja.prp ! src/share/classes/com/sun/tools/corba/se/idl/toJavaPortable/toJavaPortable_zh_CN.prp ! src/share/classes/com/sun/tools/corba/se/logutil/IndentingPrintWriter.java ! src/share/classes/com/sun/tools/corba/se/logutil/Input.java ! src/share/classes/com/sun/tools/corba/se/logutil/InputCode.java ! src/share/classes/com/sun/tools/corba/se/logutil/InputException.java ! src/share/classes/com/sun/tools/corba/se/logutil/MC.java ! src/share/classes/com/sun/tools/corba/se/logutil/Makefile ! src/share/classes/com/sun/tools/corba/se/logutil/StringUtil.java ! src/share/classes/javax/activity/ActivityCompletedException.java ! src/share/classes/javax/activity/ActivityRequiredException.java ! src/share/classes/javax/activity/InvalidActivityException.java ! src/share/classes/javax/activity/package.html ! src/share/classes/javax/rmi/CORBA/ClassDesc.java ! src/share/classes/javax/rmi/CORBA/GetORBPropertiesFileAction.java ! src/share/classes/javax/rmi/CORBA/PortableRemoteObjectDelegate.java ! src/share/classes/javax/rmi/CORBA/Stub.java ! src/share/classes/javax/rmi/CORBA/StubDelegate.java ! src/share/classes/javax/rmi/CORBA/Tie.java ! src/share/classes/javax/rmi/CORBA/Util.java ! src/share/classes/javax/rmi/CORBA/UtilDelegate.java ! src/share/classes/javax/rmi/CORBA/ValueHandler.java ! src/share/classes/javax/rmi/CORBA/ValueHandlerMultiFormat.java ! src/share/classes/javax/rmi/CORBA/package.html ! src/share/classes/javax/rmi/PortableRemoteObject.java ! src/share/classes/javax/rmi/package.html ! src/share/classes/javax/transaction/InvalidTransactionException.java ! src/share/classes/javax/transaction/TransactionRequiredException.java ! src/share/classes/javax/transaction/TransactionRolledbackException.java ! src/share/classes/javax/transaction/package.html ! src/share/classes/javax/transaction/xa/XAException.java ! src/share/classes/javax/transaction/xa/XAResource.java ! src/share/classes/javax/transaction/xa/Xid.java ! src/share/classes/javax/transaction/xa/package.html ! src/share/classes/org/omg/CORBA/ACTIVITY_COMPLETED.java ! src/share/classes/org/omg/CORBA/ACTIVITY_REQUIRED.java ! src/share/classes/org/omg/CORBA/ARG_IN.java ! src/share/classes/org/omg/CORBA/ARG_INOUT.java ! src/share/classes/org/omg/CORBA/ARG_OUT.java ! src/share/classes/org/omg/CORBA/Any.java ! src/share/classes/org/omg/CORBA/AnyHolder.java ! src/share/classes/org/omg/CORBA/AnySeqHelper.java ! src/share/classes/org/omg/CORBA/AnySeqHolder.java ! src/share/classes/org/omg/CORBA/BAD_CONTEXT.java ! src/share/classes/org/omg/CORBA/BAD_INV_ORDER.java ! src/share/classes/org/omg/CORBA/BAD_OPERATION.java ! src/share/classes/org/omg/CORBA/BAD_PARAM.java ! src/share/classes/org/omg/CORBA/BAD_POLICY.java ! src/share/classes/org/omg/CORBA/BAD_POLICY_TYPE.java ! src/share/classes/org/omg/CORBA/BAD_POLICY_VALUE.java ! src/share/classes/org/omg/CORBA/BAD_QOS.java ! src/share/classes/org/omg/CORBA/BAD_TYPECODE.java ! src/share/classes/org/omg/CORBA/BooleanHolder.java ! src/share/classes/org/omg/CORBA/BooleanSeqHelper.java ! src/share/classes/org/omg/CORBA/BooleanSeqHolder.java ! src/share/classes/org/omg/CORBA/Bounds.java ! src/share/classes/org/omg/CORBA/ByteHolder.java ! src/share/classes/org/omg/CORBA/CODESET_INCOMPATIBLE.java ! src/share/classes/org/omg/CORBA/COMM_FAILURE.java ! src/share/classes/org/omg/CORBA/CTX_RESTRICT_SCOPE.java ! src/share/classes/org/omg/CORBA/CharHolder.java ! src/share/classes/org/omg/CORBA/CharSeqHelper.java ! src/share/classes/org/omg/CORBA/CharSeqHolder.java ! src/share/classes/org/omg/CORBA/CompletionStatus.java ! src/share/classes/org/omg/CORBA/CompletionStatusHelper.java ! src/share/classes/org/omg/CORBA/Context.java ! src/share/classes/org/omg/CORBA/ContextList.java ! src/share/classes/org/omg/CORBA/Current.java ! src/share/classes/org/omg/CORBA/CurrentHelper.java ! src/share/classes/org/omg/CORBA/CurrentHolder.java ! src/share/classes/org/omg/CORBA/CurrentOperations.java ! src/share/classes/org/omg/CORBA/CustomMarshal.java ! src/share/classes/org/omg/CORBA/DATA_CONVERSION.java ! src/share/classes/org/omg/CORBA/DataInputStream.java ! src/share/classes/org/omg/CORBA/DataOutputStream.java ! src/share/classes/org/omg/CORBA/DefinitionKind.java ! src/share/classes/org/omg/CORBA/DefinitionKindHelper.java ! src/share/classes/org/omg/CORBA/DomainManager.java ! src/share/classes/org/omg/CORBA/DomainManagerOperations.java ! src/share/classes/org/omg/CORBA/DoubleHolder.java ! src/share/classes/org/omg/CORBA/DoubleSeqHelper.java ! src/share/classes/org/omg/CORBA/DoubleSeqHolder.java ! src/share/classes/org/omg/CORBA/DynAny.java ! src/share/classes/org/omg/CORBA/DynAnyPackage/Invalid.java ! src/share/classes/org/omg/CORBA/DynAnyPackage/InvalidSeq.java ! src/share/classes/org/omg/CORBA/DynAnyPackage/InvalidValue.java ! src/share/classes/org/omg/CORBA/DynAnyPackage/TypeMismatch.java ! src/share/classes/org/omg/CORBA/DynAnyPackage/package.html ! src/share/classes/org/omg/CORBA/DynArray.java ! src/share/classes/org/omg/CORBA/DynEnum.java ! src/share/classes/org/omg/CORBA/DynFixed.java ! src/share/classes/org/omg/CORBA/DynSequence.java ! src/share/classes/org/omg/CORBA/DynStruct.java ! src/share/classes/org/omg/CORBA/DynUnion.java ! src/share/classes/org/omg/CORBA/DynValue.java ! src/share/classes/org/omg/CORBA/DynamicImplementation.java ! src/share/classes/org/omg/CORBA/Environment.java ! src/share/classes/org/omg/CORBA/ExceptionList.java ! src/share/classes/org/omg/CORBA/FREE_MEM.java ! src/share/classes/org/omg/CORBA/FieldNameHelper.java ! src/share/classes/org/omg/CORBA/FixedHolder.java ! src/share/classes/org/omg/CORBA/FloatHolder.java ! src/share/classes/org/omg/CORBA/FloatSeqHelper.java ! src/share/classes/org/omg/CORBA/FloatSeqHolder.java ! src/share/classes/org/omg/CORBA/IDLType.java ! src/share/classes/org/omg/CORBA/IDLTypeHelper.java ! src/share/classes/org/omg/CORBA/IDLTypeOperations.java ! src/share/classes/org/omg/CORBA/IMP_LIMIT.java ! src/share/classes/org/omg/CORBA/INITIALIZE.java ! src/share/classes/org/omg/CORBA/INTERNAL.java ! src/share/classes/org/omg/CORBA/INTF_REPOS.java ! src/share/classes/org/omg/CORBA/INVALID_ACTIVITY.java ! src/share/classes/org/omg/CORBA/INVALID_TRANSACTION.java ! src/share/classes/org/omg/CORBA/INV_FLAG.java ! src/share/classes/org/omg/CORBA/INV_IDENT.java ! src/share/classes/org/omg/CORBA/INV_OBJREF.java ! src/share/classes/org/omg/CORBA/INV_POLICY.java ! src/share/classes/org/omg/CORBA/IRObject.java ! src/share/classes/org/omg/CORBA/IRObjectOperations.java ! src/share/classes/org/omg/CORBA/IdentifierHelper.java ! src/share/classes/org/omg/CORBA/IntHolder.java ! src/share/classes/org/omg/CORBA/LocalObject.java ! src/share/classes/org/omg/CORBA/LongHolder.java ! src/share/classes/org/omg/CORBA/LongLongSeqHelper.java ! src/share/classes/org/omg/CORBA/LongLongSeqHolder.java ! src/share/classes/org/omg/CORBA/LongSeqHelper.java ! src/share/classes/org/omg/CORBA/LongSeqHolder.java ! src/share/classes/org/omg/CORBA/MARSHAL.java ! src/share/classes/org/omg/CORBA/NO_IMPLEMENT.java ! src/share/classes/org/omg/CORBA/NO_MEMORY.java ! src/share/classes/org/omg/CORBA/NO_PERMISSION.java ! src/share/classes/org/omg/CORBA/NO_RESOURCES.java ! src/share/classes/org/omg/CORBA/NO_RESPONSE.java ! src/share/classes/org/omg/CORBA/NVList.java ! src/share/classes/org/omg/CORBA/NameValuePair.java ! src/share/classes/org/omg/CORBA/NameValuePairHelper.java ! src/share/classes/org/omg/CORBA/NamedValue.java ! src/share/classes/org/omg/CORBA/OBJECT_NOT_EXIST.java ! src/share/classes/org/omg/CORBA/OBJ_ADAPTER.java ! src/share/classes/org/omg/CORBA/OMGVMCID.java ! src/share/classes/org/omg/CORBA/ORB.java ! src/share/classes/org/omg/CORBA/ORBPackage/InconsistentTypeCode.java ! src/share/classes/org/omg/CORBA/ORBPackage/InvalidName.java ! src/share/classes/org/omg/CORBA/ORBPackage/package.html ! src/share/classes/org/omg/CORBA/Object.java ! src/share/classes/org/omg/CORBA/ObjectHelper.java ! src/share/classes/org/omg/CORBA/ObjectHolder.java ! src/share/classes/org/omg/CORBA/OctetSeqHelper.java ! src/share/classes/org/omg/CORBA/OctetSeqHolder.java ! src/share/classes/org/omg/CORBA/PERSIST_STORE.java ! src/share/classes/org/omg/CORBA/PRIVATE_MEMBER.java ! src/share/classes/org/omg/CORBA/PUBLIC_MEMBER.java ! src/share/classes/org/omg/CORBA/Policy.java ! src/share/classes/org/omg/CORBA/PolicyError.java ! src/share/classes/org/omg/CORBA/PolicyHelper.java ! src/share/classes/org/omg/CORBA/PolicyHolder.java ! src/share/classes/org/omg/CORBA/PolicyListHelper.java ! src/share/classes/org/omg/CORBA/PolicyListHolder.java ! src/share/classes/org/omg/CORBA/PolicyOperations.java ! src/share/classes/org/omg/CORBA/PolicyTypeHelper.java ! src/share/classes/org/omg/CORBA/Principal.java ! src/share/classes/org/omg/CORBA/PrincipalHolder.java ! src/share/classes/org/omg/CORBA/REBIND.java ! src/share/classes/org/omg/CORBA/RepositoryIdHelper.java ! src/share/classes/org/omg/CORBA/Request.java ! src/share/classes/org/omg/CORBA/ServerRequest.java ! src/share/classes/org/omg/CORBA/ServiceDetail.java ! src/share/classes/org/omg/CORBA/ServiceDetailHelper.java ! src/share/classes/org/omg/CORBA/ServiceInformation.java ! src/share/classes/org/omg/CORBA/ServiceInformationHelper.java ! src/share/classes/org/omg/CORBA/ServiceInformationHolder.java ! src/share/classes/org/omg/CORBA/SetOverrideType.java ! src/share/classes/org/omg/CORBA/SetOverrideTypeHelper.java ! src/share/classes/org/omg/CORBA/ShortHolder.java ! src/share/classes/org/omg/CORBA/ShortSeqHelper.java ! src/share/classes/org/omg/CORBA/ShortSeqHolder.java ! src/share/classes/org/omg/CORBA/StringHolder.java ! src/share/classes/org/omg/CORBA/StringValueHelper.java ! src/share/classes/org/omg/CORBA/StructMember.java ! src/share/classes/org/omg/CORBA/StructMemberHelper.java ! src/share/classes/org/omg/CORBA/SystemException.java ! src/share/classes/org/omg/CORBA/TCKind.java ! src/share/classes/org/omg/CORBA/TIMEOUT.java ! src/share/classes/org/omg/CORBA/TRANSACTION_MODE.java ! src/share/classes/org/omg/CORBA/TRANSACTION_REQUIRED.java ! src/share/classes/org/omg/CORBA/TRANSACTION_ROLLEDBACK.java ! src/share/classes/org/omg/CORBA/TRANSACTION_UNAVAILABLE.java ! src/share/classes/org/omg/CORBA/TRANSIENT.java ! src/share/classes/org/omg/CORBA/TypeCode.java ! src/share/classes/org/omg/CORBA/TypeCodeHolder.java ! src/share/classes/org/omg/CORBA/TypeCodePackage/BadKind.java ! src/share/classes/org/omg/CORBA/TypeCodePackage/Bounds.java ! src/share/classes/org/omg/CORBA/TypeCodePackage/package.html ! src/share/classes/org/omg/CORBA/ULongLongSeqHelper.java ! src/share/classes/org/omg/CORBA/ULongLongSeqHolder.java ! src/share/classes/org/omg/CORBA/ULongSeqHelper.java ! src/share/classes/org/omg/CORBA/ULongSeqHolder.java ! src/share/classes/org/omg/CORBA/UNKNOWN.java ! src/share/classes/org/omg/CORBA/UNSUPPORTED_POLICY.java ! src/share/classes/org/omg/CORBA/UNSUPPORTED_POLICY_VALUE.java ! src/share/classes/org/omg/CORBA/UShortSeqHelper.java ! src/share/classes/org/omg/CORBA/UShortSeqHolder.java ! src/share/classes/org/omg/CORBA/UnionMember.java ! src/share/classes/org/omg/CORBA/UnionMemberHelper.java ! src/share/classes/org/omg/CORBA/UnknownUserException.java ! src/share/classes/org/omg/CORBA/UnknownUserExceptionHelper.java ! src/share/classes/org/omg/CORBA/UnknownUserExceptionHolder.java ! src/share/classes/org/omg/CORBA/UserException.java ! src/share/classes/org/omg/CORBA/VM_ABSTRACT.java ! src/share/classes/org/omg/CORBA/VM_CUSTOM.java ! src/share/classes/org/omg/CORBA/VM_NONE.java ! src/share/classes/org/omg/CORBA/VM_TRUNCATABLE.java ! src/share/classes/org/omg/CORBA/ValueBaseHelper.java ! src/share/classes/org/omg/CORBA/ValueBaseHolder.java ! src/share/classes/org/omg/CORBA/ValueMember.java ! src/share/classes/org/omg/CORBA/ValueMemberHelper.java ! src/share/classes/org/omg/CORBA/VersionSpecHelper.java ! src/share/classes/org/omg/CORBA/VisibilityHelper.java ! src/share/classes/org/omg/CORBA/WCharSeqHelper.java ! src/share/classes/org/omg/CORBA/WCharSeqHolder.java ! src/share/classes/org/omg/CORBA/WStringValueHelper.java ! src/share/classes/org/omg/CORBA/WrongTransaction.java ! src/share/classes/org/omg/CORBA/WrongTransactionHelper.java ! src/share/classes/org/omg/CORBA/WrongTransactionHolder.java ! src/share/classes/org/omg/CORBA/_IDLTypeStub.java ! src/share/classes/org/omg/CORBA/_PolicyStub.java ! src/share/classes/org/omg/CORBA/ir.idl ! src/share/classes/org/omg/CORBA/orb.idl ! src/share/classes/org/omg/CORBA/package.html ! src/share/classes/org/omg/CORBA/portable/ApplicationException.java ! src/share/classes/org/omg/CORBA/portable/BoxedValueHelper.java ! src/share/classes/org/omg/CORBA/portable/CustomValue.java ! src/share/classes/org/omg/CORBA/portable/Delegate.java ! src/share/classes/org/omg/CORBA/portable/IDLEntity.java ! src/share/classes/org/omg/CORBA/portable/IndirectionException.java ! src/share/classes/org/omg/CORBA/portable/InputStream.java ! src/share/classes/org/omg/CORBA/portable/InvokeHandler.java ! src/share/classes/org/omg/CORBA/portable/ObjectImpl.java ! src/share/classes/org/omg/CORBA/portable/OutputStream.java ! src/share/classes/org/omg/CORBA/portable/RemarshalException.java ! src/share/classes/org/omg/CORBA/portable/ResponseHandler.java ! src/share/classes/org/omg/CORBA/portable/ServantObject.java ! src/share/classes/org/omg/CORBA/portable/Streamable.java ! src/share/classes/org/omg/CORBA/portable/StreamableValue.java ! src/share/classes/org/omg/CORBA/portable/UnknownException.java ! src/share/classes/org/omg/CORBA/portable/ValueBase.java ! src/share/classes/org/omg/CORBA/portable/ValueFactory.java ! src/share/classes/org/omg/CORBA/portable/ValueInputStream.java ! src/share/classes/org/omg/CORBA/portable/ValueOutputStream.java ! src/share/classes/org/omg/CORBA/portable/package.html ! src/share/classes/org/omg/CORBA_2_3/ORB.java ! src/share/classes/org/omg/CORBA_2_3/package.html ! src/share/classes/org/omg/CORBA_2_3/portable/Delegate.java ! src/share/classes/org/omg/CORBA_2_3/portable/InputStream.java ! src/share/classes/org/omg/CORBA_2_3/portable/ObjectImpl.java ! src/share/classes/org/omg/CORBA_2_3/portable/OutputStream.java ! src/share/classes/org/omg/CORBA_2_3/portable/package.html ! src/share/classes/org/omg/CosNaming/NamingContextExtPackage/package.html ! src/share/classes/org/omg/CosNaming/NamingContextPackage/package.html ! src/share/classes/org/omg/CosNaming/_BindingIteratorImplBase.java ! src/share/classes/org/omg/CosNaming/_NamingContextImplBase.java ! src/share/classes/org/omg/CosNaming/nameservice.idl ! src/share/classes/org/omg/CosNaming/package.html ! src/share/classes/org/omg/Dynamic/package.html ! src/share/classes/org/omg/DynamicAny/DynAnyFactoryPackage/package.html ! src/share/classes/org/omg/DynamicAny/DynAnyPackage/package.html ! src/share/classes/org/omg/DynamicAny/DynamicAny.idl ! src/share/classes/org/omg/DynamicAny/package.html ! src/share/classes/org/omg/IOP/CodecFactoryPackage/package.html ! src/share/classes/org/omg/IOP/CodecPackage/package.html ! src/share/classes/org/omg/IOP/package.html ! src/share/classes/org/omg/Messaging/package.html ! src/share/classes/org/omg/PortableInterceptor/CORBAX.idl ! src/share/classes/org/omg/PortableInterceptor/IOP.idl ! src/share/classes/org/omg/PortableInterceptor/Interceptors.idl ! src/share/classes/org/omg/PortableInterceptor/Messaging.idl ! src/share/classes/org/omg/PortableInterceptor/ORBInitInfoPackage/package.html ! src/share/classes/org/omg/PortableInterceptor/package.html ! src/share/classes/org/omg/PortableServer/CurrentHelper.java ! src/share/classes/org/omg/PortableServer/CurrentPackage/package.html ! src/share/classes/org/omg/PortableServer/DynamicImplementation.java ! src/share/classes/org/omg/PortableServer/POAHelper.java ! src/share/classes/org/omg/PortableServer/POAManagerPackage/package.html ! src/share/classes/org/omg/PortableServer/POAPackage/package.html ! src/share/classes/org/omg/PortableServer/Servant.java ! src/share/classes/org/omg/PortableServer/ServantLocatorPackage/CookieHolder.java ! src/share/classes/org/omg/PortableServer/ServantLocatorPackage/package.html ! src/share/classes/org/omg/PortableServer/corba.idl ! src/share/classes/org/omg/PortableServer/package.html ! src/share/classes/org/omg/PortableServer/poa.idl ! src/share/classes/org/omg/PortableServer/portable/Delegate.java ! src/share/classes/org/omg/PortableServer/portable/package.html ! src/share/classes/org/omg/SendingContext/RunTime.java ! src/share/classes/org/omg/SendingContext/RunTimeOperations.java ! src/share/classes/org/omg/SendingContext/package.html ! src/share/classes/org/omg/stub/java/rmi/_Remote_Stub.java ! src/share/classes/org/omg/stub/java/rmi/package.html ! src/share/classes/sun/corba/Bridge.java ! src/share/classes/sun/corba/BridgePermission.java ! src/share/classes/sun/corba/package.html ! src/share/classes/sun/rmi/rmic/iiop/AbstractType.java ! src/share/classes/sun/rmi/rmic/iiop/ArrayType.java ! src/share/classes/sun/rmi/rmic/iiop/BatchEnvironment.java ! src/share/classes/sun/rmi/rmic/iiop/ClassPathLoader.java ! src/share/classes/sun/rmi/rmic/iiop/ClassType.java ! src/share/classes/sun/rmi/rmic/iiop/CompoundType.java ! src/share/classes/sun/rmi/rmic/iiop/Constants.java ! src/share/classes/sun/rmi/rmic/iiop/ContextElement.java ! src/share/classes/sun/rmi/rmic/iiop/ContextStack.java ! src/share/classes/sun/rmi/rmic/iiop/DirectoryLoader.java ! src/share/classes/sun/rmi/rmic/iiop/Generator.java ! src/share/classes/sun/rmi/rmic/iiop/IDLGenerator.java ! src/share/classes/sun/rmi/rmic/iiop/IDLNames.java ! src/share/classes/sun/rmi/rmic/iiop/ImplementationType.java ! src/share/classes/sun/rmi/rmic/iiop/InterfaceType.java ! src/share/classes/sun/rmi/rmic/iiop/NCClassType.java ! src/share/classes/sun/rmi/rmic/iiop/NCInterfaceType.java ! src/share/classes/sun/rmi/rmic/iiop/NameContext.java ! src/share/classes/sun/rmi/rmic/iiop/PrimitiveType.java ! src/share/classes/sun/rmi/rmic/iiop/PrintGenerator.java ! src/share/classes/sun/rmi/rmic/iiop/RemoteType.java ! src/share/classes/sun/rmi/rmic/iiop/SpecialClassType.java ! src/share/classes/sun/rmi/rmic/iiop/SpecialInterfaceType.java ! src/share/classes/sun/rmi/rmic/iiop/StaticStringsHash.java ! src/share/classes/sun/rmi/rmic/iiop/StubGenerator.java ! src/share/classes/sun/rmi/rmic/iiop/Type.java ! src/share/classes/sun/rmi/rmic/iiop/Util.java ! src/share/classes/sun/rmi/rmic/iiop/ValueType.java ! src/windows/resource/version.rc Changeset: 41d03931cddb Author: ohair Date: 2010-05-26 10:46 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/41d03931cddb Merge Changeset: 217e205758ea Author: mikejwre Date: 2010-05-27 10:57 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/217e205758ea Added tag jdk7-b95 for changeset 06dbf406818c ! .hgtags Changeset: 125b504c5b72 Author: mikejwre Date: 2010-05-29 09:53 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/125b504c5b72 Merge Changeset: 888a846a860a Author: alanb Date: 2010-06-01 15:16 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/888a846a860a 6955873: CORBA resources bundles and javax.activity missing from b94 Reviewed-by: ohair - make/com/sun/corba/minclude/ioser_io.jmk ! make/sun/corba/Makefile + make/sun/corba/core/Makefile ! make/sun/rmi/rmic/FILES.gmk From alan.bateman at oracle.com Wed Jun 2 08:37:55 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Wed, 02 Jun 2010 08:37:55 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100602083827.27FD546EB8@hg.openjdk.java.net> Changeset: 17870c6c1d4e Author: alanb Date: 2010-06-02 09:29 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/17870c6c1d4e 6950927: Testcase failure sun/management/jmxremote/bootstrap/JvmstatCountersTest.java Reviewed-by: dholmes, dcubed ! src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java ! src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java Changeset: 6e57723b3519 Author: alanb Date: 2010-06-02 09:35 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/6e57723b3519 Merge From iaroslavski at mail.ru Wed Jun 2 13:54:57 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Wed, 02 Jun 2010 17:54:57 +0400 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: <4BF2AAEE.1040706@mail.ru> <4BF3BFFD.8010007@mail.ru> <4BF3C05C.7010300@mail.ru> <4BF69AFB.8060406@mail.ru> <4BFB716B.4020107@mail.ru> <4BFD1021.1030404@mail.ru> <4C04F1A3.4040907@mail.ru> Message-ID: <4C0662B1.8040703@mail.ru> I checked sorting for long type and see the same behaviour as for int, new suggested sorting network doesn't win. 10-steps bubble sort shows the almost the same results as on int: wins ~0.3% on client, and 0.8% on server. Should we use 10-steps bubble sort instead of sorting network (which has bubble sorting structure as well)? For code it will be extra one line. Dmytro, Could you please, run your counting test on bubble sort? What is the average count of swaps? The schema is [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] Dmytro Sheyko wrote: > Hi Vladimir, > > > Which sorting algorithm we should use? > > > > 1. Network - compact, 9 lines of code > > 2. Bubble - also compact, 10 lines of code > > 3. Insertion - faster, but 39 lines of code > > I think that the gain is not worth the complexity. So, maybe, just leave > it as it is. > > > Date: Tue, 1 Jun 2010 15:40:19 +0400 > > From: iaroslavski at mail.ru > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > To: dmytro_sheyko at hotmail.com > > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > > > Hi Dmytro, > > > > Very interesting investigation, thank you very much! > > > > I tried you suggested sorting network, but all versions work the same. > > Then I used bubble sort (10 comparisons) and it shows better > > results: on client it is faster on 0.2%, server - 0.8%, not too > > much, but faster. > > > > The schema is (bubble sort with changes of direction): > > [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > > > And moreover: if we use insertion sort for sorting of 5 candidates: > > > > int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > > > if (ae2 < a[e1]) { > > a[e2] = a[e1]; a[e1] = ae2; > > } > > if (ae3 < a[e2]) { > > if (ae3 < a[e1]) { > > a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae3; > > } else { > > a[e3] = a[e2]; a[e2] = ae3; > > } > > } > > if (ae4 < a[e2]) { > > if (ae4 < a[e1]) { > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae4; > > } else { > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae4; > > } > > } else { > > if (ae4 < a[e3]) { > > a[e4] = a[e3]; a[e3] = ae4; > > } > > } > > if (ae5 < a[e2]) { > > if (ae5 < a[e1]) { > > a[e5]=a[e4];a[e4]=a[e3];a[e3]=a[e2];a[e2]=a[e1];a[e1]=ae5; > > } else { > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae5; > > } > > } else { > > if (ae5 < a[e3]) { > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = ae5; > > } > > else { > > if (ae5 < a[e4]) { > > a[e5] = a[e4]; a[e4] = ae5; > > } > > } > > } > > > > it shows better results than bubble sort: > > client - 0.37%, server - 1.03% > > > > Which sorting algorithm we should use? > > > > 1. Network - compact, 9 lines of code > > 2. Bubble - also compact, 10 lines of code > > 3. Insertion - faster, but 39 lines of code > > > > Regards, > > Vladimir > > > > Dmytro Sheyko wrote: > > > Corrections. > > > 1. The sixth comparator in current network (that swaps with 90% > > > probability) is [2 3] not [0 3]. > > > 2. The average number of swaps are > > > 576/120 = 4.8 for current network and > > > 376/120 = 3.1(3...) for proposed network. > > > > > > > ------------------------------------------------------------------------ > > > From: dmytro_sheyko at hotmail.com > > > To: iaroslavski at mail.ru; joshua.bloch at google.com > > > Subject: RE: New portion of improvements for Dual-Pivot Quicksort > > > Date: Tue, 1 Jun 2010 14:59:07 +0700 > > > CC: core-libs-dev at openjdk.java.net > > > > > > Hi Vladimir, > > > > > > I cannot write 7-comparison sort briefly as well. However I think > we can > > > optimize sorting network a bit. > > > We can consider such properties as > > > 1. size, i.e. number of comparators > > > 2. delay, i.e. number of parallel steps (some comparisons and swaps > can > > > be done concurrently) > > > 3. average number of swaps. > > > > > > The current sorting network > > > [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] > > > has size 9 and delay 5. > > > These values are good enough. Generally we cannot write it shorter (in > > > order to improve size) and combine more than 2 comparison in a > parallel > > > step (in order to improve delay). > > > > > > However the average number of swaps seems too high. It performs 576 > > > swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) > > > I tried every permutation of 5 distinct values. > > > There is a profile per comparator: > > > > (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] > > > The first two comparison offer probability of swap as 50%, which is > > > natural. However the sixth comparator (i.e. [0 3]) swaps with > > > probability 90%, i.e. almost always! > > > > > > The one of the best sorting network (I have found) with the same size > > > and delay is following > > > [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] > > > Its average number of swaps is 376. > > > And here is a profile: > > > > (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] > > > > > > Regards, > > > Dmytro Sheyko > > > > > > > Date: Wed, 26 May 2010 16:12:17 +0400 > > > > From: iaroslavski at mail.ru > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > Hello Dmytro, > > > > > > > > Theoretical investigations are based on simple model, > > > > which doesn't take into account many optimizations > > > > like "equal pivots", "scan equal to pivots", etc. > > > > Model based on the implementation will be too complex > > > > to be analyzed. > > > > > > > > But it is easy to count comparisons and assignments, > > > > if I change them by functions with counter. > > > > > > > > Also I tried to write 7-comparison sort, but the code > > > > was too long (a lot of inner if-then-else) instead of > > > > 9 compact lines. Do you have suggestion how to implement > > > > a nice 7-comparison sort? I tried also selection and bubble > > > > sorts, but insertion sort shows better time. > > > > > > > > Josh, > > > > Could you please review the last changes (especially javadoc > > > > and comments)? > > > > > > > > Thank you, > > > > Vladimir > > > > > > > > Dmytro Sheyko wrote: > > > > > Hi Vladimir, > > > > > > > > > > As for me, everything seems good. > > > > > > > > > > Returning to the theoretical background, could you estimate > number of > > > > > comparison and assignments? These should be less than in your > initial > > > > > version. > > > > > > > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > > > > candidates instead of 9-comparison sorting network? > > > > > > > > > > Thank you, > > > > > Dmytro Sheyko > > > > > > > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > > > > From: iaroslavski at mail.ru > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > I added more comments, please, review attached version. > > > > > > > > > > > > >> So, we win 2-3% ! > > > > > > > > > > > > On [partial] sorted inputs new version runs more faster than few > > > > > percents: > > > > > > > > > > > > organ pipes > > > > > > this: 6896 > > > > > > prev: 7424 > > > > > > jdk7: 8018 > > > > > > jdk6: 12502 > > > > > > > > > > > > ascendant > > > > > > this: 2877 > > > > > > prev: 3845 > > > > > > jdk7: 4583 > > > > > > jdk6: 9019 > > > > > > > > > > > > descendant > > > > > > this: 3287 > > > > > > prev: 4110 > > > > > > jdk7: 4897 > > > > > > jdk6: 9132 > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > That's great! Thank you. > > > > > > > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > Quicksort > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > > > > value (if any) or all leading negative" and with my > optimization > > > > > > > > for all types. I added two while loops before partitioning to > > > > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > > > > > > > if (pivot1 != pivot2) { > > > > > > > > /* ... */ > > > > > > > > a[e2] = a[less]; > > > > > > > > a[e4] = a[great]; > > > > > > > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > > > > > > > /* ... */ > > > > > > > > outer: > > > > > > > > for (int k = less; k <= great; k++) { > > > > > > > > ... > > > > > > > > } > > > > > > > > > > > > > > > > Here is benchmark result (in compare with quicksort from > JDK 6): > > > > > > > > > > > > > > > > client server > > > > > > > > ------ ------ > > > > > > > > previous version: 60.70% 48.20% > > > > > > > > current version: 57.22% 46.18% > > > > > > > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > > > > > > > Thank you, > > > > > > > > Vladimir > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > > > > modification. It > > > > > > > > > appeared that number of negative zeros were changed during > > > general > > > > > > > sort. > > > > > > > > > As I can see you already fixed this issue. Well, my > > > > > modification was > > > > > > > > > based on assumption that we can speed up eliminating > > > explicit array > > > > > > > > > range checks. > > > > > > > > > However, such assumption is wrong because Hotspot > anyway emits > > > > > range > > > > > > > > > checks at its discretion and therefore processZeros > generally > > > > > does not > > > > > > > > > work as fast as I expected. > > > > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > > > > > > > As for the latest code you posted. Doesn't it make > sense to > > > skip > > > > > > > leading > > > > > > > > > negative zeros before farther processing? In this case > we avoid > > > > > > > > > unnecessary assigning +0.0 and then -0.0 to the same > > > location a[k] > > > > > > > (i.e. > > > > > > > > > where k == p). > > > > > > > > > > > > > > > > > > /* > > > > > > > > > * Skip the last negative value (if any) or all leading > negative > > > > > > > > > zeros > > > > > > > > > */ > > > > > > > > > while (left <= right && > Double.doubleToRawLongBits(a[left]) > > > < 0) { > > > > > > > > > left++; > > > > > > > > > } > > > > > > > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > > > > double ak = a[k]; > > > > > > > > > if (ak != 0.0d) { > > > > > > > > > return; > > > > > > > > > } > > > > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > > > > a[k] = 0.0d; > > > > > > > > > a[p++] = -0.0d; > > > > > > > > > } > > > > > > > > > } > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > > Quicksort > > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did > > > little bit > > > > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code > became > > > > > > > > > > > consistent with main sort method and more compact. > Also > > > I use > > > > > > > > > > > more usual "i--" and "i++" in for loops (instead of > "--i", > > > > > "++i. > > > > > > > > > > > > > > > > > > > > > > To accent the difference between float/double and > other > > > types, > > > > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > > > > */ > > > > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > ..... > > > > > > > > > > > */ > > > > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > >> Vladimir, > > > > > > > > > > >> > > > > > > > > > > >> I can see that you changed > > > sortNegZeroAndNaN(float[]...) but > > > > > > > probably > > > > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > > > > >> > > > > > > > > > > >> You really puzzled me with failed testcase and > note that > > > > > sorting > > > > > > > > > > >> algorithm (without special attention to zeros) > > > generally may > > > > > > > change > > > > > > > > > > >> number of negative zeros. > > > > > > > > > > >> I will provide my comments later. > > > > > > > > > > >> > > > > > > > > > > >> As for counting sort, I think we should use single > format > > > > > > > style over > > > > > > > > > > >> the file (unless we have valuable reason not to do > > > this). I > > > > > > > mean to > > > > > > > > > > >> choose > > > > > > > > > > >> 1) > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > >> return; > > > > > > > > > > >> } > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > >> 2) > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > >> } else { > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > >> } > > > > > > > > > > >> I prefer the second one. > > > > > > > > > > >> > > > > > > > > > > >> Thanks a lot, > > > > > > > > > > >> Dmytro Sheyko > > > > > > > > > > >> > > > > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > > > > >> > Subject: Re: New portion of improvements for > Dual-Pivot > > > > > > > Quicksort > > > > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > >> > > > > > > > > > > > >> > Hello, > > > > > > > > > > >> > > > > > > > > > > > >> > I've run your modification for counting sort, it > real > > > > > faster. > > > > > > > > > > >> > I attached new version with your changes (I did > > > little bit > > > > > > > > > > >> > format it) and included my case with float/double. > > > > > > > > > > >> > > > > > > > > > > > >> > Note that you modification doesn't pass test from > > > > > Sorting class, > > > > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > > > > >> > > > > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = > > > 9, n = > > > > > > > 10, p = 9 > > > > > > > > > > >> > > > > > > > > > > > >> > I suggest shorter method (which is based on your > > > idea to > > > > > skip > > > > > > > > > counting > > > > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > > > > index (or > > > > > > > > > it will > > > > > > > > > > >> > be index of first positive element if no zeros > at all, > > > > > or last > > > > > > > > > > >> negative, > > > > > > > > > > >> > if no positive and zero elements) and then swap > negative > > > > > > > zero to the > > > > > > > > > > >> > beginning of the sub-range. > > > > > > > > > > >> > > > > > > > > > > > >> > int hi = right; > > > > > > > > > > >> > > > > > > > > > > > >> > while (left < hi) { > > > > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > > > > >> > float middleValue = a[middle]; > > > > > > > > > > >> > > > > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > > > > >> > left = middle + 1; > > > > > > > > > > >> > } else { > > > > > > > > > > >> > hi = middle; > > > > > > > > > > >> > } > > > > > > > > > > >> > } > > > > > > > > > > >> > > > > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > > > > >> > float ak = a[k]; > > > > > > > > > > >> > if (ak != 0.0f) { > > > > > > > > > > >> > return; > > > > > > > > > > >> > } > > > > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is > -0.0f > > > > > > > > > > >> > a[k] = +0.0f; > > > > > > > > > > >> > a[p++] = -0.0f; > > > > > > > > > > >> > } > > > > > > > > > > >> > } > > > > > > > > > > >> > > > > > > > > > > > >> > Important note: in partitioning loop there are > several > > > > > places > > > > > > > > > > >> > (marked by // !) where potential bug with -0.0 > could be > > > > > > > > > > >> > (when pivot and a[great] are zeros with different > > > signs): > > > > > > > > > > >> > > > > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > >> > + a[less++] = a[great]; > > > > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > > > > >> > a[k] = a[great]; > > > > > > > > > > >> > } > > > > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > > > > >> > + a[great--] = ak; > > > > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > >> > + a[less++] = ak; > > > > > > > > > > >> > } > > > > > > > > > > >> > > > > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > > > > >> > > > > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for > all types > > > > > > > > > > >> > and "pivot1 -> a[great]" in float/double > sections only. > > > > > > > > > > >> > > > > > > > > > > > >> > Please, review format changes for counting sort > and new > > > > > version > > > > > > > > > > >> > of Phase 3 for float/double. > > > > > > > > > > >> > > > > > > > > > > > >> > Thank you, > > > > > > > > > > >> > Vladimir > > > > > > > > > > >> > > > > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > > > > >> > > Hi, > > > > > > > > > > >> > > > > > > > > > > > > >> > > About counting sort again. > > > > > > > > > > >> > > > > > > > > > > > > >> > > 1. This condition "i < count.length && k <= > right" is > > > > > > > excessive. > > > > > > > > > > >> Any one > > > > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > > > > >> > > 2. No need to calculate "short value = (short) > (i + > > > > > > > > > > >> Short.MIN_VALUE)" > > > > > > > > > > >> > > when "count[i]" is zero. > > > > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > > > > better loop > > > > > > > > > > >> backward. > > > > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit > > > looping > > > > > > > earlier > > > > > > > > > > >> > > assuming that typically we work with positive > numbers. > > > > > > > > > > >> > > For unsigned primitives (char) we would better > loop > > > > > forward > > > > > > > > > because > > > > > > > > > > >> > > typically we work with characters about zero > (ASCII). > > > > > > > > > > >> > > > > > > > > > > > > >> > > - 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--) { > > > > > > > > > > >> > > - a[k++] = value; > > > > > > > > > > >> > > - } > > > > > > > > > > >> > > - } > > > > > > > > > > >> > > > > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = > toIndex - > > > 1; k >= > > > > > > > > > > >> > > fromIndex; --i) { > > > > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > > > > >> > > + int s = count[i]; > > > > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > > > > >> > > + } > > > > > > > > > > >> > > > > > > > > > > > > >> > > Thanks, > > > > > > > > > > >> > > Dmytro Sheyko > > > > > > > > > > >> > > > > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; > > > iaroslavski at mail.ru > > > > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > > > > Dual-Pivot > > > > > > > > > > >> Quicksort > > > > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > Sounds good! > > > > > > > > > > >> > > > Will consider too... > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? > Dmytro > > > Sheyko > > > > > > > > > > >> > > : > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > > Hi, > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > Regarding counting sort. We can check > whether we > > > > > should > > > > > > > > > > >> switch to > > > > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > > > > Dual-Pivot > > > > > > > > > > >> Quicksort > > > > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run > > > tests again > > > > > > > > > with you > > > > > > > > > > >> > > changes. > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > > > > >> > > > > > Vladimir > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > > > > >> > > > > > > Hello, > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > > > > >> Double.doubleToLongBits and > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > > > > Float.floatToIntBits. > > > > > > > > > > >> > > > > > > No need to handle NaN's because they > all are > > > > > placed to > > > > > > > > > > >> the end > > > > > > > > > > >> > > of array. > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > > > > Long.MIN_VALUE and > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > > > > Integer.MIN_VALUE. > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more > efficient > > > > > (or at > > > > > > > > > > >> least not > > > > > > > > > > >> > > worse) > > > > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > > > > Float.floatToIntBits(ak)) > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && > Float.floatToIntBits(ak) > > > < 0) > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > > > > negative zeros > > > > > > > > > after > > > > > > > > > > >> > > sorting. > > > > > > > > > > >> > > > > > > General sorting algorithm puts both > > > negative and > > > > > > > positive > > > > > > > > > > >> zeros > > > > > > > > > > >> > > together > > > > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > > > > >> > > > > > > Therefore we have to process less > elements > > > because > > > > > > > > > > >> usually we > > > > > > > > > > >> > > have less > > > > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; > > > jjb at google.com > > > > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > iaroslavski at mail.ru > > > > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of > > > improvements for > > > > > > > > > Dual-Pivot > > > > > > > > > > >> > > Quicksort > > > > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, > review the > > > > > changes. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 > ?????? ?? > > > > > Dmytro > > > > > > > Sheyko > > > > > > > > > > >> > > > > > > : > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero > using > > > binary > > > > > > > search) > > > > > > > > > > >> over > > > > > > > > > > >> > > C (Count > > > > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > > > > core-libs-dev at openjdk.java.net; > > > > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > > > > improvements for > > > > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 > +0400 > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested > variants, and > > > > > > > found that > > > > > > > > > > >> case "C" > > > > > > > > > > >> > > > > > > > > > (very interesting approach to > find first > > > > > > > position > > > > > > > > > > >> of zero > > > > > > > > > > >> > > > > > > > > > by counting negative elements) works > > > > > slower than > > > > > > > > > > >> original > > > > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are > very > > > close > > > > > > > to each > > > > > > > > > > >> other > > > > > > > > > > >> > > > > > > > > > and little bit faster than > original. I > > > > > > > prefer case > > > > > > > > > > >> "F": > > > > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do > you > > > agree? > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated > DualPivotQuicksort > > > > > file and > > > > > > > > > > >> send it > > > > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 > ?????? > > > > > ?? Dmytro > > > > > > > > > > >> Sheyko > > > > > > > > > > >> > > > > > > : > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > > > > comments/proposals > > > > > > > > > > >> regarding > > > > > > > > > > >> > > dealing > > > > > > > > > > >> > > > > > > with negative zeros. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero > we can > > > > > > > avoid range > > > > > > > > > > >> check > > > > > > > > > > >> > > (i >= > > > > > > > > > > >> > > > > > > left) if we have at least one negative > value. > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > Tue May 11 > > > > > > > > > 09:04:19 2010 > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed > > > May 12 > > > > > > > 12:10:46 > > > > > > > > > > >> 2010 > > > > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > left, n); > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > left && > > > > > > > a[i] == > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, > left, n); > > > > > > > > > > >> > > > > > > > > > > + > > > > > > > > > > >> > > > > > > > > > > + // there is at least one > negative > > > > > value, so > > > > > > > > > range > > > > > > > > > > >> > > check is > > > > > > > > > > >> > > > > > > not needed > > > > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; > /*i >= > > > > > left &&*/ > > > > > > > > > > >> a[i] == > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > > > > >> > > > > > > > > > > + } > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > positive zeros > > > > > > > > > back into > > > > > > > > > > >> > > negative zeros > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of > the > > > first > > > > > > > zero by > > > > > > > > > > >> counting > > > > > > > > > > >> > > > > > > negative values during preprocessing > phase. > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > Tue May 11 > > > > > > > > > 09:04:19 2010 > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed > > > May 12 > > > > > > > 12:01:24 > > > > > > > > > > >> 2010 > > > > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros > > > and move > > > > > > > NaNs to > > > > > > > > > > >> end of > > > > > > > > > > >> > > array. > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > > > > numNegativeValues = 0; > > > > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // > i.e., ak > > > is NaN > > > > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > left, n); > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = > numNegativeValues; > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= > > > left && > > > > > > > a[i] == > > > > > > > > > > >> 0.0f; > > > > > > > > > > >> > > i--) { > > > > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to > find > > > > > the first > > > > > > > > > > >> zero and > > > > > > > > > > >> > > thus > > > > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > Tue May 11 > > > > > > > > > 09:04:19 2010 > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed > > > May 12 > > > > > > > 12:03:58 > > > > > > > > > > >> 2010 > > > > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > left, n); > > > > > > > > > > >> > > > > > > > > > > - > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > left && > > > > > > > a[i] == > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > >> > > > > > > > > > > - } > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > > > > left, n); > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > positive zeros > > > > > > > > > back into > > > > > > > > > > >> > > negative zeros > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = > > > zeroIndex + > > > > > > > > > > >> > > numNegativeZeros; i < > > > > > > > > > > >> > > > > > > m; i++) { > > > > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > > > > element > > > > > > > in the > > > > > > > > > > >> > > specified > > > > > > > > > > >> > > > > > > range via > > > > > > > > > > >> > > > > > > > > > > + * Returns the index of the > first > > > zero > > > > > > > element > > > > > > > > > > >> in the > > > > > > > > > > >> > > > > > > specified range via > > > > > > > > > > >> > > > > > > > > > > * binary search. The range is > assumed > > > > > to be > > > > > > > > > > >> sorted, and > > > > > > > > > > >> > > must > > > > > > > > > > >> > > > > > > contain > > > > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > > > > >> > > > > > > > > > > * > > > > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > > > > >> > > > > > > > > > > * @param low the index of the > first > > > > > element, > > > > > > > > > > >> inclusive, > > > > > > > > > > >> > > to be > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > >> > > > > > > > > > > * @param high the index of the > last > > > > > element, > > > > > > > > > > >> inclusive, > > > > > > > > > > >> > > to be > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > >> > > > > > > > > > > - private static int > > > > > findAnyZero(float[] a, > > > > > > > > > int low, > > > > > > > > > > >> > > int high) { > > > > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > > > > >> > > > > > > > > > > + private static int > > > > > findFirstZero(float[] > > > > > > > a, int > > > > > > > > > > >> low, > > > > > > > > > > >> > > int high) { > > > > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values > appeared more > > > > > > > expensive > > > > > > > > > > >> than > > > > > > > > > > >> > > any other > > > > > > > > > > >> > > > > > > variants. > > > > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > > > > efficient > > > > > > > as the > > > > > > > > > > >> current > > > > > > > > > > >> > > > > > > solution is in its worst case - when > we have > > > > > only one > > > > > > > > > > >> negative > > > > > > > > > > >> > > zero (in > > > > > > > > > > >> > > > > > > the half of array). > > > > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > > > > have many > > > > > > > > > zeros. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > > > > dmytro_sheyko at hotmail.com > > > > > > > > > > >> > > > > > > > > > > > CC: > core-libs-dev at openjdk.java.net; > > > > > > > > > > >> iaroslavski at mail.ru > > > > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > > > > improvements for > > > > > > > > > > >> > > Dual-Pivot > > > > > > > > > > >> > > > > > > Quicksort > > > > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 > 23:51:27 +0400 > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly > testing > > > > > "great - > > > > > > > > > > >> less > 5 * > > > > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > > > > >> > > > > > > > > > > > and found that more > symmetric code > > > > > "less > > > > > > > < e1 && > > > > > > > > > > >> > > great > e5" > > > > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has > not been > > > > > > > changed. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest > version in > > > > > > > attachment. > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > > > > ?????? ?? > > > > > > > Joshua > > > > > > > > > > >> Bloch > > > > > > > > > > >> > > > > > > : > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > > e5) { > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * > > > seventh) { > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > > > > >> > > > > > > > > > > > >Josh From dmytro_sheyko at hotmail.com Wed Jun 2 15:21:41 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Wed, 2 Jun 2010 22:21:41 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4C0662B1.8040703@mail.ru> References: , , <4BF2AAEE.1040706@mail.ru>, <4BF3BFFD.8010007@mail.ru>,<4BF3C05C.7010300@mail.ru> , <4BF69AFB.8060406@mail.ru> , <4BFB716B.4020107@mail.ru> , <4BFD1021.1030404@mail.ru> , <4C04F1A3.4040907@mail.ru>, , <4C0662B1.8040703@mail.ru> Message-ID: Sure, The average number of swaps is 5 = 600/120. // bubble // [4 5][3 4][2 3][1 2][2 3][3 4][4 5][3 4][2 3][3 4] // size 10 // swaps 600 // loads 11 // delay 10 // n! = (60/120=50%)(80/120=66%)(90/120=75%)(96/120=80%)(54/120=45%)(72/120=60%)(72/120=60%)(28/120=23%)(36/120=30%)(12/120=10%)[600/1200=50%] // 2^n = (8/32=25%)(12/32=37%)(14/32=43%)(15/32=46%)(7/32=21%)(9/32=28%)(7/32=21%)(3/32=9%)(4/32=12%)(1/32=3%)[80/320=25%] It seems that such property as number of swaps does not really matter too much. I can conjecture that what really matters here is the number of loads. I guess that CPU cannot execute two compare-and-swap steps concurrently, so minimizing delay is senseless and even harmful. On the contrary, we can minimize number of loads (assuming that all 5 elements cannot be housed in CPU registers) if every compare-and-swap step uses one of variables that its predecessor does. Vladimir, Could you also try schema below? I expect that it should not be worse than "bubble network". It has the same delay, but the average number of swaps (3) is low. // narrowing // [1 5][1 4][1 3][1 2][2 5][2 4][2 3][3 5][3 4][4 5] // size 10 // swaps 360 // loads 11 // delay 10 // n! = (60/120=50%)(40/120=33%)(30/120=25%)(24/120=20%)(40/120=33%)(40/120=33%)(36/120=30%)(30/120=25%)(36/120=30%)(24/120=20%)[360/1200=30%] // 2^n = (8/32=25%)(4/32=12%)(2/32=6%)(1/32=3%)(4/32=12%)(4/32=12%)(3/32=9%)(2/32=6%)(3/32=9%)(1/32=3%)[32/320=10%] if (ae1 > ae5) { t = ae1; ae1 = ae5; ae5 = t; } if (ae1 > ae4) { t = ae1; ae1 = ae4; ae4 = t; } if (ae1 > ae3) { t = ae1; ae1 = ae3; ae3 = t; } if (ae1 > ae2) { t = ae1; ae1 = ae2; ae2 = t; } if (ae2 > ae5) { t = ae2; ae2 = ae5; ae5 = t; } if (ae2 > ae4) { t = ae2; ae2 = ae4; ae4 = t; } if (ae2 > ae3) { t = ae2; ae2 = ae3; ae3 = t; } if (ae3 > ae5) { t = ae3; ae3 = ae5; ae5 = t; } if (ae3 > ae4) { t = ae3; ae3 = ae4; ae4 = t; } if (ae4 > ae5) { t = ae4; ae4 = ae5; ae5 = t; } I also don't mind to change current sorting network to something more efficient (i.e. bubble network or so). However its impact on the whole sorting algorithm seems neglectable especially for large arrays. Thank you, Dmytro Sheyko > Date: Wed, 2 Jun 2010 17:54:57 +0400 > From: iaroslavski at mail.ru > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > To: dmytro_sheyko at hotmail.com > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > I checked sorting for long type and see the same behaviour as for int, > new suggested sorting network doesn't win. > > 10-steps bubble sort shows the almost the same results as on int: > wins ~0.3% on client, and 0.8% on server. > > Should we use 10-steps bubble sort instead of sorting network > (which has bubble sorting structure as well)? For code it will be > extra one line. > > Dmytro, > Could you please, run your counting test on bubble sort? > What is the average count of swaps? > > The schema is [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > Dmytro Sheyko wrote: > > Hi Vladimir, > > > > > Which sorting algorithm we should use? > > > > > > 1. Network - compact, 9 lines of code > > > 2. Bubble - also compact, 10 lines of code > > > 3. Insertion - faster, but 39 lines of code > > > > I think that the gain is not worth the complexity. So, maybe, just leave > > it as it is. > > > > > Date: Tue, 1 Jun 2010 15:40:19 +0400 > > > From: iaroslavski at mail.ru > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > To: dmytro_sheyko at hotmail.com > > > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > > > > > Hi Dmytro, > > > > > > Very interesting investigation, thank you very much! > > > > > > I tried you suggested sorting network, but all versions work the same. > > > Then I used bubble sort (10 comparisons) and it shows better > > > results: on client it is faster on 0.2%, server - 0.8%, not too > > > much, but faster. > > > > > > The schema is (bubble sort with changes of direction): > > > [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > > > > > And moreover: if we use insertion sort for sorting of 5 candidates: > > > > > > int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > > > > > if (ae2 < a[e1]) { > > > a[e2] = a[e1]; a[e1] = ae2; > > > } > > > if (ae3 < a[e2]) { > > > if (ae3 < a[e1]) { > > > a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae3; > > > } else { > > > a[e3] = a[e2]; a[e2] = ae3; > > > } > > > } > > > if (ae4 < a[e2]) { > > > if (ae4 < a[e1]) { > > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae4; > > > } else { > > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae4; > > > } > > > } else { > > > if (ae4 < a[e3]) { > > > a[e4] = a[e3]; a[e3] = ae4; > > > } > > > } > > > if (ae5 < a[e2]) { > > > if (ae5 < a[e1]) { > > > a[e5]=a[e4];a[e4]=a[e3];a[e3]=a[e2];a[e2]=a[e1];a[e1]=ae5; > > > } else { > > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae5; > > > } > > > } else { > > > if (ae5 < a[e3]) { > > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = ae5; > > > } > > > else { > > > if (ae5 < a[e4]) { > > > a[e5] = a[e4]; a[e4] = ae5; > > > } > > > } > > > } > > > > > > it shows better results than bubble sort: > > > client - 0.37%, server - 1.03% > > > > > > Which sorting algorithm we should use? > > > > > > 1. Network - compact, 9 lines of code > > > 2. Bubble - also compact, 10 lines of code > > > 3. Insertion - faster, but 39 lines of code > > > > > > Regards, > > > Vladimir > > > > > > Dmytro Sheyko wrote: > > > > Corrections. > > > > 1. The sixth comparator in current network (that swaps with 90% > > > > probability) is [2 3] not [0 3]. > > > > 2. The average number of swaps are > > > > 576/120 = 4.8 for current network and > > > > 376/120 = 3.1(3...) for proposed network. > > > > > > > > > > ------------------------------------------------------------------------ > > > > From: dmytro_sheyko at hotmail.com > > > > To: iaroslavski at mail.ru; joshua.bloch at google.com > > > > Subject: RE: New portion of improvements for Dual-Pivot Quicksort > > > > Date: Tue, 1 Jun 2010 14:59:07 +0700 > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > Hi Vladimir, > > > > > > > > I cannot write 7-comparison sort briefly as well. However I think > > we can > > > > optimize sorting network a bit. > > > > We can consider such properties as > > > > 1. size, i.e. number of comparators > > > > 2. delay, i.e. number of parallel steps (some comparisons and swaps > > can > > > > be done concurrently) > > > > 3. average number of swaps. > > > > > > > > The current sorting network > > > > [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] > > > > has size 9 and delay 5. > > > > These values are good enough. Generally we cannot write it shorter (in > > > > order to improve size) and combine more than 2 comparison in a > > parallel > > > > step (in order to improve delay). > > > > > > > > However the average number of swaps seems too high. It performs 576 > > > > swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) > > > > I tried every permutation of 5 distinct values. > > > > There is a profile per comparator: > > > > > > (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] > > > > The first two comparison offer probability of swap as 50%, which is > > > > natural. However the sixth comparator (i.e. [0 3]) swaps with > > > > probability 90%, i.e. almost always! > > > > > > > > The one of the best sorting network (I have found) with the same size > > > > and delay is following > > > > [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] > > > > Its average number of swaps is 376. > > > > And here is a profile: > > > > > > (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] > > > > > > > > Regards, > > > > Dmytro Sheyko > > > > > > > > > Date: Wed, 26 May 2010 16:12:17 +0400 > > > > > From: iaroslavski at mail.ru > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > Hello Dmytro, > > > > > > > > > > Theoretical investigations are based on simple model, > > > > > which doesn't take into account many optimizations > > > > > like "equal pivots", "scan equal to pivots", etc. > > > > > Model based on the implementation will be too complex > > > > > to be analyzed. > > > > > > > > > > But it is easy to count comparisons and assignments, > > > > > if I change them by functions with counter. > > > > > > > > > > Also I tried to write 7-comparison sort, but the code > > > > > was too long (a lot of inner if-then-else) instead of > > > > > 9 compact lines. Do you have suggestion how to implement > > > > > a nice 7-comparison sort? I tried also selection and bubble > > > > > sorts, but insertion sort shows better time. > > > > > > > > > > Josh, > > > > > Could you please review the last changes (especially javadoc > > > > > and comments)? > > > > > > > > > > Thank you, > > > > > Vladimir > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > Hi Vladimir, > > > > > > > > > > > > As for me, everything seems good. > > > > > > > > > > > > Returning to the theoretical background, could you estimate > > number of > > > > > > comparison and assignments? These should be less than in your > > initial > > > > > > version. > > > > > > > > > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > > > > > candidates instead of 9-comparison sorting network? > > > > > > > > > > > > Thank you, > > > > > > Dmytro Sheyko > > > > > > > > > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > > > > > From: iaroslavski at mail.ru > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > I added more comments, please, review attached version. > > > > > > > > > > > > > > >> So, we win 2-3% ! > > > > > > > > > > > > > > On [partial] sorted inputs new version runs more faster than few > > > > > > percents: > > > > > > > > > > > > > > organ pipes > > > > > > > this: 6896 > > > > > > > prev: 7424 > > > > > > > jdk7: 8018 > > > > > > > jdk6: 12502 > > > > > > > > > > > > > > ascendant > > > > > > > this: 2877 > > > > > > > prev: 3845 > > > > > > > jdk7: 4583 > > > > > > > jdk6: 9019 > > > > > > > > > > > > > > descendant > > > > > > > this: 3287 > > > > > > > prev: 4110 > > > > > > > jdk7: 4897 > > > > > > > jdk6: 9132 > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > That's great! Thank you. > > > > > > > > > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > Quicksort > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > > > > > value (if any) or all leading negative" and with my > > optimization > > > > > > > > > for all types. I added two while loops before partitioning to > > > > > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > > > > > > > > > if (pivot1 != pivot2) { > > > > > > > > > /* ... */ > > > > > > > > > a[e2] = a[less]; > > > > > > > > > a[e4] = a[great]; > > > > > > > > > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > > > > > > > > > /* ... */ > > > > > > > > > outer: > > > > > > > > > for (int k = less; k <= great; k++) { > > > > > > > > > ... > > > > > > > > > } > > > > > > > > > > > > > > > > > > Here is benchmark result (in compare with quicksort from > > JDK 6): > > > > > > > > > > > > > > > > > > client server > > > > > > > > > ------ ------ > > > > > > > > > previous version: 60.70% 48.20% > > > > > > > > > current version: 57.22% 46.18% > > > > > > > > > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > > > > > modification. It > > > > > > > > > > appeared that number of negative zeros were changed during > > > > general > > > > > > > > sort. > > > > > > > > > > As I can see you already fixed this issue. Well, my > > > > > > modification was > > > > > > > > > > based on assumption that we can speed up eliminating > > > > explicit array > > > > > > > > > > range checks. > > > > > > > > > > However, such assumption is wrong because Hotspot > > anyway emits > > > > > > range > > > > > > > > > > checks at its discretion and therefore processZeros > > generally > > > > > > does not > > > > > > > > > > work as fast as I expected. > > > > > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > > > > > > > > > As for the latest code you posted. Doesn't it make > > sense to > > > > skip > > > > > > > > leading > > > > > > > > > > negative zeros before farther processing? In this case > > we avoid > > > > > > > > > > unnecessary assigning +0.0 and then -0.0 to the same > > > > location a[k] > > > > > > > > (i.e. > > > > > > > > > > where k == p). > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > * Skip the last negative value (if any) or all leading > > negative > > > > > > > > > > zeros > > > > > > > > > > */ > > > > > > > > > > while (left <= right && > > Double.doubleToRawLongBits(a[left]) > > > > < 0) { > > > > > > > > > > left++; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > > > > > double ak = a[k]; > > > > > > > > > > if (ak != 0.0d) { > > > > > > > > > > return; > > > > > > > > > > } > > > > > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > > > > > a[k] = 0.0d; > > > > > > > > > > a[p++] = -0.0d; > > > > > > > > > > } > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > > > Quicksort > > > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did > > > > little bit > > > > > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code > > became > > > > > > > > > > > > consistent with main sort method and more compact. > > Also > > > > I use > > > > > > > > > > > > more usual "i--" and "i++" in for loops (instead of > > "--i", > > > > > > "++i. > > > > > > > > > > > > > > > > > > > > > > > > To accent the difference between float/double and > > other > > > > types, > > > > > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > > > > > */ > > > > > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > > ..... > > > > > > > > > > > > */ > > > > > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > >> Vladimir, > > > > > > > > > > > >> > > > > > > > > > > > >> I can see that you changed > > > > sortNegZeroAndNaN(float[]...) but > > > > > > > > probably > > > > > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > > > > > >> > > > > > > > > > > > >> You really puzzled me with failed testcase and > > note that > > > > > > sorting > > > > > > > > > > > >> algorithm (without special attention to zeros) > > > > generally may > > > > > > > > change > > > > > > > > > > > >> number of negative zeros. > > > > > > > > > > > >> I will provide my comments later. > > > > > > > > > > > >> > > > > > > > > > > > >> As for counting sort, I think we should use single > > format > > > > > > > > style over > > > > > > > > > > > >> the file (unless we have valuable reason not to do > > > > this). I > > > > > > > > mean to > > > > > > > > > > > >> choose > > > > > > > > > > > >> 1) > > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > > >> return; > > > > > > > > > > > >> } > > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > > >> 2) > > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > > >> } else { > > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > > >> } > > > > > > > > > > > >> I prefer the second one. > > > > > > > > > > > >> > > > > > > > > > > > >> Thanks a lot, > > > > > > > > > > > >> Dmytro Sheyko > > > > > > > > > > > >> > > > > > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > > > > > >> > Subject: Re: New portion of improvements for > > Dual-Pivot > > > > > > > > Quicksort > > > > > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > >> > > > > > > > > > > > > >> > Hello, > > > > > > > > > > > >> > > > > > > > > > > > > >> > I've run your modification for counting sort, it > > real > > > > > > faster. > > > > > > > > > > > >> > I attached new version with your changes (I did > > > > little bit > > > > > > > > > > > >> > format it) and included my case with float/double. > > > > > > > > > > > >> > > > > > > > > > > > > >> > Note that you modification doesn't pass test from > > > > > > Sorting class, > > > > > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > > > > > >> > > > > > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = > > > > 9, n = > > > > > > > > 10, p = 9 > > > > > > > > > > > >> > > > > > > > > > > > > >> > I suggest shorter method (which is based on your > > > > idea to > > > > > > skip > > > > > > > > > > counting > > > > > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > > > > > index (or > > > > > > > > > > it will > > > > > > > > > > > >> > be index of first positive element if no zeros > > at all, > > > > > > or last > > > > > > > > > > > >> negative, > > > > > > > > > > > >> > if no positive and zero elements) and then swap > > negative > > > > > > > > zero to the > > > > > > > > > > > >> > beginning of the sub-range. > > > > > > > > > > > >> > > > > > > > > > > > > >> > int hi = right; > > > > > > > > > > > >> > > > > > > > > > > > > >> > while (left < hi) { > > > > > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > > > > > >> > float middleValue = a[middle]; > > > > > > > > > > > >> > > > > > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > > > > > >> > left = middle + 1; > > > > > > > > > > > >> > } else { > > > > > > > > > > > >> > hi = middle; > > > > > > > > > > > >> > } > > > > > > > > > > > >> > } > > > > > > > > > > > >> > > > > > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > > > > > >> > float ak = a[k]; > > > > > > > > > > > >> > if (ak != 0.0f) { > > > > > > > > > > > >> > return; > > > > > > > > > > > >> > } > > > > > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is > > -0.0f > > > > > > > > > > > >> > a[k] = +0.0f; > > > > > > > > > > > >> > a[p++] = -0.0f; > > > > > > > > > > > >> > } > > > > > > > > > > > >> > } > > > > > > > > > > > >> > > > > > > > > > > > > >> > Important note: in partitioning loop there are > > several > > > > > > places > > > > > > > > > > > >> > (marked by // !) where potential bug with -0.0 > > could be > > > > > > > > > > > >> > (when pivot and a[great] are zeros with different > > > > signs): > > > > > > > > > > > >> > > > > > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > > >> > + a[less++] = a[great]; > > > > > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > > > > > >> > a[k] = a[great]; > > > > > > > > > > > >> > } > > > > > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > > > > > >> > + a[great--] = ak; > > > > > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > > >> > + a[less++] = ak; > > > > > > > > > > > >> > } > > > > > > > > > > > >> > > > > > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > > > > > >> > > > > > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for > > all types > > > > > > > > > > > >> > and "pivot1 -> a[great]" in float/double > > sections only. > > > > > > > > > > > >> > > > > > > > > > > > > >> > Please, review format changes for counting sort > > and new > > > > > > version > > > > > > > > > > > >> > of Phase 3 for float/double. > > > > > > > > > > > >> > > > > > > > > > > > > >> > Thank you, > > > > > > > > > > > >> > Vladimir > > > > > > > > > > > >> > > > > > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > > > > > >> > > Hi, > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > About counting sort again. > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > 1. This condition "i < count.length && k <= > > right" is > > > > > > > > excessive. > > > > > > > > > > > >> Any one > > > > > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > > > > > >> > > 2. No need to calculate "short value = (short) > > (i + > > > > > > > > > > > >> Short.MIN_VALUE)" > > > > > > > > > > > >> > > when "count[i]" is zero. > > > > > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > > > > > better loop > > > > > > > > > > > >> backward. > > > > > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit > > > > looping > > > > > > > > earlier > > > > > > > > > > > >> > > assuming that typically we work with positive > > numbers. > > > > > > > > > > > >> > > For unsigned primitives (char) we would better > > loop > > > > > > forward > > > > > > > > > > because > > > > > > > > > > > >> > > typically we work with characters about zero > > (ASCII). > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > - 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--) { > > > > > > > > > > > >> > > - a[k++] = value; > > > > > > > > > > > >> > > - } > > > > > > > > > > > >> > > - } > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = > > toIndex - > > > > 1; k >= > > > > > > > > > > > >> > > fromIndex; --i) { > > > > > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > > > > > >> > > + int s = count[i]; > > > > > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > > > > > >> > > + } > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > Thanks, > > > > > > > > > > > >> > > Dmytro Sheyko > > > > > > > > > > > >> > > > > > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; > > > > iaroslavski at mail.ru > > > > > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > > > > > Dual-Pivot > > > > > > > > > > > >> Quicksort > > > > > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > Sounds good! > > > > > > > > > > > >> > > > Will consider too... > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? > > Dmytro > > > > Sheyko > > > > > > > > > > > >> > > : > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > > Hi, > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > Regarding counting sort. We can check > > whether we > > > > > > should > > > > > > > > > > > >> switch to > > > > > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > > > > > Dual-Pivot > > > > > > > > > > > >> Quicksort > > > > > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run > > > > tests again > > > > > > > > > > with you > > > > > > > > > > > >> > > changes. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > > > > > >> > > > > > Vladimir > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > >> > > > > > > Hello, > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > > > > > >> Double.doubleToLongBits and > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > > > > > Float.floatToIntBits. > > > > > > > > > > > >> > > > > > > No need to handle NaN's because they > > all are > > > > > > placed to > > > > > > > > > > > >> the end > > > > > > > > > > > >> > > of array. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > > > > > Long.MIN_VALUE and > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > > > > > Integer.MIN_VALUE. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more > > efficient > > > > > > (or at > > > > > > > > > > > >> least not > > > > > > > > > > > >> > > worse) > > > > > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > > > > > Float.floatToIntBits(ak)) > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && > > Float.floatToIntBits(ak) > > > > < 0) > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > > > > > negative zeros > > > > > > > > > > after > > > > > > > > > > > >> > > sorting. > > > > > > > > > > > >> > > > > > > General sorting algorithm puts both > > > > negative and > > > > > > > > positive > > > > > > > > > > > >> zeros > > > > > > > > > > > >> > > together > > > > > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > > > > > >> > > > > > > Therefore we have to process less > > elements > > > > because > > > > > > > > > > > >> usually we > > > > > > > > > > > >> > > have less > > > > > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; > > > > jjb at google.com > > > > > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > > iaroslavski at mail.ru > > > > > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of > > > > improvements for > > > > > > > > > > Dual-Pivot > > > > > > > > > > > >> > > Quicksort > > > > > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, > > review the > > > > > > changes. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 > > ?????? ?? > > > > > > Dmytro > > > > > > > > Sheyko > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero > > using > > > > binary > > > > > > > > search) > > > > > > > > > > > >> over > > > > > > > > > > > >> > > C (Count > > > > > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > > > > > core-libs-dev at openjdk.java.net; > > > > > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > > > > > improvements for > > > > > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 > > +0400 > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested > > variants, and > > > > > > > > found that > > > > > > > > > > > >> case "C" > > > > > > > > > > > >> > > > > > > > > > (very interesting approach to > > find first > > > > > > > > position > > > > > > > > > > > >> of zero > > > > > > > > > > > >> > > > > > > > > > by counting negative elements) works > > > > > > slower than > > > > > > > > > > > >> original > > > > > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are > > very > > > > close > > > > > > > > to each > > > > > > > > > > > >> other > > > > > > > > > > > >> > > > > > > > > > and little bit faster than > > original. I > > > > > > > > prefer case > > > > > > > > > > > >> "F": > > > > > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do > > you > > > > agree? > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated > > DualPivotQuicksort > > > > > > file and > > > > > > > > > > > >> send it > > > > > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 > > ?????? > > > > > > ?? Dmytro > > > > > > > > > > > >> Sheyko > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > > > > > comments/proposals > > > > > > > > > > > >> regarding > > > > > > > > > > > >> > > dealing > > > > > > > > > > > >> > > > > > > with negative zeros. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero > > we can > > > > > > > > avoid range > > > > > > > > > > > >> check > > > > > > > > > > > >> > > (i >= > > > > > > > > > > > >> > > > > > > left) if we have at least one negative > > value. > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > Tue May 11 > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed > > > > May 12 > > > > > > > > 12:10:46 > > > > > > > > > > > >> 2010 > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > left, n); > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > > left && > > > > > > > > a[i] == > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, > > left, n); > > > > > > > > > > > >> > > > > > > > > > > + > > > > > > > > > > > >> > > > > > > > > > > + // there is at least one > > negative > > > > > > value, so > > > > > > > > > > range > > > > > > > > > > > >> > > check is > > > > > > > > > > > >> > > > > > > not needed > > > > > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; > > /*i >= > > > > > > left &&*/ > > > > > > > > > > > >> a[i] == > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > > > > > >> > > > > > > > > > > + } > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > > positive zeros > > > > > > > > > > back into > > > > > > > > > > > >> > > negative zeros > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of > > the > > > > first > > > > > > > > zero by > > > > > > > > > > > >> counting > > > > > > > > > > > >> > > > > > > negative values during preprocessing > > phase. > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > Tue May 11 > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed > > > > May 12 > > > > > > > > 12:01:24 > > > > > > > > > > > >> 2010 > > > > > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros > > > > and move > > > > > > > > NaNs to > > > > > > > > > > > >> end of > > > > > > > > > > > >> > > array. > > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > > > > > numNegativeValues = 0; > > > > > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // > > i.e., ak > > > > is NaN > > > > > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > left, n); > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = > > numNegativeValues; > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= > > > > left && > > > > > > > > a[i] == > > > > > > > > > > > >> 0.0f; > > > > > > > > > > > >> > > i--) { > > > > > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to > > find > > > > > > the first > > > > > > > > > > > >> zero and > > > > > > > > > > > >> > > thus > > > > > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > Tue May 11 > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed > > > > May 12 > > > > > > > > 12:03:58 > > > > > > > > > > > >> 2010 > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > left, n); > > > > > > > > > > > >> > > > > > > > > > > - > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > > left && > > > > > > > > a[i] == > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > > >> > > > > > > > > > > - } > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > > > > > left, n); > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > > positive zeros > > > > > > > > > > back into > > > > > > > > > > > >> > > negative zeros > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = > > > > zeroIndex + > > > > > > > > > > > >> > > numNegativeZeros; i < > > > > > > > > > > > >> > > > > > > m; i++) { > > > > > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > > > > > element > > > > > > > > in the > > > > > > > > > > > >> > > specified > > > > > > > > > > > >> > > > > > > range via > > > > > > > > > > > >> > > > > > > > > > > + * Returns the index of the > > first > > > > zero > > > > > > > > element > > > > > > > > > > > >> in the > > > > > > > > > > > >> > > > > > > specified range via > > > > > > > > > > > >> > > > > > > > > > > * binary search. The range is > > assumed > > > > > > to be > > > > > > > > > > > >> sorted, and > > > > > > > > > > > >> > > must > > > > > > > > > > > >> > > > > > > contain > > > > > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > > > > > >> > > > > > > > > > > * > > > > > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > > > > > >> > > > > > > > > > > * @param low the index of the > > first > > > > > > element, > > > > > > > > > > > >> inclusive, > > > > > > > > > > > >> > > to be > > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > > >> > > > > > > > > > > * @param high the index of the > > last > > > > > > element, > > > > > > > > > > > >> inclusive, > > > > > > > > > > > >> > > to be > > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > > >> > > > > > > > > > > - private static int > > > > > > findAnyZero(float[] a, > > > > > > > > > > int low, > > > > > > > > > > > >> > > int high) { > > > > > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > > > > > >> > > > > > > > > > > + private static int > > > > > > findFirstZero(float[] > > > > > > > > a, int > > > > > > > > > > > >> low, > > > > > > > > > > > >> > > int high) { > > > > > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values > > appeared more > > > > > > > > expensive > > > > > > > > > > > >> than > > > > > > > > > > > >> > > any other > > > > > > > > > > > >> > > > > > > variants. > > > > > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > > > > > efficient > > > > > > > > as the > > > > > > > > > > > >> current > > > > > > > > > > > >> > > > > > > solution is in its worst case - when > > we have > > > > > > only one > > > > > > > > > > > >> negative > > > > > > > > > > > >> > > zero (in > > > > > > > > > > > >> > > > > > > the half of array). > > > > > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > > > > > have many > > > > > > > > > > zeros. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > > > > > dmytro_sheyko at hotmail.com > > > > > > > > > > > >> > > > > > > > > > > > CC: > > core-libs-dev at openjdk.java.net; > > > > > > > > > > > >> iaroslavski at mail.ru > > > > > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > > > > > improvements for > > > > > > > > > > > >> > > Dual-Pivot > > > > > > > > > > > >> > > > > > > Quicksort > > > > > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 > > 23:51:27 +0400 > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly > > testing > > > > > > "great - > > > > > > > > > > > >> less > 5 * > > > > > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > > > > > >> > > > > > > > > > > > and found that more > > symmetric code > > > > > > "less > > > > > > > > < e1 && > > > > > > > > > > > >> > > great > e5" > > > > > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has > > not been > > > > > > > > changed. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest > > version in > > > > > > > > attachment. > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > > > > > ?????? ?? > > > > > > > > Joshua > > > > > > > > > > > >> Bloch > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > > > e5) { > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * > > > > seventh) { > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > > > > > >> > > > > > > > > > > > >Josh _________________________________________________________________ Hotmail: Free, trusted and rich email service. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: From ahughes at redhat.com Wed Jun 2 17:57:35 2010 From: ahughes at redhat.com (Andrew John Hughes) Date: Wed, 2 Jun 2010 18:57:35 +0100 Subject: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs Message-ID: When building with JAVAC_MAX_WARNINGS=true, the build fails in sun/nio/cs due to the use of -Werror. The following webrev: http://cr.openjdk.java.net/~andrew/warnings/webrev.03/ fixes the remaining warnings exposed by JAVAC_MAX_WARNINGS by: * Removing redundant casts * Adding generic types to a number of List, Map and Class instances * Turning off deprecation warnings locally in make/sun/nio/cs/Makefile Ok to push? If so, can I have a bug ID for this? Thanks, -- Andrew :-) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 From martinrb at google.com Thu Jun 3 00:55:48 2010 From: martinrb at google.com (martinrb at google.com) Date: Thu, 03 Jun 2010 00:55:48 +0000 Subject: hg: jdk7/tl/jdk: 6955840: ThreadLocalRandom bug - overriden setSeed(long) method is not invoked for java.util.Random(long) Message-ID: <20100603005559.8989B46EFA@hg.openjdk.java.net> Changeset: 1db252f307b6 Author: martin Date: 2010-06-02 17:53 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/1db252f307b6 6955840: ThreadLocalRandom bug - overriden setSeed(long) method is not invoked for java.util.Random(long) Summary: Allow setSeed only during construction Reviewed-by: dl, dholmes ! src/share/classes/java/util/concurrent/ThreadLocalRandom.java From joe.darcy at oracle.com Thu Jun 3 02:04:02 2010 From: joe.darcy at oracle.com (joe.darcy at oracle.com) Date: Thu, 03 Jun 2010 02:04:02 +0000 Subject: hg: jdk7/tl/langtools: 6933147: Provided new utility visitors supporting SourceVersion.RELEASE_7 Message-ID: <20100603020406.76ACE46EFD@hg.openjdk.java.net> Changeset: 9a7c998bf2fc Author: darcy Date: 2010-06-02 19:08 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/9a7c998bf2fc 6933147: Provided new utility visitors supporting SourceVersion.RELEASE_7 Reviewed-by: jjg ! src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java ! src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java ! src/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java ! src/share/classes/com/sun/tools/javah/JavahTask.java ! src/share/classes/com/sun/tools/javah/LLNI.java ! src/share/classes/com/sun/tools/javah/TypeSignature.java ! src/share/classes/javax/lang/model/element/ElementVisitor.java ! src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java + src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java ! src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java + src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java ! src/share/classes/javax/lang/model/util/AbstractTypeVisitor6.java + src/share/classes/javax/lang/model/util/AbstractTypeVisitor7.java ! src/share/classes/javax/lang/model/util/ElementKindVisitor6.java + src/share/classes/javax/lang/model/util/ElementKindVisitor7.java ! src/share/classes/javax/lang/model/util/ElementScanner6.java + src/share/classes/javax/lang/model/util/ElementScanner7.java ! src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor6.java + src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java ! src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java + src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java ! src/share/classes/javax/lang/model/util/SimpleTypeVisitor6.java + src/share/classes/javax/lang/model/util/SimpleTypeVisitor7.java ! src/share/classes/javax/lang/model/util/TypeKindVisitor6.java + src/share/classes/javax/lang/model/util/TypeKindVisitor7.java ! src/share/sample/javac/processing/src/CheckNamesProcessor.java ! test/tools/javac/6402516/CheckLocalElements.java ! test/tools/javac/api/TestOperators.java ! test/tools/javac/enum/6424358/T6424358.java ! test/tools/javac/processing/model/6194785/T6194785.java ! test/tools/javac/processing/model/type/NoTypes.java ! test/tools/javac/processing/model/util/deprecation/TestDeprecation.java From paul.hohensee at oracle.com Thu Jun 3 15:39:12 2010 From: paul.hohensee at oracle.com (Paul Hohensee) Date: Thu, 03 Jun 2010 11:39:12 -0400 Subject: signal chaining and self defence In-Reply-To: <4BF433F4.2090603@fh-landshut.de> References: <4BF433F4.2090603@fh-landshut.de> Message-ID: <4C07CCA0.6040909@oracle.com> A reply from the same Hotspot engineer. Paul ---- | Is there a reason why signal chaining is not enabled by default on linux/solaris? Just wanted to clarify - signal chaining is enabled by default for the JVM. The way signal chaining works is cooperatively. i.e. when the JVM starts, it "chains", i.e. saves existing signal handlers for the signals it uses. Then when the JVM gets a signal, it first processes it itself and then passes it to the next "chained" signal handler. With cooperative chaining, if the AMD or NVIDIA drivers also supported (or it sounds like will support :-) signal chaining - when the drivers register signal handlers, instead of overwriting existing signal handlers, they will also save them in a chain and pass on signals. The libjsig.so which HAS to be set via a LD_PRELOAD interposes on the system calls for registering signal handlers. It has to be there before any of the subsystems register signal handlers and provides cooperative signal chaining for subsystems that do not provide it themselves. So, the best fix of course is the one you are pursuing, which is asking Nvidia and AMD to also perform cooperative signal chaining. ---- On 5/19/10 2:54 PM, Michael Bien wrote: > Hello Everyone, > > (sorry for the delay, but something went wrong with my subscription, i > haven't noticed that I already got an answer) > > comments inline... > > >> More info from Hotspot engineers. >> >> ---- >> >Does webstart allow running your own native code in an applet? > yes > >> (Does >> plugin while >> >So I am guessing that they have java interfaces using the jvm/JIT >> > - then gluegen -- how does gluegen work here? Is it precompiled >> > gluegen generates very thin JNI binding code, its precompiled -> > nothing at runtime. > > but we have basically two modes: static linking against libOpenCL.so > or dynamic loading and invocation via function pointers which we > currently use for JOGL but not yet for JOCL (except for CL extensions). > > >> or does it do a translation at run time? >> > no > >> > - which talks to OpenCL "C" binaries >> > - there appear to be a set running on the "host" or main CPU, >> > including interfacing to the underlying device drivers, such as >> the amd and nvidia drivers mentioned >> > - which then can also start OpenCL "C" binaries that run on >> auxiliary processors like GPUs >> > yes thats basically how it works > >> >So to answer Michael's question from a VM perspective: >> >> >It appears that the amd and nvidia native drivers that I would guess >> they link to in their >> >"host" code register for the system signals listed below, but don't >> support signal chaining, >> >i.e. they are overwriting the jvm's signal handlers. >> >> >So - the technical solution for that, assuming we can't change the amd >> and nvidia drivers, >> >is to interpose our libjsig.so before their libraries are loaded. This >> lets our vm chain >> >their signal handlers, so that the VM only handles signals that apply >> to the vm and then >> >calls their signal handlers. >> >> >I am guessing they can't link libjsig with their application or he >> would have done so - but >> >it is worth first asking why he can't. >> > Reading the libjsig doc i thought it would not work. > my understanding of libjsig: > it must be loaded before the most of the JVM starts, thats why there > are two options: > 1.) LD_PRELOAD=path/to/libjsig > 2.) link a custom native JVM launcher against libjsig > > since webstart does not allow 2.) it won't help. > > (please correct me if i am wrong here, otherwise the issue is already > solved :) ) > >> >If it is the case that he can not, then he needs to setenv LD_PRELOAD >> /libjsig.so >> >before starting up java. >> >> >Is there a way to do that with WebStart? Is there a way to specify to >> do that? >> No - there is no ability to set any env variables before launching >> java. If jnlp file itself is signed and trusted, you could set system >> propertys before launching java, but not environmental variables. >> > > exactly thats the issue... dead end regarding webstart. > > In the meantime i talked to the Nvidia devs and they will try to > workaround this issue. Looking at the AMD drivers the situation is not > different but for some reasons it appears to run more stable (but this > is probably just luck). So we would have to talk to them too and maybe > other vendors. > > Is there a reason why signal chaining is not enabled by default on > linux/solaris? > If there is a reason, could the webstart launcher enable it only for > webstart on those systems? > > Third way to solve this issue is to introduce a > "-XX:enableSignalChaining" flag as mentioned before and allow it to be > passed via JNLP. > This might work since i heard webstart runs out of process anyway... > so there must be a launcher involved which interprets this flags > before JVM launch. > > > to quote my original mail: > It looks like a good self-defence mechanism for me :) > > thanks for the support, > > best regards, > > Michael Bien > > >> ----- >> >> Paul >> >/ A partial answer: one of the Hotspot engineers says >> />/ >> />/ "I think the short answer is that chaining requires LD_PRELOAD to >> />/ override the signal entry points. Otherwise we [Hotspot] wouldn't see >> />/ the calls that change the signal handlers. If the Java command itself >> />/ linked against jsig that would work too I think. I believe that's the >> />/ only way to solve the problem he is seeing in an automatic fashion. >> />/ Depending on how the driver library gets loaded they might be able to >> />/ build their own signal handler trampolines to work around it and >> />/ correct the signal handlers after it gets loaded." >> />/ >> />/ Regards, >> />/ >> />/ Paul >> />/ >> />/ On 5/8/10 7:31 AM, Michael Bien wrote: >> />>/ Hello everyone, >> />>/ >> />>/ i am one of the maintainers of JOGL and wrote JOCL >> />>/ (http://jogamp.org/) and we are currently facing some signal handling >> />>/ issues caused by the nvidia and amd drivers. >> />>/ (I got the hint to post to this list since there is no better alias >> />>/ for this kind of topics) >> />>/ >> />>/ e.g. the nvidia OpenCL driver uses at least the following handlers: >> />>/ Warning: SIGSEGV handler expected:libjvm.so+0x5d8cf0 >> />>/ found:libnvidia-compiler.so+0x1865e0 >> />>/ Warning: SIGILL handler expected:libjvm.so+0x5d8cf0 >> />>/ found:libnvidia-compiler.so+0x1865e0 >> />>/ Warning: SIGFPE handler expected:libjvm.so+0x5d8cf0 >> />>/ found:libnvidia-compiler.so+0x1865e0 >> />>/ Warning: SIGBUS handler expected:libjvm.so+0x5d8cf0 >> />>/ found:libnvidia-compiler.so+0x1865e0 >> />>/ Warning: SIGXFSZ handler expected:libjvm.so+0x5d8cf0 >> />>/ found:libnvidia-compiler.so+0x1865e0 >> />>/ (-Xcheck:jni) >> />>/ >> />>/ which basically makes the jvm unusable on Linux and leads to >> />>/ segmentation faults (in the driver, I suppose the driver catches jvm >> />>/ signals). >> />>/ >> />>/ LD_PRELOAD >> />>/ (http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html#gbzbl) >> />>/ works perfectly but it is not allowed for webstart + applets... >> />>/ >> />>/ do you have any advice how we could workaround this issue? The >> />>/ perfect solution would be a "-XX:enableSignalChaining" flag which we >> />>/ could set via jnlp. Since the webstart JVM is out of process anyway >> />>/ (since u10 or so) this would probably work. >> />>/ >> />>/ Why isn't signal chaining enabled by default on linux and solaris? It >> />>/ looks like a good self-defence mechanism for me :) >> />>/ >> />>/ best regards, >> />>/ Michael Bien >> />>/ >> />>/ --- >> />>/ >> />>/ http://michael-bien.com >> /-------------- next part -------------- >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From mbien at fh-landshut.de Thu Jun 3 16:05:38 2010 From: mbien at fh-landshut.de (Michael Bien) Date: Thu, 03 Jun 2010 18:05:38 +0200 Subject: signal chaining and self defence In-Reply-To: <4C07CCA0.6040909@oracle.com> References: <4BF433F4.2090603@fh-landshut.de> <4C07CCA0.6040909@oracle.com> Message-ID: <4C07D2D2.3090500@fh-landshut.de> Thanks Paul for the delegation and of course to the anonymous Hotspot engineer for the help :) we will probably be able to test very soon Nvidia drivers with the fix in it... lets see how it will work out. Lets hope we won't have to file bug report against all other vendors in future too... I understand that this topic might be low priority for overall JVM development but it would have been nice to have a way to enable libjsig for webstart/applet applications, since LD_PRELOAD is not an option for this deployment mechanism. best regards, and thanks again, michael bien On 06/03/2010 05:39 PM, Paul Hohensee wrote: > A reply from the same Hotspot engineer. > > Paul > > ---- > > | Is there a reason why signal chaining is not enabled by default on > linux/solaris? > > Just wanted to clarify - signal chaining is enabled by default for the > JVM. > > The way signal chaining works is cooperatively. i.e. when the JVM > starts, it "chains", i.e. saves > existing signal handlers for the signals it uses. Then when the JVM > gets a signal, it first processes > it itself and then passes it to the next "chained" signal handler. > > With cooperative chaining, if the AMD or NVIDIA drivers also supported > (or it sounds like will support :-) > signal chaining - when the drivers register signal handlers, instead > of overwriting existing > signal handlers, they will also save them in a chain and pass on signals. > > The libjsig.so which HAS to be set via a LD_PRELOAD interposes on the > system calls for > registering signal handlers. It has to be there before any of the > subsystems register signal handlers > and provides cooperative signal chaining for subsystems that do not > provide it themselves. > > So, the best fix of course is the one you are pursuing, which is > asking Nvidia and AMD to also > perform cooperative signal chaining. > > ---- > > > On 5/19/10 2:54 PM, Michael Bien wrote: >> Hello Everyone, >> >> (sorry for the delay, but something went wrong with my subscription, >> i haven't noticed that I already got an answer) >> >> comments inline... >> >> >>> More info from Hotspot engineers. >>> >>> ---- >>> >Does webstart allow running your own native code in an applet? >> yes >> >>> (Does >>> plugin while >>> >So I am guessing that they have java interfaces using the jvm/JIT >>> > - then gluegen -- how does gluegen work here? Is it precompiled >>> >> gluegen generates very thin JNI binding code, its precompiled -> >> nothing at runtime. >> >> but we have basically two modes: static linking against libOpenCL.so >> or dynamic loading and invocation via function pointers which we >> currently use for JOGL but not yet for JOCL (except for CL extensions). >> >> >>> or does it do a translation at run time? >>> >> no >> >>> > - which talks to OpenCL "C" binaries >>> > - there appear to be a set running on the "host" or main CPU, >>> > including interfacing to the underlying device drivers, such as >>> the amd and nvidia drivers mentioned >>> > - which then can also start OpenCL "C" binaries that run on >>> auxiliary processors like GPUs >>> >> yes thats basically how it works >> >>> >So to answer Michael's question from a VM perspective: >>> >>> >It appears that the amd and nvidia native drivers that I would guess >>> they link to in their >>> >"host" code register for the system signals listed below, but don't >>> support signal chaining, >>> >i.e. they are overwriting the jvm's signal handlers. >>> >>> >So - the technical solution for that, assuming we can't change the amd >>> and nvidia drivers, >>> >is to interpose our libjsig.so before their libraries are loaded. This >>> lets our vm chain >>> >their signal handlers, so that the VM only handles signals that apply >>> to the vm and then >>> >calls their signal handlers. >>> >>> >I am guessing they can't link libjsig with their application or he >>> would have done so - but >>> >it is worth first asking why he can't. >>> >> Reading the libjsig doc i thought it would not work. >> my understanding of libjsig: >> it must be loaded before the most of the JVM starts, thats why there >> are two options: >> 1.) LD_PRELOAD=path/to/libjsig >> 2.) link a custom native JVM launcher against libjsig >> >> since webstart does not allow 2.) it won't help. >> >> (please correct me if i am wrong here, otherwise the issue is already >> solved :) ) >> >>> >If it is the case that he can not, then he needs to setenv LD_PRELOAD >>> /libjsig.so >>> >before starting up java. >>> >>> >Is there a way to do that with WebStart? Is there a way to specify to >>> do that? >>> No - there is no ability to set any env variables before launching >>> java. If jnlp file itself is signed and trusted, you could set system >>> propertys before launching java, but not environmental variables. >>> >> >> exactly thats the issue... dead end regarding webstart. >> >> In the meantime i talked to the Nvidia devs and they will try to >> workaround this issue. Looking at the AMD drivers the situation is >> not different but for some reasons it appears to run more stable (but >> this is probably just luck). So we would have to talk to them too and >> maybe other vendors. >> >> Is there a reason why signal chaining is not enabled by default on >> linux/solaris? >> If there is a reason, could the webstart launcher enable it only for >> webstart on those systems? >> >> Third way to solve this issue is to introduce a >> "-XX:enableSignalChaining" flag as mentioned before and allow it to >> be passed via JNLP. >> This might work since i heard webstart runs out of process anyway... >> so there must be a launcher involved which interprets this flags >> before JVM launch. >> >> >> to quote my original mail: >> It looks like a good self-defence mechanism for me :) >> >> thanks for the support, >> >> best regards, >> >> Michael Bien >> >> >>> ----- >>> >>> Paul >>> >/ A partial answer: one of the Hotspot engineers says >>> />/ >>> />/ "I think the short answer is that chaining requires LD_PRELOAD to >>> />/ override the signal entry points. Otherwise we [Hotspot] wouldn't see >>> />/ the calls that change the signal handlers. If the Java command itself >>> />/ linked against jsig that would work too I think. I believe that's the >>> />/ only way to solve the problem he is seeing in an automatic fashion. >>> />/ Depending on how the driver library gets loaded they might be able to >>> />/ build their own signal handler trampolines to work around it and >>> />/ correct the signal handlers after it gets loaded." >>> />/ >>> />/ Regards, >>> />/ >>> />/ Paul >>> />/ >>> />/ On 5/8/10 7:31 AM, Michael Bien wrote: >>> />>/ Hello everyone, >>> />>/ >>> />>/ i am one of the maintainers of JOGL and wrote JOCL >>> />>/ (http://jogamp.org/) and we are currently facing some signal handling >>> />>/ issues caused by the nvidia and amd drivers. >>> />>/ (I got the hint to post to this list since there is no better alias >>> />>/ for this kind of topics) >>> />>/ >>> />>/ e.g. the nvidia OpenCL driver uses at least the following handlers: >>> />>/ Warning: SIGSEGV handler expected:libjvm.so+0x5d8cf0 >>> />>/ found:libnvidia-compiler.so+0x1865e0 >>> />>/ Warning: SIGILL handler expected:libjvm.so+0x5d8cf0 >>> />>/ found:libnvidia-compiler.so+0x1865e0 >>> />>/ Warning: SIGFPE handler expected:libjvm.so+0x5d8cf0 >>> />>/ found:libnvidia-compiler.so+0x1865e0 >>> />>/ Warning: SIGBUS handler expected:libjvm.so+0x5d8cf0 >>> />>/ found:libnvidia-compiler.so+0x1865e0 >>> />>/ Warning: SIGXFSZ handler expected:libjvm.so+0x5d8cf0 >>> />>/ found:libnvidia-compiler.so+0x1865e0 >>> />>/ (-Xcheck:jni) >>> />>/ >>> />>/ which basically makes the jvm unusable on Linux and leads to >>> />>/ segmentation faults (in the driver, I suppose the driver catches jvm >>> />>/ signals). >>> />>/ >>> />>/ LD_PRELOAD >>> />>/ (http://java.sun.com/javase/6/webnotes/trouble/TSG-VM/html/signals.html#gbzbl) >>> />>/ works perfectly but it is not allowed for webstart + applets... >>> />>/ >>> />>/ do you have any advice how we could workaround this issue? The >>> />>/ perfect solution would be a "-XX:enableSignalChaining" flag which we >>> />>/ could set via jnlp. Since the webstart JVM is out of process anyway >>> />>/ (since u10 or so) this would probably work. >>> />>/ >>> />>/ Why isn't signal chaining enabled by default on linux and solaris? It >>> />>/ looks like a good self-defence mechanism for me :) >>> />>/ >>> />>/ best regards, >>> />>/ Michael Bien >>> />>/ >>> />>/ --- >>> />>/ >>> />>/ http://michael-bien.com >>> /-------------- next part -------------- >>> -- http://michael-bien.com/ -------------- next part -------------- An HTML attachment was scrubbed... URL: From iaroslavski at mail.ru Thu Jun 3 21:17:57 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Fri, 04 Jun 2010 01:17:57 +0400 Subject: =?koi8-r?Q?Re[2]=3A_New_portion_of_improvements_for_Dual-Pivot_Quicksort?= In-Reply-To: References: Message-ID: Hello, I tried your case (which is selection sort) and it works as expected: not worse than "network" or "bubble" sorting. But nevertheless, the best choice is to use insertion sort, I wrote more elegant implementation, see: ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; // Sort these elements using insertion sort if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } } if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } } } if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } } } } ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] = ae4; Note that this implementation doesn't use local variables ae1, .. , ae5 at all, and without variables it works faster. This code is not too long, extra 4 lines only. And if on client VM it works as other "network" implementations, but on server VM it wins 1.2%. In compare with first implementation of Dual-Pivot Quicksort, which is used now in JDK 7, suggested version wins ~15% and 6% for client and server modes. Updated version of the class I will send tomorrow. Dmytro, could you please look at suggested insertion sort for 5 elements? Do you have any comments/improvements? One place to be improved is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where element is compared with all sorted elements, whereas we can save comparisons by binary fork. But implementation becomes too complex and long. As it can be expected, the best sorting for small arrays is insertion, then selection and then only bubble sort, even for 5 elements. Best regards, Vladimir Wed, 2 Jun 2010 22:21:41 +0700 ?????? ?? Dmytro Sheyko : > Sure, > > The average number of swaps is 5 = 600/120. > // bubble > // [4 5][3 4][2 3][1 2][2 3][3 4][4 5][3 4][2 3][3 4] > // size 10 > // swaps 600 > // loads 11 > // delay 10 > // n! = (60/120=50%)(80/120=66%)(90/120=75%)(96/120=80%)(54/120=45%)(72/120=60%)(72/120=60%)(28/120=23%)(36/120=30%)(12/120=10%)[600/1200=50%] > // 2^n = (8/32=25%)(12/32=37%)(14/32=43%)(15/32=46%)(7/32=21%)(9/32=28%)(7/32=21%)(3/32=9%)(4/32=12%)(1/32=3%)[80/320=25%] > > It seems that such property as number of swaps does not really matter too much. I can conjecture that what really matters here is the number of loads. > I guess that CPU cannot execute two compare-and-swap steps concurrently, so minimizing delay is senseless and even harmful. > On the contrary, we can minimize number of loads (assuming that all 5 elements cannot be housed in CPU registers) if every compare-and-swap step uses one of variables that its predecessor does. > > Vladimir, > Could you also try schema below? I expect that it should not be worse than "bubble network". It has the same delay, but the average number of swaps (3) is low. > // narrowing > // [1 5][1 4][1 3][1 2][2 5][2 4][2 3][3 5][3 4][4 5] > // size 10 > // swaps 360 > // loads 11 > // delay 10 > // n! = (60/120=50%)(40/120=33%)(30/120=25%)(24/120=20%)(40/120=33%)(40/120=33%)(36/120=30%)(30/120=25%)(36/120=30%)(24/120=20%)[360/1200=30%] > // 2^n = (8/32=25%)(4/32=12%)(2/32=6%)(1/32=3%)(4/32=12%)(4/32=12%)(3/32=9%)(2/32=6%)(3/32=9%)(1/32=3%)[32/320=10%] > if (ae1 > ae5) { t = ae1; ae1 = ae5; ae5 = t; } > if (ae1 > ae4) { t = ae1; ae1 = ae4; ae4 = t; } > if (ae1 > ae3) { t = ae1; ae1 = ae3; ae3 = t; } > if (ae1 > ae2) { t = ae1; ae1 = ae2; ae2 = t; } > if (ae2 > ae5) { t = ae2; ae2 = ae5; ae5 = t; } > if (ae2 > ae4) { t = ae2; ae2 = ae4; ae4 = t; } > if (ae2 > ae3) { t = ae2; ae2 = ae3; ae3 = t; } > if (ae3 > ae5) { t = ae3; ae3 = ae5; ae5 = t; } > if (ae3 > ae4) { t = ae3; ae3 = ae4; ae4 = t; } > if (ae4 > ae5) { t = ae4; ae4 = ae5; ae5 = t; } > > I also don't mind to change current sorting network to something more efficient (i.e. bubble network or so). However its impact on the whole sorting algorithm seems neglectable especially for large arrays. > > Thank you, > Dmytro Sheyko > > > Date: Wed, 2 Jun 2010 17:54:57 +0400 > > From: iaroslavski at mail.ru > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > To: dmytro_sheyko at hotmail.com > > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > > > I checked sorting for long type and see the same behaviour as for int, > > new suggested sorting network doesn't win. > > > > 10-steps bubble sort shows the almost the same results as on int: > > wins ~0.3% on client, and 0.8% on server. > > > > Should we use 10-steps bubble sort instead of sorting network > > (which has bubble sorting structure as well)? For code it will be > > extra one line. > > > > Dmytro, > > Could you please, run your counting test on bubble sort? > > What is the average count of swaps? > > > > The schema is [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > > > Dmytro Sheyko wrote: > > > Hi Vladimir, > > > > > > > Which sorting algorithm we should use? > > > > > > > > 1. Network - compact, 9 lines of code > > > > 2. Bubble - also compact, 10 lines of code > > > > 3. Insertion - faster, but 39 lines of code > > > > > > I think that the gain is not worth the complexity. So, maybe, just leave > > > it as it is. > > > > > > > Date: Tue, 1 Jun 2010 15:40:19 +0400 > > > > From: iaroslavski at mail.ru > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > To: dmytro_sheyko at hotmail.com > > > > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > > > > > > > Hi Dmytro, > > > > > > > > Very interesting investigation, thank you very much! > > > > > > > > I tried you suggested sorting network, but all versions work the same. > > > > Then I used bubble sort (10 comparisons) and it shows better > > > > results: on client it is faster on 0.2%, server - 0.8%, not too > > > > much, but faster. > > > > > > > > The schema is (bubble sort with changes of direction): > > > > [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > > > > > > > And moreover: if we use insertion sort for sorting of 5 candidates: > > > > > > > > int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > > > > > > > if (ae2 < a[e1]) { > > > > a[e2] = a[e1]; a[e1] = ae2; > > > > } > > > > if (ae3 < a[e2]) { > > > > if (ae3 < a[e1]) { > > > > a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae3; > > > > } else { > > > > a[e3] = a[e2]; a[e2] = ae3; > > > > } > > > > } > > > > if (ae4 < a[e2]) { > > > > if (ae4 < a[e1]) { > > > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae4; > > > > } else { > > > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae4; > > > > } > > > > } else { > > > > if (ae4 < a[e3]) { > > > > a[e4] = a[e3]; a[e3] = ae4; > > > > } > > > > } > > > > if (ae5 < a[e2]) { > > > > if (ae5 < a[e1]) { > > > > a[e5]=a[e4];a[e4]=a[e3];a[e3]=a[e2];a[e2]=a[e1];a[e1]=ae5; > > > > } else { > > > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae5; > > > > } > > > > } else { > > > > if (ae5 < a[e3]) { > > > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = ae5; > > > > } > > > > else { > > > > if (ae5 < a[e4]) { > > > > a[e5] = a[e4]; a[e4] = ae5; > > > > } > > > > } > > > > } > > > > > > > > it shows better results than bubble sort: > > > > client - 0.37%, server - 1.03% > > > > > > > > Which sorting algorithm we should use? > > > > > > > > 1. Network - compact, 9 lines of code > > > > 2. Bubble - also compact, 10 lines of code > > > > 3. Insertion - faster, but 39 lines of code > > > > > > > > Regards, > > > > Vladimir > > > > > > > > Dmytro Sheyko wrote: > > > > > Corrections. > > > > > 1. The sixth comparator in current network (that swaps with 90% > > > > > probability) is [2 3] not [0 3]. > > > > > 2. The average number of swaps are > > > > > 576/120 = 4.8 for current network and > > > > > 376/120 = 3.1(3...) for proposed network. > > > > > > > > > > > > > ------------------------------------------------------------------------ > > > > > From: dmytro_sheyko at hotmail.com > > > > > To: iaroslavski at mail.ru; joshua.bloch at google.com > > > > > Subject: RE: New portion of improvements for Dual-Pivot Quicksort > > > > > Date: Tue, 1 Jun 2010 14:59:07 +0700 > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > Hi Vladimir, > > > > > > > > > > I cannot write 7-comparison sort briefly as well. However I think > > > we can > > > > > optimize sorting network a bit. > > > > > We can consider such properties as > > > > > 1. size, i.e. number of comparators > > > > > 2. delay, i.e. number of parallel steps (some comparisons and swaps > > > can > > > > > be done concurrently) > > > > > 3. average number of swaps. > > > > > > > > > > The current sorting network > > > > > [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] > > > > > has size 9 and delay 5. > > > > > These values are good enough. Generally we cannot write it shorter (in > > > > > order to improve size) and combine more than 2 comparison in a > > > parallel > > > > > step (in order to improve delay). > > > > > > > > > > However the average number of swaps seems too high. It performs 576 > > > > > swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) > > > > > I tried every permutation of 5 distinct values. > > > > > There is a profile per comparator: > > > > > > > > (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] > > > > > The first two comparison offer probability of swap as 50%, which is > > > > > natural. However the sixth comparator (i.e. [0 3]) swaps with > > > > > probability 90%, i.e. almost always! > > > > > > > > > > The one of the best sorting network (I have found) with the same size > > > > > and delay is following > > > > > [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] > > > > > Its average number of swaps is 376. > > > > > And here is a profile: > > > > > > > > (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] > > > > > > > > > > Regards, > > > > > Dmytro Sheyko > > > > > > > > > > > Date: Wed, 26 May 2010 16:12:17 +0400 > > > > > > From: iaroslavski at mail.ru > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > Hello Dmytro, > > > > > > > > > > > > Theoretical investigations are based on simple model, > > > > > > which doesn't take into account many optimizations > > > > > > like "equal pivots", "scan equal to pivots", etc. > > > > > > Model based on the implementation will be too complex > > > > > > to be analyzed. > > > > > > > > > > > > But it is easy to count comparisons and assignments, > > > > > > if I change them by functions with counter. > > > > > > > > > > > > Also I tried to write 7-comparison sort, but the code > > > > > > was too long (a lot of inner if-then-else) instead of > > > > > > 9 compact lines. Do you have suggestion how to implement > > > > > > a nice 7-comparison sort? I tried also selection and bubble > > > > > > sorts, but insertion sort shows better time. > > > > > > > > > > > > Josh, > > > > > > Could you please review the last changes (especially javadoc > > > > > > and comments)? > > > > > > > > > > > > Thank you, > > > > > > Vladimir > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > As for me, everything seems good. > > > > > > > > > > > > > > Returning to the theoretical background, could you estimate > > > number of > > > > > > > comparison and assignments? These should be less than in your > > > initial > > > > > > > version. > > > > > > > > > > > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > > > > > > candidates instead of 9-comparison sorting network? > > > > > > > > > > > > > > Thank you, > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > I added more comments, please, review attached version. > > > > > > > > > > > > > > > > >> So, we win 2-3% ! > > > > > > > > > > > > > > > > On [partial] sorted inputs new version runs more faster than few > > > > > > > percents: > > > > > > > > > > > > > > > > organ pipes > > > > > > > > this: 6896 > > > > > > > > prev: 7424 > > > > > > > > jdk7: 8018 > > > > > > > > jdk6: 12502 > > > > > > > > > > > > > > > > ascendant > > > > > > > > this: 2877 > > > > > > > > prev: 3845 > > > > > > > > jdk7: 4583 > > > > > > > > jdk6: 9019 > > > > > > > > > > > > > > > > descendant > > > > > > > > this: 3287 > > > > > > > > prev: 4110 > > > > > > > > jdk7: 4897 > > > > > > > > jdk6: 9132 > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > That's great! Thank you. > > > > > > > > > > > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > > Quicksort > > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > > > > > > value (if any) or all leading negative" and with my > > > optimization > > > > > > > > > > for all types. I added two while loops before partitioning to > > > > > > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > > > > > > > > > > > if (pivot1 != pivot2) { > > > > > > > > > > /* ... */ > > > > > > > > > > a[e2] = a[less]; > > > > > > > > > > a[e4] = a[great]; > > > > > > > > > > > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > > > > > > > > > > > /* ... */ > > > > > > > > > > outer: > > > > > > > > > > for (int k = less; k <= great; k++) { > > > > > > > > > > ... > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > Here is benchmark result (in compare with quicksort from > > > JDK 6): > > > > > > > > > > > > > > > > > > > > client server > > > > > > > > > > ------ ------ > > > > > > > > > > previous version: 60.70% 48.20% > > > > > > > > > > current version: 57.22% 46.18% > > > > > > > > > > > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > > > > > > modification. It > > > > > > > > > > > appeared that number of negative zeros were changed during > > > > > general > > > > > > > > > sort. > > > > > > > > > > > As I can see you already fixed this issue. Well, my > > > > > > > modification was > > > > > > > > > > > based on assumption that we can speed up eliminating > > > > > explicit array > > > > > > > > > > > range checks. > > > > > > > > > > > However, such assumption is wrong because Hotspot > > > anyway emits > > > > > > > range > > > > > > > > > > > checks at its discretion and therefore processZeros > > > generally > > > > > > > does not > > > > > > > > > > > work as fast as I expected. > > > > > > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > > > > > > > > > > > As for the latest code you posted. Doesn't it make > > > sense to > > > > > skip > > > > > > > > > leading > > > > > > > > > > > negative zeros before farther processing? In this case > > > we avoid > > > > > > > > > > > unnecessary assigning +0.0 and then -0.0 to the same > > > > > location a[k] > > > > > > > > > (i.e. > > > > > > > > > > > where k == p). > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > * Skip the last negative value (if any) or all leading > > > negative > > > > > > > > > > > zeros > > > > > > > > > > > */ > > > > > > > > > > > while (left <= right && > > > Double.doubleToRawLongBits(a[left]) > > > > > < 0) { > > > > > > > > > > > left++; > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > > > > > > double ak = a[k]; > > > > > > > > > > > if (ak != 0.0d) { > > > > > > > > > > > return; > > > > > > > > > > > } > > > > > > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > > > > > > a[k] = 0.0d; > > > > > > > > > > > a[p++] = -0.0d; > > > > > > > > > > > } > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > > > > Quicksort > > > > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did > > > > > little bit > > > > > > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code > > > became > > > > > > > > > > > > > consistent with main sort method and more compact. > > > Also > > > > > I use > > > > > > > > > > > > > more usual "i--" and "i++" in for loops (instead of > > > "--i", > > > > > > > "++i. > > > > > > > > > > > > > > > > > > > > > > > > > > To accent the difference between float/double and > > > other > > > > > types, > > > > > > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > > > > > > */ > > > > > > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > > > ..... > > > > > > > > > > > > > */ > > > > > > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > > >> Vladimir, > > > > > > > > > > > > >> > > > > > > > > > > > > >> I can see that you changed > > > > > sortNegZeroAndNaN(float[]...) but > > > > > > > > > probably > > > > > > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > > > > > > >> > > > > > > > > > > > > >> You really puzzled me with failed testcase and > > > note that > > > > > > > sorting > > > > > > > > > > > > >> algorithm (without special attention to zeros) > > > > > generally may > > > > > > > > > change > > > > > > > > > > > > >> number of negative zeros. > > > > > > > > > > > > >> I will provide my comments later. > > > > > > > > > > > > >> > > > > > > > > > > > > >> As for counting sort, I think we should use single > > > format > > > > > > > > > style over > > > > > > > > > > > > >> the file (unless we have valuable reason not to do > > > > > this). I > > > > > > > > > mean to > > > > > > > > > > > > >> choose > > > > > > > > > > > > >> 1) > > > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > > > >> return; > > > > > > > > > > > > >> } > > > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > > > >> 2) > > > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > > > >> } else { > > > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > > > >> } > > > > > > > > > > > > >> I prefer the second one. > > > > > > > > > > > > >> > > > > > > > > > > > > >> Thanks a lot, > > > > > > > > > > > > >> Dmytro Sheyko > > > > > > > > > > > > >> > > > > > > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > > > > > > >> > Subject: Re: New portion of improvements for > > > Dual-Pivot > > > > > > > > > Quicksort > > > > > > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Hello, > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > I've run your modification for counting sort, it > > > real > > > > > > > faster. > > > > > > > > > > > > >> > I attached new version with your changes (I did > > > > > little bit > > > > > > > > > > > > >> > format it) and included my case with float/double. > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Note that you modification doesn't pass test from > > > > > > > Sorting class, > > > > > > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = > > > > > 9, n = > > > > > > > > > 10, p = 9 > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > I suggest shorter method (which is based on your > > > > > idea to > > > > > > > skip > > > > > > > > > > > counting > > > > > > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > > > > > > index (or > > > > > > > > > > > it will > > > > > > > > > > > > >> > be index of first positive element if no zeros > > > at all, > > > > > > > or last > > > > > > > > > > > > >> negative, > > > > > > > > > > > > >> > if no positive and zero elements) and then swap > > > negative > > > > > > > > > zero to the > > > > > > > > > > > > >> > beginning of the sub-range. > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > int hi = right; > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > while (left < hi) { > > > > > > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > > > > > > >> > float middleValue = a[middle]; > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > > > > > > >> > left = middle + 1; > > > > > > > > > > > > >> > } else { > > > > > > > > > > > > >> > hi = middle; > > > > > > > > > > > > >> > } > > > > > > > > > > > > >> > } > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > > > > > > >> > float ak = a[k]; > > > > > > > > > > > > >> > if (ak != 0.0f) { > > > > > > > > > > > > >> > return; > > > > > > > > > > > > >> > } > > > > > > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is > > > -0.0f > > > > > > > > > > > > >> > a[k] = +0.0f; > > > > > > > > > > > > >> > a[p++] = -0.0f; > > > > > > > > > > > > >> > } > > > > > > > > > > > > >> > } > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Important note: in partitioning loop there are > > > several > > > > > > > places > > > > > > > > > > > > >> > (marked by // !) where potential bug with -0.0 > > > could be > > > > > > > > > > > > >> > (when pivot and a[great] are zeros with different > > > > > signs): > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > > > >> > + a[less++] = a[great]; > > > > > > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > > > > > > >> > a[k] = a[great]; > > > > > > > > > > > > >> > } > > > > > > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > > > > > > >> > + a[great--] = ak; > > > > > > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > > > >> > + a[less++] = ak; > > > > > > > > > > > > >> > } > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for > > > all types > > > > > > > > > > > > >> > and "pivot1 -> a[great]" in float/double > > > sections only. > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Please, review format changes for counting sort > > > and new > > > > > > > version > > > > > > > > > > > > >> > of Phase 3 for float/double. > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Thank you, > > > > > > > > > > > > >> > Vladimir > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > > > > > > >> > > Hi, > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > About counting sort again. > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > 1. This condition "i < count.length && k <= > > > right" is > > > > > > > > > excessive. > > > > > > > > > > > > >> Any one > > > > > > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > > > > > > >> > > 2. No need to calculate "short value = (short) > > > (i + > > > > > > > > > > > > >> Short.MIN_VALUE)" > > > > > > > > > > > > >> > > when "count[i]" is zero. > > > > > > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > > > > > > better loop > > > > > > > > > > > > >> backward. > > > > > > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit > > > > > looping > > > > > > > > > earlier > > > > > > > > > > > > >> > > assuming that typically we work with positive > > > numbers. > > > > > > > > > > > > >> > > For unsigned primitives (char) we would better > > > loop > > > > > > > forward > > > > > > > > > > > because > > > > > > > > > > > > >> > > typically we work with characters about zero > > > (ASCII). > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > - 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--) { > > > > > > > > > > > > >> > > - a[k++] = value; > > > > > > > > > > > > >> > > - } > > > > > > > > > > > > >> > > - } > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = > > > toIndex - > > > > > 1; k >= > > > > > > > > > > > > >> > > fromIndex; --i) { > > > > > > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > > > > > > >> > > + int s = count[i]; > > > > > > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > > > > > > >> > > + } > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > Thanks, > > > > > > > > > > > > >> > > Dmytro Sheyko > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; > > > > > iaroslavski at mail.ru > > > > > > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > > > > > > Dual-Pivot > > > > > > > > > > > > >> Quicksort > > > > > > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > Sounds good! > > > > > > > > > > > > >> > > > Will consider too... > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? > > > Dmytro > > > > > Sheyko > > > > > > > > > > > > >> > > : > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > > Hi, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > Regarding counting sort. We can check > > > whether we > > > > > > > should > > > > > > > > > > > > >> switch to > > > > > > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > > > > > > Dual-Pivot > > > > > > > > > > > > >> Quicksort > > > > > > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run > > > > > tests again > > > > > > > > > > > with you > > > > > > > > > > > > >> > > changes. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > > > > > > >> > > > > > Vladimir > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > > >> > > > > > > Hello, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > > > > > > >> Double.doubleToLongBits and > > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > > > > > > Float.floatToIntBits. > > > > > > > > > > > > >> > > > > > > No need to handle NaN's because they > > > all are > > > > > > > placed to > > > > > > > > > > > > >> the end > > > > > > > > > > > > >> > > of array. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > > > > > > Long.MIN_VALUE and > > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > > > > > > Integer.MIN_VALUE. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more > > > efficient > > > > > > > (or at > > > > > > > > > > > > >> least not > > > > > > > > > > > > >> > > worse) > > > > > > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > > > > > > Float.floatToIntBits(ak)) > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && > > > Float.floatToIntBits(ak) > > > > > < 0) > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > > > > > > negative zeros > > > > > > > > > > > after > > > > > > > > > > > > >> > > sorting. > > > > > > > > > > > > >> > > > > > > General sorting algorithm puts both > > > > > negative and > > > > > > > > > positive > > > > > > > > > > > > >> zeros > > > > > > > > > > > > >> > > together > > > > > > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > > > > > > >> > > > > > > Therefore we have to process less > > > elements > > > > > because > > > > > > > > > > > > >> usually we > > > > > > > > > > > > >> > > have less > > > > > > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; > > > > > jjb at google.com > > > > > > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > > > iaroslavski at mail.ru > > > > > > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of > > > > > improvements for > > > > > > > > > > > Dual-Pivot > > > > > > > > > > > > >> > > Quicksort > > > > > > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, > > > review the > > > > > > > changes. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 > > > ?????? ?? > > > > > > > Dmytro > > > > > > > > > Sheyko > > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero > > > using > > > > > binary > > > > > > > > > search) > > > > > > > > > > > > >> over > > > > > > > > > > > > >> > > C (Count > > > > > > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > > > > > > core-libs-dev at openjdk.java.net; > > > > > > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > > > > > > improvements for > > > > > > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 > > > +0400 > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested > > > variants, and > > > > > > > > > found that > > > > > > > > > > > > >> case "C" > > > > > > > > > > > > >> > > > > > > > > > (very interesting approach to > > > find first > > > > > > > > > position > > > > > > > > > > > > >> of zero > > > > > > > > > > > > >> > > > > > > > > > by counting negative elements) works > > > > > > > slower than > > > > > > > > > > > > >> original > > > > > > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are > > > very > > > > > close > > > > > > > > > to each > > > > > > > > > > > > >> other > > > > > > > > > > > > >> > > > > > > > > > and little bit faster than > > > original. I > > > > > > > > > prefer case > > > > > > > > > > > > >> "F": > > > > > > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do > > > you > > > > > agree? > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated > > > DualPivotQuicksort > > > > > > > file and > > > > > > > > > > > > >> send it > > > > > > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 > > > ?????? > > > > > > > ?? Dmytro > > > > > > > > > > > > >> Sheyko > > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > > > > > > comments/proposals > > > > > > > > > > > > >> regarding > > > > > > > > > > > > >> > > dealing > > > > > > > > > > > > >> > > > > > > with negative zeros. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero > > > we can > > > > > > > > > avoid range > > > > > > > > > > > > >> check > > > > > > > > > > > > >> > > (i >= > > > > > > > > > > > > >> > > > > > > left) if we have at least one negative > > > value. > > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > > Tue May 11 > > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed > > > > > May 12 > > > > > > > > > 12:10:46 > > > > > > > > > > > > >> 2010 > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > > left, n); > > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > > > left && > > > > > > > > > a[i] == > > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, > > > left, n); > > > > > > > > > > > > >> > > > > > > > > > > + > > > > > > > > > > > > >> > > > > > > > > > > + // there is at least one > > > negative > > > > > > > value, so > > > > > > > > > > > range > > > > > > > > > > > > >> > > check is > > > > > > > > > > > > >> > > > > > > not needed > > > > > > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; > > > /*i >= > > > > > > > left &&*/ > > > > > > > > > > > > >> a[i] == > > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > > > > > > >> > > > > > > > > > > + } > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > > > positive zeros > > > > > > > > > > > back into > > > > > > > > > > > > >> > > negative zeros > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of > > > the > > > > > first > > > > > > > > > zero by > > > > > > > > > > > > >> counting > > > > > > > > > > > > >> > > > > > > negative values during preprocessing > > > phase. > > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > > Tue May 11 > > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed > > > > > May 12 > > > > > > > > > 12:01:24 > > > > > > > > > > > > >> 2010 > > > > > > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros > > > > > and move > > > > > > > > > NaNs to > > > > > > > > > > > > >> end of > > > > > > > > > > > > >> > > array. > > > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > > > > > > numNegativeValues = 0; > > > > > > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // > > > i.e., ak > > > > > is NaN > > > > > > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > > left, n); > > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = > > > numNegativeValues; > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= > > > > > left && > > > > > > > > > a[i] == > > > > > > > > > > > > >> 0.0f; > > > > > > > > > > > > >> > > i--) { > > > > > > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to > > > find > > > > > > > the first > > > > > > > > > > > > >> zero and > > > > > > > > > > > > >> > > thus > > > > > > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > > Tue May 11 > > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed > > > > > May 12 > > > > > > > > > 12:03:58 > > > > > > > > > > > > >> 2010 > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > > left, n); > > > > > > > > > > > > >> > > > > > > > > > > - > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > > > left && > > > > > > > > > a[i] == > > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > > > >> > > > > > > > > > > - } > > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > > > > > > left, n); > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > > > positive zeros > > > > > > > > > > > back into > > > > > > > > > > > > >> > > negative zeros > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = > > > > > zeroIndex + > > > > > > > > > > > > >> > > numNegativeZeros; i < > > > > > > > > > > > > >> > > > > > > m; i++) { > > > > > > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > > > > > > element > > > > > > > > > in the > > > > > > > > > > > > >> > > specified > > > > > > > > > > > > >> > > > > > > range via > > > > > > > > > > > > >> > > > > > > > > > > + * Returns the index of the > > > first > > > > > zero > > > > > > > > > element > > > > > > > > > > > > >> in the > > > > > > > > > > > > >> > > > > > > specified range via > > > > > > > > > > > > >> > > > > > > > > > > * binary search. The range is > > > assumed > > > > > > > to be > > > > > > > > > > > > >> sorted, and > > > > > > > > > > > > >> > > must > > > > > > > > > > > > >> > > > > > > contain > > > > > > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > > > > > > >> > > > > > > > > > > * > > > > > > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > > > > > > >> > > > > > > > > > > * @param low the index of the > > > first > > > > > > > element, > > > > > > > > > > > > >> inclusive, > > > > > > > > > > > > >> > > to be > > > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > > > >> > > > > > > > > > > * @param high the index of the > > > last > > > > > > > element, > > > > > > > > > > > > >> inclusive, > > > > > > > > > > > > >> > > to be > > > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > > > >> > > > > > > > > > > - private static int > > > > > > > findAnyZero(float[] a, > > > > > > > > > > > int low, > > > > > > > > > > > > >> > > int high) { > > > > > > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > > > > > > >> > > > > > > > > > > + private static int > > > > > > > findFirstZero(float[] > > > > > > > > > a, int > > > > > > > > > > > > >> low, > > > > > > > > > > > > >> > > int high) { > > > > > > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values > > > appeared more > > > > > > > > > expensive > > > > > > > > > > > > >> than > > > > > > > > > > > > >> > > any other > > > > > > > > > > > > >> > > > > > > variants. > > > > > > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > > > > > > efficient > > > > > > > > > as the > > > > > > > > > > > > >> current > > > > > > > > > > > > >> > > > > > > solution is in its worst case - when > > > we have > > > > > > > only one > > > > > > > > > > > > >> negative > > > > > > > > > > > > >> > > zero (in > > > > > > > > > > > > >> > > > > > > the half of array). > > > > > > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > > > > > > have many > > > > > > > > > > > zeros. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > > > > > > dmytro_sheyko at hotmail.com > > > > > > > > > > > > >> > > > > > > > > > > > CC: > > > core-libs-dev at openjdk.java.net; > > > > > > > > > > > > >> iaroslavski at mail.ru > > > > > > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > > > > > > improvements for > > > > > > > > > > > > >> > > Dual-Pivot > > > > > > > > > > > > >> > > > > > > Quicksort > > > > > > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 > > > 23:51:27 +0400 > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly > > > testing > > > > > > > "great - > > > > > > > > > > > > >> less > 5 * > > > > > > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > > > > > > >> > > > > > > > > > > > and found that more > > > symmetric code > > > > > > > "less > > > > > > > > > < e1 && > > > > > > > > > > > > >> > > great > e5" > > > > > > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has > > > not been > > > > > > > > > changed. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest > > > version in > > > > > > > > > attachment. > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > > > > > > ?????? ?? > > > > > > > > > Joshua > > > > > > > > > > > > >> Bloch > > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > > > > e5) { > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * > > > > > seventh) { > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > > > > > > >> > > > > > > > > > > > >Josh From jonathan.gibbons at oracle.com Fri Jun 4 00:15:31 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Fri, 04 Jun 2010 00:15:31 +0000 Subject: hg: jdk7/tl/langtools: 6955264: add option to suppress Abort in Check.completionError Message-ID: <20100604001532.C845246F38@hg.openjdk.java.net> Changeset: 559c9a37d9f6 Author: jjg Date: 2010-06-03 17:14 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/559c9a37d9f6 6955264: add option to suppress Abort in Check.completionError Reviewed-by: mcimadamore ! src/share/classes/com/sun/tools/javac/comp/Check.java From joe.darcy at oracle.com Fri Jun 4 02:51:19 2010 From: joe.darcy at oracle.com (joe.darcy at oracle.com) Date: Fri, 04 Jun 2010 02:51:19 +0000 Subject: hg: jdk7/tl/langtools: 6519115: MirroredTypeException thrown but should be MirroredTypesException Message-ID: <20100604025121.1AD7746F3F@hg.openjdk.java.net> Changeset: 852d8bb356bc Author: darcy Date: 2010-06-03 19:56 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/852d8bb356bc 6519115: MirroredTypeException thrown but should be MirroredTypesException Reviewed-by: jjg ! src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java ! src/share/classes/javax/lang/model/type/MirroredTypeException.java ! src/share/classes/javax/lang/model/type/MirroredTypesException.java + test/tools/javac/processing/model/type/MirroredTypeEx/Plurality.java From joe.darcy at oracle.com Fri Jun 4 06:58:18 2010 From: joe.darcy at oracle.com (Joe Darcy) Date: Thu, 03 Jun 2010 23:58:18 -0700 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" Message-ID: <4C08A40A.7030105@oracle.com> Hello. Please review my fix for 6935997 "Please add a nested throwable constructor to AssertionError" http://cr.openjdk.java.net/~darcy/6935997.0/ Thanks, -Joe From martinrb at google.com Fri Jun 4 07:13:26 2010 From: martinrb at google.com (Martin Buchholz) Date: Fri, 4 Jun 2010 00:13:26 -0700 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" In-Reply-To: <4C08A40A.7030105@oracle.com> References: <4C08A40A.7030105@oracle.com> Message-ID: Looks good! Martin On Thu, Jun 3, 2010 at 23:58, Joe Darcy wrote: > Hello. > > Please review my fix for > > 6935997 "Please add a nested throwable constructor to AssertionError" > http://cr.openjdk.java.net/~darcy/6935997.0/ > > Thanks, > > -Joe > From dmytro_sheyko at hotmail.com Fri Jun 4 07:21:58 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Fri, 4 Jun 2010 14:21:58 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort Message-ID: Seems good, One note. Since we gave up to sort pivot candidates in local variables, maybe we can move this out to separate procedure (in order to make sources cleaner a bit), e.g. private static void sortPivotCandidates(double[] a, int ae1, int ae2, int ae3, int ae4, int ae5) Hope the compiler is able to inline it without extra cost. Thanks, Dmytro Sheyko > From: iaroslavski at mail.ru > To: dmytro_sheyko at hotmail.com > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > Subject: Re[2]: New portion of improvements for Dual-Pivot Quicksort > Date: Fri, 4 Jun 2010 01:17:57 +0400 > > Hello, > > I tried your case (which is selection sort) and it works as expected: not worse > than "network" or "bubble" sorting. But nevertheless, the best choice is to use > insertion sort, I wrote more elegant implementation, see: > > ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] = ae4; > > Note that this implementation doesn't use local variables ae1, .. , ae5 > at all, and without variables it works faster. This code is not too long, > extra 4 lines only. And if on client VM it works as other "network" > implementations, but on server VM it wins 1.2%. > > In compare with first implementation of Dual-Pivot Quicksort, which > is used now in JDK 7, suggested version wins ~15% and 6% for client > and server modes. > > Updated version of the class I will send tomorrow. > > Dmytro, > could you please look at suggested insertion sort for 5 elements? > > Do you have any comments/improvements? One place to be improved > is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where > element is compared with all sorted elements, whereas we can save > comparisons by binary fork. But implementation becomes too complex > and long. > > As it can be expected, the best sorting for small arrays is insertion, > then selection and then only bubble sort, even for 5 elements. > > Best regards, > Vladimir > > Wed, 2 Jun 2010 22:21:41 +0700 ?????? ?? Dmytro Sheyko : > > > Sure, > > > > The average number of swaps is 5 = 600/120. > > // bubble > > // [4 5][3 4][2 3][1 2][2 3][3 4][4 5][3 4][2 3][3 4] > > // size 10 > > // swaps 600 > > // loads 11 > > // delay 10 > > // n! = (60/120=50%)(80/120=66%)(90/120=75%)(96/120=80%)(54/120=45%)(72/120=60%)(72/120=60%)(28/120=23%)(36/120=30%)(12/120=10%)[600/1200=50%] > > // 2^n = (8/32=25%)(12/32=37%)(14/32=43%)(15/32=46%)(7/32=21%)(9/32=28%)(7/32=21%)(3/32=9%)(4/32=12%)(1/32=3%)[80/320=25%] > > > > It seems that such property as number of swaps does not really matter too much. I can conjecture that what really matters here is the number of loads. > > I guess that CPU cannot execute two compare-and-swap steps concurrently, so minimizing delay is senseless and even harmful. > > On the contrary, we can minimize number of loads (assuming that all 5 elements cannot be housed in CPU registers) if every compare-and-swap step uses one of variables that its predecessor does. > > > > Vladimir, > > Could you also try schema below? I expect that it should not be worse than "bubble network". It has the same delay, but the average number of swaps (3) is low. > > // narrowing > > // [1 5][1 4][1 3][1 2][2 5][2 4][2 3][3 5][3 4][4 5] > > // size 10 > > // swaps 360 > > // loads 11 > > // delay 10 > > // n! = (60/120=50%)(40/120=33%)(30/120=25%)(24/120=20%)(40/120=33%)(40/120=33%)(36/120=30%)(30/120=25%)(36/120=30%)(24/120=20%)[360/1200=30%] > > // 2^n = (8/32=25%)(4/32=12%)(2/32=6%)(1/32=3%)(4/32=12%)(4/32=12%)(3/32=9%)(2/32=6%)(3/32=9%)(1/32=3%)[32/320=10%] > > if (ae1 > ae5) { t = ae1; ae1 = ae5; ae5 = t; } > > if (ae1 > ae4) { t = ae1; ae1 = ae4; ae4 = t; } > > if (ae1 > ae3) { t = ae1; ae1 = ae3; ae3 = t; } > > if (ae1 > ae2) { t = ae1; ae1 = ae2; ae2 = t; } > > if (ae2 > ae5) { t = ae2; ae2 = ae5; ae5 = t; } > > if (ae2 > ae4) { t = ae2; ae2 = ae4; ae4 = t; } > > if (ae2 > ae3) { t = ae2; ae2 = ae3; ae3 = t; } > > if (ae3 > ae5) { t = ae3; ae3 = ae5; ae5 = t; } > > if (ae3 > ae4) { t = ae3; ae3 = ae4; ae4 = t; } > > if (ae4 > ae5) { t = ae4; ae4 = ae5; ae5 = t; } > > > > I also don't mind to change current sorting network to something more efficient (i.e. bubble network or so). However its impact on the whole sorting algorithm seems neglectable especially for large arrays. > > > > Thank you, > > Dmytro Sheyko > > > > > Date: Wed, 2 Jun 2010 17:54:57 +0400 > > > From: iaroslavski at mail.ru > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > To: dmytro_sheyko at hotmail.com > > > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > > > > > I checked sorting for long type and see the same behaviour as for int, > > > new suggested sorting network doesn't win. > > > > > > 10-steps bubble sort shows the almost the same results as on int: > > > wins ~0.3% on client, and 0.8% on server. > > > > > > Should we use 10-steps bubble sort instead of sorting network > > > (which has bubble sorting structure as well)? For code it will be > > > extra one line. > > > > > > Dmytro, > > > Could you please, run your counting test on bubble sort? > > > What is the average count of swaps? > > > > > > The schema is [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > > > > > Dmytro Sheyko wrote: > > > > Hi Vladimir, > > > > > > > > > Which sorting algorithm we should use? > > > > > > > > > > 1. Network - compact, 9 lines of code > > > > > 2. Bubble - also compact, 10 lines of code > > > > > 3. Insertion - faster, but 39 lines of code > > > > > > > > I think that the gain is not worth the complexity. So, maybe, just leave > > > > it as it is. > > > > > > > > > Date: Tue, 1 Jun 2010 15:40:19 +0400 > > > > > From: iaroslavski at mail.ru > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > To: dmytro_sheyko at hotmail.com > > > > > CC: joshua.bloch at google.com; core-libs-dev at openjdk.java.net > > > > > > > > > > Hi Dmytro, > > > > > > > > > > Very interesting investigation, thank you very much! > > > > > > > > > > I tried you suggested sorting network, but all versions work the same. > > > > > Then I used bubble sort (10 comparisons) and it shows better > > > > > results: on client it is faster on 0.2%, server - 0.8%, not too > > > > > much, but faster. > > > > > > > > > > The schema is (bubble sort with changes of direction): > > > > > [4 5] [3 4] [2 3] [1 2] [2 3] [3 4] [4 5] [3 4] [2 3] [3 4] > > > > > > > > > > And moreover: if we use insertion sort for sorting of 5 candidates: > > > > > > > > > > int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > > > > > > > > > if (ae2 < a[e1]) { > > > > > a[e2] = a[e1]; a[e1] = ae2; > > > > > } > > > > > if (ae3 < a[e2]) { > > > > > if (ae3 < a[e1]) { > > > > > a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae3; > > > > > } else { > > > > > a[e3] = a[e2]; a[e2] = ae3; > > > > > } > > > > > } > > > > > if (ae4 < a[e2]) { > > > > > if (ae4 < a[e1]) { > > > > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = a[e1]; a[e1] = ae4; > > > > > } else { > > > > > a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae4; > > > > > } > > > > > } else { > > > > > if (ae4 < a[e3]) { > > > > > a[e4] = a[e3]; a[e3] = ae4; > > > > > } > > > > > } > > > > > if (ae5 < a[e2]) { > > > > > if (ae5 < a[e1]) { > > > > > a[e5]=a[e4];a[e4]=a[e3];a[e3]=a[e2];a[e2]=a[e1];a[e1]=ae5; > > > > > } else { > > > > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = a[e2]; a[e2] = ae5; > > > > > } > > > > > } else { > > > > > if (ae5 < a[e3]) { > > > > > a[e5] = a[e4]; a[e4] = a[e3]; a[e3] = ae5; > > > > > } > > > > > else { > > > > > if (ae5 < a[e4]) { > > > > > a[e5] = a[e4]; a[e4] = ae5; > > > > > } > > > > > } > > > > > } > > > > > > > > > > it shows better results than bubble sort: > > > > > client - 0.37%, server - 1.03% > > > > > > > > > > Which sorting algorithm we should use? > > > > > > > > > > 1. Network - compact, 9 lines of code > > > > > 2. Bubble - also compact, 10 lines of code > > > > > 3. Insertion - faster, but 39 lines of code > > > > > > > > > > Regards, > > > > > Vladimir > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > Corrections. > > > > > > 1. The sixth comparator in current network (that swaps with 90% > > > > > > probability) is [2 3] not [0 3]. > > > > > > 2. The average number of swaps are > > > > > > 576/120 = 4.8 for current network and > > > > > > 376/120 = 3.1(3...) for proposed network. > > > > > > > > > > > > > > > > ------------------------------------------------------------------------ > > > > > > From: dmytro_sheyko at hotmail.com > > > > > > To: iaroslavski at mail.ru; joshua.bloch at google.com > > > > > > Subject: RE: New portion of improvements for Dual-Pivot Quicksort > > > > > > Date: Tue, 1 Jun 2010 14:59:07 +0700 > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > Hi Vladimir, > > > > > > > > > > > > I cannot write 7-comparison sort briefly as well. However I think > > > > we can > > > > > > optimize sorting network a bit. > > > > > > We can consider such properties as > > > > > > 1. size, i.e. number of comparators > > > > > > 2. delay, i.e. number of parallel steps (some comparisons and swaps > > > > can > > > > > > be done concurrently) > > > > > > 3. average number of swaps. > > > > > > > > > > > > The current sorting network > > > > > > [0 1][3 4] | [0 2] | [1 2][0 3] | [2 3][1 4] | [1 2][3 4] > > > > > > has size 9 and delay 5. > > > > > > These values are good enough. Generally we cannot write it shorter (in > > > > > > order to improve size) and combine more than 2 comparison in a > > > > parallel > > > > > > step (in order to improve delay). > > > > > > > > > > > > However the average number of swaps seems too high. It performs 576 > > > > > > swaps per 1080 comparisons (1080 = 9 {size} * 120 {5!}) > > > > > > I tried every permutation of 5 distinct values. > > > > > > There is a profile per comparator: > > > > > > > > > > (60/120=50%)(60/120=50%)(40/120=33%)(80/120=66%)(48/120=40%)(108/120=90%)(36/120=30%)(72/120=60%)(72/120=60%)[576/1080=53%] > > > > > > The first two comparison offer probability of swap as 50%, which is > > > > > > natural. However the sixth comparator (i.e. [0 3]) swaps with > > > > > > probability 90%, i.e. almost always! > > > > > > > > > > > > The one of the best sorting network (I have found) with the same size > > > > > > and delay is following > > > > > > [0 4] | [0 2][1 4] | [1 3][2 4] | [0 1][2 3] | [1 2][3 4] > > > > > > Its average number of swaps is 376. > > > > > > And here is a profile: > > > > > > > > > > (60/120=50%)(40/120=33%)(40/120=33%)(50/120=41%)(30/120=25%)(48/120=40%)(48/120=40%)(36/120=30%)(24/120=20%)[376/1080=34%] > > > > > > > > > > > > Regards, > > > > > > Dmytro Sheyko > > > > > > > > > > > > > Date: Wed, 26 May 2010 16:12:17 +0400 > > > > > > > From: iaroslavski at mail.ru > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > To: dmytro_sheyko at hotmail.com; Joshua.Bloch at google.com > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > Hello Dmytro, > > > > > > > > > > > > > > Theoretical investigations are based on simple model, > > > > > > > which doesn't take into account many optimizations > > > > > > > like "equal pivots", "scan equal to pivots", etc. > > > > > > > Model based on the implementation will be too complex > > > > > > > to be analyzed. > > > > > > > > > > > > > > But it is easy to count comparisons and assignments, > > > > > > > if I change them by functions with counter. > > > > > > > > > > > > > > Also I tried to write 7-comparison sort, but the code > > > > > > > was too long (a lot of inner if-then-else) instead of > > > > > > > 9 compact lines. Do you have suggestion how to implement > > > > > > > a nice 7-comparison sort? I tried also selection and bubble > > > > > > > sorts, but insertion sort shows better time. > > > > > > > > > > > > > > Josh, > > > > > > > Could you please review the last changes (especially javadoc > > > > > > > and comments)? > > > > > > > > > > > > > > Thank you, > > > > > > > Vladimir > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > > > As for me, everything seems good. > > > > > > > > > > > > > > > > Returning to the theoretical background, could you estimate > > > > number of > > > > > > > > comparison and assignments? These should be less than in your > > > > initial > > > > > > > > version. > > > > > > > > > > > > > > > > Also have you considered 7-comparison sort for sorting 5 pivot > > > > > > > > candidates instead of 9-comparison sorting network? > > > > > > > > > > > > > > > > Thank you, > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > Date: Tue, 25 May 2010 10:42:51 +0400 > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > I added more comments, please, review attached version. > > > > > > > > > > > > > > > > > > >> So, we win 2-3% ! > > > > > > > > > > > > > > > > > > On [partial] sorted inputs new version runs more faster than few > > > > > > > > percents: > > > > > > > > > > > > > > > > > > organ pipes > > > > > > > > > this: 6896 > > > > > > > > > prev: 7424 > > > > > > > > > jdk7: 8018 > > > > > > > > > jdk6: 12502 > > > > > > > > > > > > > > > > > > ascendant > > > > > > > > > this: 2877 > > > > > > > > > prev: 3845 > > > > > > > > > jdk7: 4583 > > > > > > > > > jdk6: 9019 > > > > > > > > > > > > > > > > > > descendant > > > > > > > > > this: 3287 > > > > > > > > > prev: 4110 > > > > > > > > > jdk7: 4897 > > > > > > > > > jdk6: 9132 > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > That's great! Thank you. > > > > > > > > > > > > > > > > > > > > > Date: Fri, 21 May 2010 18:38:51 +0400 > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > > > Quicksort > > > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > > > > > > > > > I prepared version with your changes "Skip the last negative > > > > > > > > > > > value (if any) or all leading negative" and with my > > > > optimization > > > > > > > > > > > for all types. I added two while loops before partitioning to > > > > > > > > > > > skip elements, less than pivot1 and greater than pivot2: > > > > > > > > > > > > > > > > > > > > > > if (pivot1 != pivot2) { > > > > > > > > > > > /* ... */ > > > > > > > > > > > a[e2] = a[less]; > > > > > > > > > > > a[e4] = a[great]; > > > > > > > > > > > > > > > > > > > > > > ++ while (a[++less] < pivot1); > > > > > > > > > > > ++ while (a[--great] > pivot2); > > > > > > > > > > > > > > > > > > > > > > /* ... */ > > > > > > > > > > > outer: > > > > > > > > > > > for (int k = less; k <= great; k++) { > > > > > > > > > > > ... > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > Here is benchmark result (in compare with quicksort from > > > > JDK 6): > > > > > > > > > > > > > > > > > > > > > > client server > > > > > > > > > > > ------ ------ > > > > > > > > > > > previous version: 60.70% 48.20% > > > > > > > > > > > current version: 57.22% 46.18% > > > > > > > > > > > > > > > > > > > > > > So, we win 2-3% ! > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > > Hi Vladimir, > > > > > > > > > > > > > > > > > > > > > > > > I tried to figure out why the testcase failed on my > > > > > > > > modification. It > > > > > > > > > > > > appeared that number of negative zeros were changed during > > > > > > general > > > > > > > > > > sort. > > > > > > > > > > > > As I can see you already fixed this issue. Well, my > > > > > > > > modification was > > > > > > > > > > > > based on assumption that we can speed up eliminating > > > > > > explicit array > > > > > > > > > > > > range checks. > > > > > > > > > > > > However, such assumption is wrong because Hotspot > > > > anyway emits > > > > > > > > range > > > > > > > > > > > > checks at its discretion and therefore processZeros > > > > generally > > > > > > > > does not > > > > > > > > > > > > work as fast as I expected. > > > > > > > > > > > > So complications I made are not worth doing. > > > > > > > > > > > > > > > > > > > > > > > > As for the latest code you posted. Doesn't it make > > > > sense to > > > > > > skip > > > > > > > > > > leading > > > > > > > > > > > > negative zeros before farther processing? In this case > > > > we avoid > > > > > > > > > > > > unnecessary assigning +0.0 and then -0.0 to the same > > > > > > location a[k] > > > > > > > > > > (i.e. > > > > > > > > > > > > where k == p). > > > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > > * Skip the last negative value (if any) or all leading > > > > negative > > > > > > > > > > > > zeros > > > > > > > > > > > > */ > > > > > > > > > > > > while (left <= right && > > > > Double.doubleToRawLongBits(a[left]) > > > > > > < 0) { > > > > > > > > > > > > left++; > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > > > > > > > > > > double ak = a[k]; > > > > > > > > > > > > if (ak != 0.0d) { > > > > > > > > > > > > return; > > > > > > > > > > > > } > > > > > > > > > > > > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > > > > > > > > > > > > a[k] = 0.0d; > > > > > > > > > > > > a[p++] = -0.0d; > > > > > > > > > > > > } > > > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > Date: Wed, 19 May 2010 14:41:32 +0400 > > > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > > Subject: Re: New portion of improvements for Dual-Pivot > > > > > > Quicksort > > > > > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > > > > > > > > > > > > > > resend the class with correct constructor > > > > > > > > > > > > > > > > > > > > > > > > > > Vladimir Iaroslavski wrote: > > > > > > > > > > > > > > Dmytro, > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thank you for comments, I updated double method, did > > > > > > little bit > > > > > > > > > > > > > > javadoc changes and replaced in char/short/byte methods > > > > > > > > > > > > > > "fromIndex -> left", "toIndex-1 -> right", the code > > > > became > > > > > > > > > > > > > > consistent with main sort method and more compact. > > > > Also > > > > > > I use > > > > > > > > > > > > > > more usual "i--" and "i++" in for loops (instead of > > > > "--i", > > > > > > > > "++i. > > > > > > > > > > > > > > > > > > > > > > > > > > > > To accent the difference between float/double and > > > > other > > > > > > types, > > > > > > > > > > > > > > I put comment where it is important: > > > > > > > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > > > > * In spite of a[great] == pivot1, the assignment > > > > > > > > > > > > > > * a[less++] = pivot1 may be incorrect, if a[great] > > > > > > > > > > > > > > * and pivot1 are floating-point zeros of different > > > > > > > > > > > > > > * signs, therefore in float/double methods we have > > > > > > > > > > > > > > * to use more accurate assignment a[k] = a[great]. > > > > > > > > > > > > > > */ > > > > > > > > > > > > > > a[less++] = pivot1; > > > > > > > > > > > > > > > > > > > > > > > > > > > > and for double/float: > > > > > > > > > > > > > > > > > > > > > > > > > > > > /* > > > > > > > > > > > > > > ..... > > > > > > > > > > > > > > */ > > > > > > > > > > > > > > a[k] = a[great]; > > > > > > > > > > > > > > > > > > > > > > > > > > > > See updated version in attachment. > > > > > > > > > > > > > > > > > > > > > > > > > > > > Thank you, > > > > > > > > > > > > > > Vladimir > > > > > > > > > > > > > > > > > > > > > > > > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > > > >> Vladimir, > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> I can see that you changed > > > > > > sortNegZeroAndNaN(float[]...) but > > > > > > > > > > probably > > > > > > > > > > > > > >> forgot to change sortNegZeroAndNaN(double[]...). > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> You really puzzled me with failed testcase and > > > > note that > > > > > > > > sorting > > > > > > > > > > > > > >> algorithm (without special attention to zeros) > > > > > > generally may > > > > > > > > > > change > > > > > > > > > > > > > >> number of negative zeros. > > > > > > > > > > > > > >> I will provide my comments later. > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> As for counting sort, I think we should use single > > > > format > > > > > > > > > > style over > > > > > > > > > > > > > >> the file (unless we have valuable reason not to do > > > > > > this). I > > > > > > > > > > mean to > > > > > > > > > > > > > >> choose > > > > > > > > > > > > > >> 1) > > > > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > > > > >> return; > > > > > > > > > > > > > >> } > > > > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > > > > >> 2) > > > > > > > > > > > > > >> if (toIndex - fromIndex > > > > > > > > > > > > > > >> COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > > > > > > > > > > > > > >> countingSort(a, fromIndex, toIndex); > > > > > > > > > > > > > >> } else { > > > > > > > > > > > > > >> sort(a, fromIndex, toIndex - 1, true); > > > > > > > > > > > > > >> } > > > > > > > > > > > > > >> I prefer the second one. > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> Thanks a lot, > > > > > > > > > > > > > >> Dmytro Sheyko > > > > > > > > > > > > > >> > > > > > > > > > > > > > >> > Date: Tue, 18 May 2010 18:57:50 +0400 > > > > > > > > > > > > > >> > From: iaroslavski at mail.ru > > > > > > > > > > > > > >> > Subject: Re: New portion of improvements for > > > > Dual-Pivot > > > > > > > > > > Quicksort > > > > > > > > > > > > > >> > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > > >> > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > Hello, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > I've run your modification for counting sort, it > > > > real > > > > > > > > faster. > > > > > > > > > > > > > >> > I attached new version with your changes (I did > > > > > > little bit > > > > > > > > > > > > > >> > format it) and included my case with float/double. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > Note that you modification doesn't pass test from > > > > > > > > Sorting class, > > > > > > > > > > > > > >> > which I sent earlier. It fails on float/double test: > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > Test #3: random = 666, len = 34, a = 0, g = 6, z = > > > > > > 9, n = > > > > > > > > > > 10, p = 9 > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > I suggest shorter method (which is based on your > > > > > > idea to > > > > > > > > skip > > > > > > > > > > > > counting > > > > > > > > > > > > > >> > negative zeros on Phase 1.): I found find first zero > > > > > > > > index (or > > > > > > > > > > > > it will > > > > > > > > > > > > > >> > be index of first positive element if no zeros > > > > at all, > > > > > > > > or last > > > > > > > > > > > > > >> negative, > > > > > > > > > > > > > >> > if no positive and zero elements) and then swap > > > > negative > > > > > > > > > > zero to the > > > > > > > > > > > > > >> > beginning of the sub-range. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > int hi = right; > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > while (left < hi) { > > > > > > > > > > > > > >> > int middle = (left + hi) >>> 1; > > > > > > > > > > > > > >> > float middleValue = a[middle]; > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > if (middleValue < 0.0f) { > > > > > > > > > > > > > >> > left = middle + 1; > > > > > > > > > > > > > >> > } else { > > > > > > > > > > > > > >> > hi = middle; > > > > > > > > > > > > > >> > } > > > > > > > > > > > > > >> > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > for (int k = left, p = left; k <= right; k++) { > > > > > > > > > > > > > >> > float ak = a[k]; > > > > > > > > > > > > > >> > if (ak != 0.0f) { > > > > > > > > > > > > > >> > return; > > > > > > > > > > > > > >> > } > > > > > > > > > > > > > >> > if (Float.floatToRawIntBits(ak) < 0) { // ak is > > > > -0.0f > > > > > > > > > > > > > >> > a[k] = +0.0f; > > > > > > > > > > > > > >> > a[p++] = -0.0f; > > > > > > > > > > > > > >> > } > > > > > > > > > > > > > >> > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > Important note: in partitioning loop there are > > > > several > > > > > > > > places > > > > > > > > > > > > > >> > (marked by // !) where potential bug with -0.0 > > > > could be > > > > > > > > > > > > > >> > (when pivot and a[great] are zeros with different > > > > > > signs): > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > if (a[great] == pivot1) { > > > > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > > > > >> > + a[less++] = a[great]; > > > > > > > > > > > > > >> > } else { // pivot1 < a[great] < pivot2 > > > > > > > > > > > > > >> > a[k] = a[great]; > > > > > > > > > > > > > >> > } > > > > > > > > > > > > > >> > - a[great--] = pivot2; // ! > > > > > > > > > > > > > >> > + a[great--] = ak; > > > > > > > > > > > > > >> > } else if (ak == pivot1) { // Move a[k] to left part > > > > > > > > > > > > > >> > a[k] = a[less]; > > > > > > > > > > > > > >> > - a[less++] = pivot1; // ! > > > > > > > > > > > > > >> > + a[less++] = ak; > > > > > > > > > > > > > >> > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > and the same in "Pivots are equal" branch. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > I did changes "pivot1/2 -> ak" in methods for > > > > all types > > > > > > > > > > > > > >> > and "pivot1 -> a[great]" in float/double > > > > sections only. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > Please, review format changes for counting sort > > > > and new > > > > > > > > version > > > > > > > > > > > > > >> > of Phase 3 for float/double. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > Thank you, > > > > > > > > > > > > > >> > Vladimir > > > > > > > > > > > > > >> > > > > > > > > > > > > > > >> > Dmytro Sheyko wrote: > > > > > > > > > > > > > >> > > Hi, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > About counting sort again. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > 1. This condition "i < count.length && k <= > > > > right" is > > > > > > > > > > excessive. > > > > > > > > > > > > > >> Any one > > > > > > > > > > > > > >> > > conjunct is enough. "k <= right" seems better. > > > > > > > > > > > > > >> > > 2. No need to calculate "short value = (short) > > > > (i + > > > > > > > > > > > > > >> Short.MIN_VALUE)" > > > > > > > > > > > > > >> > > when "count[i]" is zero. > > > > > > > > > > > > > >> > > 3. For signed primitives (byte and short) we would > > > > > > > > better loop > > > > > > > > > > > > > >> backward. > > > > > > > > > > > > > >> > > Thanks to "k >= fromIndex" condition we will quit > > > > > > looping > > > > > > > > > > earlier > > > > > > > > > > > > > >> > > assuming that typically we work with positive > > > > numbers. > > > > > > > > > > > > > >> > > For unsigned primitives (char) we would better > > > > loop > > > > > > > > forward > > > > > > > > > > > > because > > > > > > > > > > > > > >> > > typically we work with characters about zero > > > > (ASCII). > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > - 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--) { > > > > > > > > > > > > > >> > > - a[k++] = value; > > > > > > > > > > > > > >> > > - } > > > > > > > > > > > > > >> > > - } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > + for (int i = NUM_SHORT_VALUES - 1, k = > > > > toIndex - > > > > > > 1; k >= > > > > > > > > > > > > > >> > > fromIndex; --i) { > > > > > > > > > > > > > >> > > + while (count[i] == 0) --i; > > > > > > > > > > > > > >> > > + short value = (short) (i + Short.MIN_VALUE); > > > > > > > > > > > > > >> > > + int s = count[i]; > > > > > > > > > > > > > >> > > + do { a[k--] = value; } while (--s > 0); > > > > > > > > > > > > > >> > > + } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > Thanks, > > > > > > > > > > > > > >> > > Dmytro Sheyko > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > >> > > > From: iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > > >> > > > CC: core-libs-dev at openjdk.java.net; > > > > > > iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > Subject: Re[2]: New portion of improvements for > > > > > > > > Dual-Pivot > > > > > > > > > > > > > >> Quicksort > > > > > > > > > > > > > >> > > > Date: Tue, 18 May 2010 01:11:19 +0400 > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > Sounds good! > > > > > > > > > > > > > >> > > > Will consider too... > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > Mon, 17 May 2010 22:24:11 +0700 ?????? ?? > > > > Dmytro > > > > > > Sheyko > > > > > > > > > > > > > >> > > : > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > Hi, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > Regarding counting sort. We can check > > > > whether we > > > > > > > > should > > > > > > > > > > > > > >> switch to > > > > > > > > > > > > > >> > > counting sort only once in the beginning. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > > Date: Mon, 17 May 2010 17:30:37 +0400 > > > > > > > > > > > > > >> > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > > > Subject: Re: New portion of improvements for > > > > > > > > Dual-Pivot > > > > > > > > > > > > > >> Quicksort > > > > > > > > > > > > > >> > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > > >> > > > > > CC: core-libs-dev at openjdk.java.net > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > Hello, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > Thank you for review, I'll check and run > > > > > > tests again > > > > > > > > > > > > with you > > > > > > > > > > > > > >> > > changes. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > Thank you, > > > > > > > > > > > > > >> > > > > > Vladimir > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > > Dmytro Sheyko wrote: > > > > > > > > > > > > > >> > > > > > > Hello, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > More ideas. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > 1. We can use > > > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits instead of > > > > > > > > > > > > > >> Double.doubleToLongBits and > > > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits instead of > > > > > > > > > > Float.floatToIntBits. > > > > > > > > > > > > > >> > > > > > > No need to handle NaN's because they > > > > all are > > > > > > > > placed to > > > > > > > > > > > > > >> the end > > > > > > > > > > > > > >> > > of array. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > 2. Note that > > > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(+0.0) == 0L and > > > > > > > > > > > > > >> > > > > > > Double.doubleToRawLongBits(-0.0) == > > > > > > > > Long.MIN_VALUE and > > > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(+0.0) == 0 and > > > > > > > > > > > > > >> > > > > > > Float.floatToRawIntBits(-0.0) == > > > > > > > > Integer.MIN_VALUE. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > Comparing with is zero usually more > > > > efficient > > > > > > > > (or at > > > > > > > > > > > > > >> least not > > > > > > > > > > > > > >> > > worse) > > > > > > > > > > > > > >> > > > > > > than with other values. Thus such pattern > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && NEGATIVE_ZERO == > > > > > > > > > > > > Float.floatToIntBits(ak)) > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > can be replaced with > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > if (ak == 0.0f && > > > > Float.floatToIntBits(ak) > > > > > > < 0) > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > 3. It would be more efficient to count > > > > > > > > negative zeros > > > > > > > > > > > > after > > > > > > > > > > > > > >> > > sorting. > > > > > > > > > > > > > >> > > > > > > General sorting algorithm puts both > > > > > > negative and > > > > > > > > > > positive > > > > > > > > > > > > > >> zeros > > > > > > > > > > > > > >> > > together > > > > > > > > > > > > > >> > > > > > > (but maybe not in right order). > > > > > > > > > > > > > >> > > > > > > Therefore we have to process less > > > > elements > > > > > > because > > > > > > > > > > > > > >> usually we > > > > > > > > > > > > > >> > > have less > > > > > > > > > > > > > >> > > > > > > zeros than other numbers. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > Thanks, > > > > > > > > > > > > > >> > > > > > > Dmytro Sheyko > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > >> > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > > > > > To: dmytro_sheyko at hotmail.com; > > > > > > jjb at google.com > > > > > > > > > > > > > >> > > > > > > > CC: core-libs-dev at openjdk.java.net; > > > > > > > > > > iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > > > > > Subject: Re[6]: New portion of > > > > > > improvements for > > > > > > > > > > > > Dual-Pivot > > > > > > > > > > > > > >> > > Quicksort > > > > > > > > > > > > > >> > > > > > > > Date: Fri, 14 May 2010 23:54:06 +0400 > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > Hello, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > I've updated the class, please, > > > > review the > > > > > > > > changes. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > Vladimir > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > Fri, 14 May 2010 01:48:11 +0700 > > > > ?????? ?? > > > > > > > > Dmytro > > > > > > > > > > Sheyko > > > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > Yes. I prefer F (Find First zero > > > > using > > > > > > binary > > > > > > > > > > search) > > > > > > > > > > > > > >> over > > > > > > > > > > > > > >> > > C (Count > > > > > > > > > > > > > >> > > > > > > negatives) and S (Smart Scan for zero). > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > > > > > > > > >> > > > > > > > > > CC: jjb at google.com; > > > > > > > > > > core-libs-dev at openjdk.java.net; > > > > > > > > > > > > > >> > > > > > > iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > > > > > > > Subject: Re[4]: New portion of > > > > > > > > improvements for > > > > > > > > > > > > > >> > > Dual-Pivot Quicksort > > > > > > > > > > > > > >> > > > > > > > > > Date: Thu, 13 May 2010 21:34:54 > > > > +0400 > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Dmytro, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I've tested your suggested > > > > variants, and > > > > > > > > > > found that > > > > > > > > > > > > > >> case "C" > > > > > > > > > > > > > >> > > > > > > > > > (very interesting approach to > > > > find first > > > > > > > > > > position > > > > > > > > > > > > > >> of zero > > > > > > > > > > > > > >> > > > > > > > > > by counting negative elements) works > > > > > > > > slower than > > > > > > > > > > > > > >> original > > > > > > > > > > > > > >> > > > > > > > > > or two other cases. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Implementations "F" and "S" are > > > > very > > > > > > close > > > > > > > > > > to each > > > > > > > > > > > > > >> other > > > > > > > > > > > > > >> > > > > > > > > > and little bit faster than > > > > original. I > > > > > > > > > > prefer case > > > > > > > > > > > > > >> "F": > > > > > > > > > > > > > >> > > > > > > > > > it is shorter and more clear. Do > > > > you > > > > > > agree? > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > I'll prepare updated > > > > DualPivotQuicksort > > > > > > > > file and > > > > > > > > > > > > > >> send it > > > > > > > > > > > > > >> > > > > > > > > > tomorrow. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Thank you, > > > > > > > > > > > > > >> > > > > > > > > > Vladimir > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > Wed, 12 May 2010 17:04:52 +0700 > > > > ?????? > > > > > > > > ?? Dmytro > > > > > > > > > > > > > >> Sheyko > > > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Vladimir, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Your changes are good for me. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Additionally I have some > > > > > > > > comments/proposals > > > > > > > > > > > > > >> regarding > > > > > > > > > > > > > >> > > dealing > > > > > > > > > > > > > >> > > > > > > with negative zeros. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 1. Scanning for the first zero > > > > we can > > > > > > > > > > avoid range > > > > > > > > > > > > > >> check > > > > > > > > > > > > > >> > > (i >= > > > > > > > > > > > > > >> > > > > > > left) if we have at least one negative > > > > value. > > > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > > > Tue May 11 > > > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortS.java Wed > > > > > > May 12 > > > > > > > > > > 12:10:46 > > > > > > > > > > > > > >> 2010 > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,10 +1705,15 @@ > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > > > left, n); > > > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = 0; > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > > > > left && > > > > > > > > > > a[i] == > > > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > > > > >> > > > > > > > > > > + if (a[left] < 0.0f) { > > > > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = findAnyZero(a, > > > > left, n); > > > > > > > > > > > > > >> > > > > > > > > > > + > > > > > > > > > > > > > >> > > > > > > > > > > + // there is at least one > > > > negative > > > > > > > > value, so > > > > > > > > > > > > range > > > > > > > > > > > > > >> > > check is > > > > > > > > > > > > > >> > > > > > > not needed > > > > > > > > > > > > > >> > > > > > > > > > > + for (int i = zeroIndex - 1; > > > > /*i >= > > > > > > > > left &&*/ > > > > > > > > > > > > > >> a[i] == > > > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > > > >> > > > > > > > > > > + zeroIndex = i; > > > > > > > > > > > > > >> > > > > > > > > > > + } > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > > > > positive zeros > > > > > > > > > > > > back into > > > > > > > > > > > > > >> > > negative zeros > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 2. We can find the position of > > > > the > > > > > > first > > > > > > > > > > zero by > > > > > > > > > > > > > >> counting > > > > > > > > > > > > > >> > > > > > > negative values during preprocessing > > > > phase. > > > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > > > Tue May 11 > > > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortC.java Wed > > > > > > May 12 > > > > > > > > > > 12:01:24 > > > > > > > > > > > > > >> 2010 > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1678,7 +1678,7 @@ > > > > > > > > > > > > > >> > > > > > > > > > > * Phase 1: Count negative zeros > > > > > > and move > > > > > > > > > > NaNs to > > > > > > > > > > > > > >> end of > > > > > > > > > > > > > >> > > array. > > > > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > > > > >> > > > > > > > > > > final int NEGATIVE_ZERO = > > > > > > > > > > > > > >> Float.floatToIntBits(-0.0f); > > > > > > > > > > > > > >> > > > > > > > > > > - int numNegativeZeros = 0; > > > > > > > > > > > > > >> > > > > > > > > > > + int numNegativeZeros = 0, > > > > > > > > > > numNegativeValues = 0; > > > > > > > > > > > > > >> > > > > > > > > > > int n = right; > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int k = left; k <= n; k++) { > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1689,6 +1689,8 @@ > > > > > > > > > > > > > >> > > > > > > > > > > } else if (ak != ak) { // > > > > i.e., ak > > > > > > is NaN > > > > > > > > > > > > > >> > > > > > > > > > > a[k--] = a[n]; > > > > > > > > > > > > > >> > > > > > > > > > > a[n--] = Float.NaN; > > > > > > > > > > > > > >> > > > > > > > > > > + } else if (ak < 0.0f) { > > > > > > > > > > > > > >> > > > > > > > > > > + numNegativeValues++; > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,7 +1707,7 @@ > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > > > left, n); > > > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = > > > > numNegativeValues; > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex - 1; i >= > > > > > > left && > > > > > > > > > > a[i] == > > > > > > > > > > > > > >> 0.0f; > > > > > > > > > > > > > >> > > i--) { > > > > > > > > > > > > > >> > > > > > > > > > > zeroIndex = i; > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > 3. We can use binary search to > > > > find > > > > > > > > the first > > > > > > > > > > > > > >> zero and > > > > > > > > > > > > > >> > > thus > > > > > > > > > > > > > >> > > > > > > avoid linear scan. > > > > > > > > > > > > > >> > > > > > > > > > > --- DualPivotQuicksort.java > > > > Tue May 11 > > > > > > > > > > > > 09:04:19 2010 > > > > > > > > > > > > > >> > > > > > > > > > > +++ DualPivotQuicksortF.java Wed > > > > > > May 12 > > > > > > > > > > 12:03:58 > > > > > > > > > > > > > >> 2010 > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1705,11 +1705,7 @@ > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Find first zero element > > > > > > > > > > > > > >> > > > > > > > > > > - int zeroIndex = findAnyZero(a, > > > > > > left, n); > > > > > > > > > > > > > >> > > > > > > > > > > - > > > > > > > > > > > > > >> > > > > > > > > > > - for (int i = zeroIndex - 1; i >= > > > > > > > > left && > > > > > > > > > > a[i] == > > > > > > > > > > > > > >> > > 0.0f; i--) { > > > > > > > > > > > > > >> > > > > > > > > > > - zeroIndex = i; > > > > > > > > > > > > > >> > > > > > > > > > > - } > > > > > > > > > > > > > >> > > > > > > > > > > + int zeroIndex = findFirstZero(a, > > > > > > > > left, n); > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > // Turn the right number of > > > > > > positive zeros > > > > > > > > > > > > back into > > > > > > > > > > > > > >> > > negative zeros > > > > > > > > > > > > > >> > > > > > > > > > > for (int i = zeroIndex, m = > > > > > > zeroIndex + > > > > > > > > > > > > > >> > > numNegativeZeros; i < > > > > > > > > > > > > > >> > > > > > > m; i++) { > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1718,7 +1714,7 @@ > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > /** > > > > > > > > > > > > > >> > > > > > > > > > > - * Returns the index of some zero > > > > > > > > element > > > > > > > > > > in the > > > > > > > > > > > > > >> > > specified > > > > > > > > > > > > > >> > > > > > > range via > > > > > > > > > > > > > >> > > > > > > > > > > + * Returns the index of the > > > > first > > > > > > zero > > > > > > > > > > element > > > > > > > > > > > > > >> in the > > > > > > > > > > > > > >> > > > > > > specified range via > > > > > > > > > > > > > >> > > > > > > > > > > * binary search. The range is > > > > assumed > > > > > > > > to be > > > > > > > > > > > > > >> sorted, and > > > > > > > > > > > > > >> > > must > > > > > > > > > > > > > >> > > > > > > contain > > > > > > > > > > > > > >> > > > > > > > > > > * at least one zero. > > > > > > > > > > > > > >> > > > > > > > > > > * > > > > > > > > > > > > > >> > > > > > > > > > > @@ -1726,18 +1722,17 @@ > > > > > > > > > > > > > >> > > > > > > > > > > * @param low the index of the > > > > first > > > > > > > > element, > > > > > > > > > > > > > >> inclusive, > > > > > > > > > > > > > >> > > to be > > > > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > > > > >> > > > > > > > > > > * @param high the index of the > > > > last > > > > > > > > element, > > > > > > > > > > > > > >> inclusive, > > > > > > > > > > > > > >> > > to be > > > > > > > > > > > > > >> > > > > > > searched > > > > > > > > > > > > > >> > > > > > > > > > > */ > > > > > > > > > > > > > >> > > > > > > > > > > - private static int > > > > > > > > findAnyZero(float[] a, > > > > > > > > > > > > int low, > > > > > > > > > > > > > >> > > int high) { > > > > > > > > > > > > > >> > > > > > > > > > > - while (true) { > > > > > > > > > > > > > >> > > > > > > > > > > + private static int > > > > > > > > findFirstZero(float[] > > > > > > > > > > a, int > > > > > > > > > > > > > >> low, > > > > > > > > > > > > > >> > > int high) { > > > > > > > > > > > > > >> > > > > > > > > > > + while (low < high) { > > > > > > > > > > > > > >> > > > > > > > > > > int middle = (low + high) >>> 1; > > > > > > > > > > > > > >> > > > > > > > > > > float middleValue = a[middle]; > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > if (middleValue < 0.0f) { > > > > > > > > > > > > > >> > > > > > > > > > > low = middle + 1; > > > > > > > > > > > > > >> > > > > > > > > > > - } else if (middleValue > 0.0f) { > > > > > > > > > > > > > >> > > > > > > > > > > - high = middle - 1; > > > > > > > > > > > > > >> > > > > > > > > > > - } else { // middleValue == 0.0f > > > > > > > > > > > > > >> > > > > > > > > > > - return middle; > > > > > > > > > > > > > >> > > > > > > > > > > + } else { // middleValue >= 0.0f > > > > > > > > > > > > > >> > > > > > > > > > > + high = middle; > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > + return low; > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > } > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Counting negative values > > > > appeared more > > > > > > > > > > expensive > > > > > > > > > > > > > >> than > > > > > > > > > > > > > >> > > any other > > > > > > > > > > > > > >> > > > > > > variants. > > > > > > > > > > > > > >> > > > > > > > > > > The last proposal seems to me as > > > > > > > > efficient > > > > > > > > > > as the > > > > > > > > > > > > > >> current > > > > > > > > > > > > > >> > > > > > > solution is in its worst case - when > > > > we have > > > > > > > > only one > > > > > > > > > > > > > >> negative > > > > > > > > > > > > > >> > > zero (in > > > > > > > > > > > > > >> > > > > > > the half of array). > > > > > > > > > > > > > >> > > > > > > > > > > And it shows the best result if we > > > > > > > > have many > > > > > > > > > > > > zeros. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > Regards, > > > > > > > > > > > > > >> > > > > > > > > > > Dmytro Sheyko > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > > > > > > > > > To: jjb at google.com; > > > > > > > > > > dmytro_sheyko at hotmail.com > > > > > > > > > > > > > >> > > > > > > > > > > > CC: > > > > core-libs-dev at openjdk.java.net; > > > > > > > > > > > > > >> iaroslavski at mail.ru > > > > > > > > > > > > > >> > > > > > > > > > > > Subject: Re[2]: New portion of > > > > > > > > > > improvements for > > > > > > > > > > > > > >> > > Dual-Pivot > > > > > > > > > > > > > >> > > > > > > Quicksort > > > > > > > > > > > > > >> > > > > > > > > > > > Date: Sun, 9 May 2010 > > > > 23:51:27 +0400 > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Josh, > > > > > > > > > > > > > >> > > > > > > > > > > > Dmytro, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > I have done more thoroughly > > > > testing > > > > > > > > "great - > > > > > > > > > > > > > >> less > 5 * > > > > > > > > > > > > > >> > > > > > > seventh" vs. "less < e1 && great > e5", > > > > > > > > > > > > > >> > > > > > > > > > > > and found that more > > > > symmetric code > > > > > > > > "less > > > > > > > > > > < e1 && > > > > > > > > > > > > > >> > > great > e5" > > > > > > > > > > > > > >> > > > > > > is little bit faster, ~0.5..0.7% > > > > > > > > > > > > > >> > > > > > > > > > > > on both VMs. Other code has > > > > not been > > > > > > > > > > changed. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Please, take the latest > > > > version in > > > > > > > > > > attachment. > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Vladimir > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > Tue, 4 May 2010 21:57:42 -0700 > > > > > > > > ?????? ?? > > > > > > > > > > Joshua > > > > > > > > > > > > > >> Bloch > > > > > > > > > > > > > >> > > > > > > : > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Vladimir, > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > Old: > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >298 if (less < e1 && great > > > > > e5) { > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > > New: > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >256 if (great - less > 5 * > > > > > > seventh) { > > > > > > > > > > > > > >> > > > > > > > > > > > > > > > > > > > > > > > > >> > > > > > > > > > > > >Regards, > > > > > > > > > > > > > >> > > > > > > > > > > > >Josh _________________________________________________________________ Your E-mail and More On-the-Go. Get Windows Live Hotmail Free. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: From forax at univ-mlv.fr Fri Jun 4 07:47:39 2010 From: forax at univ-mlv.fr (=?ISO-8859-1?Q?R=E9mi_Forax?=) Date: Fri, 04 Jun 2010 09:47:39 +0200 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" In-Reply-To: References: <4C08A40A.7030105@oracle.com> Message-ID: <4C08AF9B.4010605@univ-mlv.fr> Le 04/06/2010 09:13, Martin Buchholz a ?crit : > Looks good! > > Martin > Ok for me too. R?mi > On Thu, Jun 3, 2010 at 23:58, Joe Darcy wrote: > >> Hello. >> >> Please review my fix for >> >> 6935997 "Please add a nested throwable constructor to AssertionError" >> http://cr.openjdk.java.net/~darcy/6935997.0/ >> >> Thanks, >> >> -Joe >> >> From brucechapman at paradise.net.nz Fri Jun 4 08:46:01 2010 From: brucechapman at paradise.net.nz (Bruce Chapman) Date: Fri, 04 Jun 2010 20:46:01 +1200 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" In-Reply-To: <4C08A40A.7030105@oracle.com> References: <4C08A40A.7030105@oracle.com> Message-ID: <4C08BD49.70008@paradise.net.nz> Is this a first step to fixing the compiler error where the JLS says the (2nd) expression in an assert statement is converted to String and a new AssertionError is constructed with that STRING as the argument, and that AssertionError is thrown? (my paraphrase) http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10 BUT assert false : new Throwable(); has evidence to suggest that this (JLS spec) is not currently the case, since the AssertionError thrown has a cause, and therefore the Throwable was not converted to a String before being passed to the AssertionError constructor. You can get away with having the AssertionError constructor do the conversion in all other cases (which reduces the amount of bytecode emitted for each assert statement), but this currently does not work for a Throwable. So it might be better for the 1st argument of the new method to be Object, and having almost the same semantics as the current single Object arg constructor - except it would NOT treat the first arg as the cause when it is a Throwable. This way the assert statements could for (other than primitives) be compiled to call the 2 arg constructor with a null value for second arg and thus become indistinguishable (other than bytecode inspection) from something that did exactly as the JLS says. yeah - call me pedantic if you want :-) Bruce Joe Darcy wrote: > Hello. > > Please review my fix for > > 6935997 "Please add a nested throwable constructor to AssertionError" > http://cr.openjdk.java.net/~darcy/6935997.0/ > > Thanks, > > -Joe > From David.Holmes at oracle.com Fri Jun 4 10:27:45 2010 From: David.Holmes at oracle.com (David Holmes) Date: Fri, 04 Jun 2010 20:27:45 +1000 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" In-Reply-To: <4C08BD49.70008@paradise.net.nz> References: <4C08A40A.7030105@oracle.com> <4C08BD49.70008@paradise.net.nz> Message-ID: <4C08D521.3030108@oracle.com> Bruce Chapman said the following on 06/04/10 18:46: > Is this a first step to fixing the compiler error where the JLS says the > (2nd) expression in an assert statement is converted to String and a new > AssertionError is constructed with that STRING as the argument, and that > AssertionError is thrown? (my paraphrase) > > http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10 > > BUT > > assert false : new Throwable(); > > has evidence to suggest that this (JLS spec) is not currently the case, > since the AssertionError thrown has a cause, and therefore the Throwable > was not converted to a String before being passed to the AssertionError > constructor. I reported this back in 2005 :) It's considered a spec bug. See 6302175 - Second argument of assert statement not always converted to a String Cheers, David Holmes > You can get away with having the AssertionError constructor do the > conversion in all other cases (which reduces the amount of bytecode > emitted for each assert statement), but this currently does not work for > a Throwable. > > So it might be better for the 1st argument of the new method to be > Object, and having almost the same semantics as the current single > Object arg constructor - except it would NOT treat the first arg as the > cause when it is a Throwable. > > This way the assert statements could for (other than primitives) be > compiled to call the 2 arg constructor with a null value for second arg > and thus become indistinguishable (other than bytecode inspection) from > something that did exactly as the JLS says. > > yeah - call me pedantic if you want :-) > > Bruce > > > > Joe Darcy wrote: >> Hello. >> >> Please review my fix for >> >> 6935997 "Please add a nested throwable constructor to AssertionError" >> http://cr.openjdk.java.net/~darcy/6935997.0/ >> >> Thanks, >> >> -Joe >> > > From weijun.wang at sun.com Fri Jun 4 11:29:30 2010 From: weijun.wang at sun.com (weijun.wang at sun.com) Date: Fri, 04 Jun 2010 11:29:30 +0000 Subject: hg: jdk7/tl/jdk: 6951366: kerberos login failure on win2008 with AD set to win2000 compat mode Message-ID: <20100604112949.625BA46F61@hg.openjdk.java.net> Changeset: ea8c57ec8409 Author: weijun Date: 2010-06-04 19:28 +0800 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/ea8c57ec8409 6951366: kerberos login failure on win2008 with AD set to win2000 compat mode Reviewed-by: valeriep, xuelei ! src/share/classes/sun/security/krb5/Credentials.java ! src/share/classes/sun/security/krb5/EncryptionKey.java ! src/share/classes/sun/security/krb5/KrbAsReq.java ! src/windows/classes/sun/security/krb5/internal/tools/Kinit.java ! test/sun/security/krb5/auto/Context.java ! test/sun/security/krb5/auto/KDC.java + test/sun/security/krb5/auto/W83.java From Ulf.Zibis at gmx.de Fri Jun 4 15:49:44 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Fri, 04 Jun 2010 17:49:44 +0200 Subject: Shouldn't HashSet/Map use Arrays.hashCode(x[]) ? Message-ID: <4C092098.1030904@gmx.de> Otherwise e.g. int[] as key for HashSet/Map doesn't make any sense. I use a class where the content of an int[] defines the uniqueness or there instances. Before I create a new instance, I have to check if there is just one for the same int[] content. Using the current HashSet/Map implementation does not serve this need. It seems, that I should first instantiate a temporary object containing the int[], hash it in the set/map, and later throw it away. :-( Maybe another reason for solving http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6812862 -Ulf From martinrb at google.com Fri Jun 4 18:26:34 2010 From: martinrb at google.com (Martin Buchholz) Date: Fri, 4 Jun 2010 11:26:34 -0700 Subject: Shouldn't HashSet/Map use Arrays.hashCode(x[]) ? In-Reply-To: <4C092098.1030904@gmx.de> References: <4C092098.1030904@gmx.de> Message-ID: Aside from the fact that it would be a hugely incompatible change to change the hashing/equality algorithm now, it is quite a religious argument about which is the Right Thing to do. Here's some religion/philosophy for you: http://home.pipeline.com/~hbaker1/ObjectIdentity.html There are some existing collections, e.g. BlockingQueues, that use identity comparison instead of content comparison. Martin On Fri, Jun 4, 2010 at 08:49, Ulf Zibis wrote: > Otherwise e.g. int[] as key for HashSet/Map doesn't make any sense. > > I use a class where the content of an int[] defines the uniqueness or there > instances. > Before I create a new instance, I have to check if there is just one for the > same int[] content. > Using the current HashSet/Map implementation does not serve this need. > It seems, that I should first instantiate a temporary object containing the > int[], hash it in the set/map, and later throw it away. :-( > > Maybe another reason for solving > http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6812862 > > -Ulf > > > From Ulf.Zibis at gmx.de Fri Jun 4 21:24:29 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Fri, 04 Jun 2010 23:24:29 +0200 Subject: Shouldn't HashSet/Map use Arrays.hashCode(x[]) ? In-Reply-To: References: <4C092098.1030904@gmx.de> Message-ID: <4C096F0D.10903@gmx.de> Am 04.06.2010 20:26, schrieb Martin Buchholz: > Aside from the fact that it would be a hugely incompatible change > to change the hashing/equality algorithm now, > it is quite a religious argument about which is the Right Thing to do. > In most cases we have freedom of religion as we have HashMap and IdentityHashMap. There is one exception (maybe more?) for x[] as key. Both compare arrays on identity level, and unfortunately it's almost impossible to change this due to incompatibility. Bug ID 6812862 would provide this religion freedom as a side effect. So I again don't understand the resistance against it. > Here's some religion/philosophy for you: > http://home.pipeline.com/~hbaker1/ObjectIdentity.html > Thanks for this interesting historical pre-Java paper. -Ulf > There are some existing collections, e.g. BlockingQueues, > that use identity comparison instead of content comparison. > > Martin > > On Fri, Jun 4, 2010 at 08:49, Ulf Zibis wrote: > >> Otherwise e.g. int[] as key for HashSet/Map doesn't make any sense. >> >> I use a class where the content of an int[] defines the uniqueness or there >> instances. >> Before I create a new instance, I have to check if there is just one for the >> same int[] content. >> Using the current HashSet/Map implementation does not serve this need. >> It seems, that I should first instantiate a temporary object containing the >> int[], hash it in the set/map, and later throw it away. :-( >> >> Maybe another reason for solving >> http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6812862 >> >> -Ulf >> >> >> >> > > From jonathan.gibbons at oracle.com Fri Jun 4 21:55:29 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Fri, 04 Jun 2010 21:55:29 +0000 Subject: hg: jdk7/tl/langtools: 6958391: add vizant support to langtools build Message-ID: <20100604215531.E4ADF46F8A@hg.openjdk.java.net> Changeset: b7fc560217d3 Author: jjg Date: 2010-06-04 14:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/b7fc560217d3 6958391: add vizant support to langtools build Reviewed-by: mcimadamore ! make/build.properties ! make/build.xml From jonathan.gibbons at oracle.com Sat Jun 5 00:34:20 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Sat, 05 Jun 2010 00:34:20 +0000 Subject: hg: jdk7/tl/langtools: 6958802: cleanup and doc langtools build.xml file Message-ID: <20100605003422.4C34346F92@hg.openjdk.java.net> Changeset: d33b91f360fc Author: jjg Date: 2010-06-04 17:33 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/d33b91f360fc 6958802: cleanup and doc langtools build.xml file Reviewed-by: ohair ! make/build.properties ! make/build.xml From martinrb at google.com Sat Jun 5 01:22:59 2010 From: martinrb at google.com (Martin Buchholz) Date: Fri, 4 Jun 2010 18:22:59 -0700 Subject: ArrayCopyMicroBenchmark.java Message-ID: Hi, I wrote an ArrayCopyMicroBenchmark years ago, that has found repeated use, despite being buried in a bug report. I'd like to commit it to the jdk repo. It differes only in minor touchups, like Oracle copyright, from the bug report. Chris and or David, please file a bug on my behalf. Thanks, Martin From martinrb at google.com Sat Jun 5 01:42:22 2010 From: martinrb at google.com (Martin Buchholz) Date: Fri, 4 Jun 2010 18:42:22 -0700 Subject: ArrayCopyMicroBenchmark.java In-Reply-To: References: Message-ID: Oops, forgot to include the link. But it should come as no surprise to the readers of this list that the webrev can be found here: http://cr.openjdk.java.net/~martin/webrevs/openjdk7/ArrayCopyMicroBenchmark/ Martin On Fri, Jun 4, 2010 at 18:22, Martin Buchholz wrote: > Hi, > > I wrote an ArrayCopyMicroBenchmark years ago, > that has found repeated use, > despite being buried in a bug report. > > I'd like to commit it to the jdk repo. > It differes only in minor touchups, > like Oracle copyright, > from the bug report. > > Chris and or David, > please file a bug on my behalf. > > Thanks, > > Martin > From martinrb at google.com Sat Jun 5 02:07:24 2010 From: martinrb at google.com (Martin Buchholz) Date: Fri, 4 Jun 2010 19:07:24 -0700 Subject: Removing a layer of synchronization on Math.random Message-ID: Here's an optimization for Math.random() that appears to be safe, despite the double-check access: http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Math.random/ David, if you agree, could you file a bug? Thanks, Martin From dl at cs.oswego.edu Sat Jun 5 12:07:56 2010 From: dl at cs.oswego.edu (Doug Lea) Date: Sat, 5 Jun 2010 08:07:56 -0400 (EDT) Subject: Removing a layer of synchronization on Math.random In-Reply-To: References: Message-ID: <52619.206.47.180.174.1275739676.squirrel@altair.cs.oswego.edu> > Here's an optimization for Math.random() that appears to be safe, > despite the double-check access: > It is just barely safe because of Random internals that preclude reordering of the field ref assignment. It would be nicer (and no slower) to put a Fences.orderWrites() here. Assuming we add Fences API for Java7. http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/atomic/Fences.html In the mean time, it would be good to include a more careful explanation in the comments so people don't blindly copy/paste/hack this construction when it doesn't apply. Greetings from Toronto (ISMM/PLDI) -Doug > http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Math.random/ > > David, if you agree, could you file a bug? > > Thanks, > > Martin > From Eamonn.McManus at Sun.COM Sat Jun 5 14:00:15 2010 From: Eamonn.McManus at Sun.COM (Eamonn McManus) Date: Sat, 05 Jun 2010 16:00:15 +0200 Subject: Removing a layer of synchronization on Math.random In-Reply-To: References: Message-ID: <4C0A586F.3030509@sun.com> It seems to me that if two threads call this Math.random() at the same time then two instances of Random() can be constructed. That contradicts the specification of the method, and is theoretically observable because the two values from Math.random() will typically not be a pair of values that could have been returned from consecutive calls to nextDouble() on a single Random instance. Granted, the chances of this actually mattering are infinitesimal, but I think the performance gain of avoiding a synchronized method only on the very first call to Math.random() is infinitesimal too. So I'd be inclined to leave well enough alone here. Eamonn Martin Buchholz wrote: > Here's an optimization for Math.random() that appears to be safe, > despite the double-check access: > > http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Math.random/ > > David, if you agree, could you file a bug? > > Thanks, > > Martin > From iaroslavski at mail.ru Sat Jun 5 19:40:31 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Sat, 05 Jun 2010 23:40:31 +0400 Subject: =?koi8-r?Q?Re[4]=3A_New_portion_of_improvements_for_Dual-Pivot_Quicksort?= In-Reply-To: References: Message-ID: I tried with separate method sortPivotCandidates(...), no changes in behaviour, but at the same time I don't see that the method makes sources much cleaner, inline comments are enough. I attach the latest version of DPQ. Fri, 4 Jun 2010 14:21:58 +0700 ?????? ?? Dmytro Sheyko : > Seems good, > > One note. Since we gave up to sort pivot candidates in local variables, maybe we can move this out to separate procedure (in order to make sources cleaner a bit), e.g. > > private static void sortPivotCandidates(double[] a, int ae1, int ae2, int ae3, int ae4, int ae5) > > Hope the compiler is able to inline it without extra cost. > > Thanks, > Dmytro Sheyko > > > From: iaroslavski at mail.ru > > To: dmytro_sheyko at hotmail.com > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > Subject: Re[2]: New portion of improvements for Dual-Pivot Quicksort > > Date: Fri, 4 Jun 2010 01:17:57 +0400 > > > > Hello, > > > > I tried your case (which is selection sort) and it works as expected: not worse > > than "network" or "bubble" sorting. But nevertheless, the best choice is to use > > insertion sort, I wrote more elegant implementation, see: > > > > ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > > > // Sort these elements using insertion sort > > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > } > > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > } > > } > > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > } > > } > > } > > > > ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] = ae4; > > > > Note that this implementation doesn't use local variables ae1, .. , ae5 > > at all, and without variables it works faster. This code is not too long, > > extra 4 lines only. And if on client VM it works as other "network" > > implementations, but on server VM it wins 1.2%. > > > > In compare with first implementation of Dual-Pivot Quicksort, which > > is used now in JDK 7, suggested version wins ~15% and 6% for client > > and server modes. > > > > Updated version of the class I will send tomorrow. > > > > Dmytro, > > could you please look at suggested insertion sort for 5 elements? > > > > Do you have any comments/improvements? One place to be improved > > is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where > > element is compared with all sorted elements, whereas we can save > > comparisons by binary fork. But implementation becomes too complex > > and long. > > > > As it can be expected, the best sorting for small arrays is insertion, > > then selection and then only bubble sort, even for 5 elements. > > > > Best regards, > > Vladimir -------------- next part -------------- A non-text attachment was scrubbed... Name: DualPivotQuicksort.java Type: application/octet-stream Size: 111287 bytes Desc: not available URL: From martinrb at google.com Sat Jun 5 22:45:43 2010 From: martinrb at google.com (Martin Buchholz) Date: Sat, 5 Jun 2010 15:45:43 -0700 Subject: Removing a layer of synchronization on Math.random In-Reply-To: <4C0A586F.3030509@sun.com> References: <4C0A586F.3030509@sun.com> Message-ID: Thanks to all the reviewers who were too polite to say: """What was Martin thinking?""" For some reason I had imagined that Math.random() was itself synchronized. After editing, I have a very small change that is hardly worth doing except that I already have a webrev. http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Math.random/ Martin On Sat, Jun 5, 2010 at 07:00, Eamonn McManus wrote: > It seems to me that if two threads call this Math.random() at the same time > then two instances of Random() can be constructed. That contradicts the > specification of the method, and is theoretically observable because the two > values from Math.random() will typically not be a pair of values that could > have been returned from consecutive calls to nextDouble() on a single Random > instance. Granted, the chances of this actually mattering are infinitesimal, > but I think the performance gain of avoiding a synchronized method only on > the very first call to Math.random() is infinitesimal too. So I'd be > inclined to leave well enough alone here. > Eamonn > > Martin Buchholz wrote: >> >> Here's an optimization for Math.random() that appears to be safe, >> despite the double-check access: >> >> http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Math.random/ >> >> David, if you agree, could you file a bug? >> >> Thanks, >> >> Martin >> > From forax at univ-mlv.fr Sun Jun 6 09:59:24 2010 From: forax at univ-mlv.fr (=?ISO-8859-1?Q?R=E9mi_Forax?=) Date: Sun, 06 Jun 2010 11:59:24 +0200 Subject: Removing a layer of synchronization on Math.random In-Reply-To: References: <4C0A586F.3030509@sun.com> Message-ID: <4C0B717C.5070208@univ-mlv.fr> Le 06/06/2010 00:45, Martin Buchholz a ?crit : > Thanks to all the reviewers who were too polite to say: > > """What was Martin thinking?""" > > For some reason I had imagined that Math.random() > was itself synchronized. > > After editing, I have a very small change that is hardly worth doing > except that I already have a webrev. > > http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Math.random/ > > Martin > I think initRG can be written like that: private static synchronized Random initRNG() { RandomrandomNumberGenerator = this.randomNumberGenerator; return (randomNumberGenerator == null)? this.randomNumberGenerator = new Random() :randomNumberGenerator; } R?mi > On Sat, Jun 5, 2010 at 07:00, Eamonn McManus wrote: > >> It seems to me that if two threads call this Math.random() at the same time >> then two instances of Random() can be constructed. That contradicts the >> specification of the method, and is theoretically observable because the two >> values from Math.random() will typically not be a pair of values that could >> have been returned from consecutive calls to nextDouble() on a single Random >> instance. Granted, the chances of this actually mattering are infinitesimal, >> but I think the performance gain of avoiding a synchronized method only on >> the very first call to Math.random() is infinitesimal too. So I'd be >> inclined to leave well enough alone here. >> Eamonn >> >> Martin Buchholz wrote: >> >>> Here's an optimization for Math.random() that appears to be safe, >>> despite the double-check access: >>> >>> http://cr.openjdk.java.net/~martin/webrevs/openjdk7/Math.random/ >>> >>> David, if you agree, could you file a bug? >>> >>> Thanks, >>> >>> Martin >>> >>> >> -------------- next part -------------- An HTML attachment was scrubbed... URL: From ahughes at redhat.com Mon Jun 7 18:03:51 2010 From: ahughes at redhat.com (Andrew John Hughes) Date: Mon, 7 Jun 2010 19:03:51 +0100 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs Message-ID: On 2 June 2010 18:57, Andrew John Hughes wrote: > When building with JAVAC_MAX_WARNINGS=true, the build fails in > sun/nio/cs due to the use of -Werror. > > The following webrev: > > http://cr.openjdk.java.net/~andrew/warnings/webrev.03/ > > fixes the remaining warnings exposed by JAVAC_MAX_WARNINGS by: > > * Removing redundant casts > * Adding generic types to a number of List, Map and Class instances > * Turning off deprecation warnings locally in make/sun/nio/cs/Makefile > > Ok to push? If so, can I have a bug ID for this? > > Thanks, > -- > Andrew :-) > > Free Java Software Engineer > Red Hat, Inc. (http://www.redhat.com) > > Support Free Java! > Contribute to GNU Classpath and the OpenJDK > http://www.gnu.org/software/classpath > http://openjdk.java.net > > PGP Key: 94EFD9D8 (http://subkeys.pgp.net) > Fingerprint: F8EF F1EA 401E 2E60 15FA ?7927 142C 2591 94EF D9D8 > Ping! Any feedback on this? -- Andrew :-) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 From xueming.shen at oracle.com Mon Jun 7 18:06:42 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Mon, 07 Jun 2010 11:06:42 -0700 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: References: Message-ID: <4C0D3532.8080808@oracle.com> Andrew, I'm going through the webrev now. Need a little more time. -sherman Andrew John Hughes wrote: > On 2 June 2010 18:57, Andrew John Hughes wrote: > >> When building with JAVAC_MAX_WARNINGS=true, the build fails in >> sun/nio/cs due to the use of -Werror. >> >> The following webrev: >> >> http://cr.openjdk.java.net/~andrew/warnings/webrev.03/ >> >> fixes the remaining warnings exposed by JAVAC_MAX_WARNINGS by: >> >> * Removing redundant casts >> * Adding generic types to a number of List, Map and Class instances >> * Turning off deprecation warnings locally in make/sun/nio/cs/Makefile >> >> Ok to push? If so, can I have a bug ID for this? >> >> Thanks, >> -- >> Andrew :-) >> >> Free Java Software Engineer >> Red Hat, Inc. (http://www.redhat.com) >> >> Support Free Java! >> Contribute to GNU Classpath and the OpenJDK >> http://www.gnu.org/software/classpath >> http://openjdk.java.net >> >> PGP Key: 94EFD9D8 (http://subkeys.pgp.net) >> Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 >> >> > > Ping! Any feedback on this? > From ahughes at redhat.com Mon Jun 7 18:10:25 2010 From: ahughes at redhat.com (Andrew John Hughes) Date: Mon, 7 Jun 2010 19:10:25 +0100 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: <4C0D3532.8080808@oracle.com> References: <4C0D3532.8080808@oracle.com> Message-ID: On 7 June 2010 19:06, Xueming Shen wrote: > > Andrew, I'm going through the webrev now. ?Need a little more time. > > -sherman > > Andrew John Hughes wrote: >> >> On 2 June 2010 18:57, Andrew John Hughes wrote: >> >>> >>> When building with JAVAC_MAX_WARNINGS=true, the build fails in >>> sun/nio/cs due to the use of -Werror. >>> >>> The following webrev: >>> >>> http://cr.openjdk.java.net/~andrew/warnings/webrev.03/ >>> >>> fixes the remaining warnings exposed by JAVAC_MAX_WARNINGS by: >>> >>> * Removing redundant casts >>> * Adding generic types to a number of List, Map and Class instances >>> * Turning off deprecation warnings locally in make/sun/nio/cs/Makefile >>> >>> Ok to push? If so, can I have a bug ID for this? >>> >>> Thanks, >>> -- >>> Andrew :-) >>> >>> Free Java Software Engineer >>> Red Hat, Inc. (http://www.redhat.com) >>> >>> Support Free Java! >>> Contribute to GNU Classpath and the OpenJDK >>> http://www.gnu.org/software/classpath >>> http://openjdk.java.net >>> >>> PGP Key: 94EFD9D8 (http://subkeys.pgp.net) >>> Fingerprint: F8EF F1EA 401E 2E60 15FA ?7927 142C 2591 94EF D9D8 >>> >>> >> >> Ping! Any feedback on this? >> > > Ok, no rush; I didn't know if anyone had even seen the e-mail as there was no response. -- Andrew :-) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 From martinrb at google.com Mon Jun 7 19:58:10 2010 From: martinrb at google.com (Martin Buchholz) Date: Mon, 7 Jun 2010 12:58:10 -0700 Subject: Removing a layer of synchronization on Math.random In-Reply-To: <4C0B717C.5070208@univ-mlv.fr> References: <4C0A586F.3030509@sun.com> <4C0B717C.5070208@univ-mlv.fr> Message-ID: On Sun, Jun 6, 2010 at 02:59, R?mi Forax wrote: > I think initRG can be written like that: > > private static synchronized Random initRNG() { > Random randomNumberGenerator = this.randomNumberGenerator; > ? return (randomNumberGenerator == null)? this.randomNumberGenerator = new > Random() : randomNumberGenerator; > } Alright, I incorporated this small improvement. Then I noticed that StrictMath.random duplicates the code from Math.random, so I updated StrictMath.random as well. It would be more maintainable to have StrictMath.random simply call Math.random; I can do that, but other StrictMath methods do no such delegation. Then I made a small improvement to another static Random field in Collections.java. I didn't use double-checked-locking, as with Math.random, but at least I removed the theoretical never-observed weakness of the second read of "r" being null. I regenerated the webrev. I still need a bugid. Martin > > R?mi From joe.darcy at oracle.com Mon Jun 7 20:14:28 2010 From: joe.darcy at oracle.com (Joe Darcy) Date: Mon, 07 Jun 2010 13:14:28 -0700 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" In-Reply-To: <4C08BD49.70008@paradise.net.nz> References: <4C08A40A.7030105@oracle.com> <4C08BD49.70008@paradise.net.nz> Message-ID: <4C0D5324.1070508@oracle.com> Bruce Chapman wrote: > Is this a first step to fixing the compiler error where the JLS says the > (2nd) expression in an assert statement is converted to String and a new > AssertionError is constructed with that STRING as the argument, and that > AssertionError is thrown? (my paraphrase) No, just wanted to address this minor flaw in the set of constructors for this error :-) As David noted, the intended fix to the JLS issue is to change the JLS to match the long-standing behavior of the implementation. The implementation checks if the 2nd arg is a Throwable and, if so, sets the cause accordingly. -Joe > > http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10 > > > BUT > > assert false : new Throwable(); > > has evidence to suggest that this (JLS spec) is not currently the case, > since the AssertionError thrown has a cause, and therefore the Throwable > was not converted to a String before being passed to the AssertionError > constructor. > > You can get away with having the AssertionError constructor do the > conversion in all other cases (which reduces the amount of bytecode > emitted for each assert statement), but this currently does not work for > a Throwable. > > So it might be better for the 1st argument of the new method to be > Object, and having almost the same semantics as the current single > Object arg constructor - except it would NOT treat the first arg as the > cause when it is a Throwable. > > This way the assert statements could for (other than primitives) be > compiled to call the 2 arg constructor with a null value for second arg > and thus become indistinguishable (other than bytecode inspection) from > something that did exactly as the JLS says. > > yeah - call me pedantic if you want :-) > > Bruce > > > > Joe Darcy wrote: >> Hello. >> >> Please review my fix for >> >> 6935997 "Please add a nested throwable constructor to AssertionError" >> http://cr.openjdk.java.net/~darcy/6935997.0/ >> >> Thanks, >> >> -Joe >> > > From xueming.shen at oracle.com Mon Jun 7 22:04:52 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Mon, 07 Jun 2010 15:04:52 -0700 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: References: <4C0D3532.8080808@oracle.com> Message-ID: <4C0D6D04.5090701@oracle.com> Hi Andrew, 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in sun/nio/cs due to the use of -Werror (1)sun/io/ByteTocharISO2022JP.java #129, #151 if ((byte1 & (byte)0x80) != 0){ if ((byte2 & (byte)0x80) != 0){ (byte) casting is not necessary as well? (2)sun/io/ByteToCharJISAutoDetect.java we should (if I did not miss anything) simply change the sun/nio/cs/ext/JISAutoDetect.getByteMask1|2 to static, then no longer need to have an instance in ByteToCharJISAutoDetect. (3)sun/nio/cs/ext/EUC_JP_LINUX.java encoderJ0208 no longer needed? decodeMappingJ0208.start = 0xa1; decodeMappingJ0208.end = 0xfe; seems like we should simply replace decodeMappingJ0208.start/end with start/end and the decodeMappingJ0208 is no longer necessary as well. (4) again, it might be better to do something as below. The EUC_JP_xyz are something need to be re-written/-re-organized when we have time. short[] j0208Index1 = JIS_X_0208_Solaris_Decoder.getIndex1(); String[]j0208Index2 = JIS_X_0208_Solaris_Decoder.getIndex2(); int start = 0xa1; int end = -0xfe; 100 protected char decodeDouble(int byte1, int byte2) { 101 if (byte1 == 0x8e) { 102 return decoderJ0201.decode(byte2 - 256); 103 } 104 105 if (((byte1 < 0) 106 || (byte1 > j0208Index1.length)) 107 || ((byte2 < start) 108 || (byte2 > end))) 109 return REPLACE_CHAR; 110 111 char result = super.decodeDouble(byte1, byte2); 112 if (result != '\uFFFD') { 113 return result; 114 } else { 115 int n = (j0208Index1[byte1 - 0x80] & 0xf) * 116 (end - start + 1) 117 + (byte2 - start); 118 return j0208Index2[j0208Index1[byte1 - 0x80] >> 4].charAt(n); 119 } 120 } encoderJ0208 is no longer needed. (5) sun.nio.cs.ext.PCK.java JIS_X_0208_Solaris_Encoder jis0208 is no longer needed -sherman Andrew John Hughes wrote: > On 7 June 2010 19:06, Xueming Shen wrote: > >> Andrew, I'm going through the webrev now. Need a little more time. >> >> -sherman >> >> Andrew John Hughes wrote: >> >>> On 2 June 2010 18:57, Andrew John Hughes wrote: >>> >>> >>>> When building with JAVAC_MAX_WARNINGS=true, the build fails in >>>> sun/nio/cs due to the use of -Werror. >>>> >>>> The following webrev: >>>> >>>> http://cr.openjdk.java.net/~andrew/warnings/webrev.03/ >>>> >>>> fixes the remaining warnings exposed by JAVAC_MAX_WARNINGS by: >>>> >>>> * Removing redundant casts >>>> * Adding generic types to a number of List, Map and Class instances >>>> * Turning off deprecation warnings locally in make/sun/nio/cs/Makefile >>>> >>>> Ok to push? If so, can I have a bug ID for this? >>>> >>>> Thanks, >>>> -- >>>> Andrew :-) >>>> >>>> Free Java Software Engineer >>>> Red Hat, Inc. (http://www.redhat.com) >>>> >>>> Support Free Java! >>>> Contribute to GNU Classpath and the OpenJDK >>>> http://www.gnu.org/software/classpath >>>> http://openjdk.java.net >>>> >>>> PGP Key: 94EFD9D8 (http://subkeys.pgp.net) >>>> Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 >>>> >>>> >>>> >>> Ping! Any feedback on this? >>> >>> >> > > Ok, no rush; I didn't know if anyone had even seen the e-mail as there > was no response. > From David.Holmes at oracle.com Tue Jun 8 02:46:51 2010 From: David.Holmes at oracle.com (David Holmes) Date: Tue, 08 Jun 2010 12:46:51 +1000 Subject: Removing a layer of synchronization on Math.random In-Reply-To: References: <4C0A586F.3030509@sun.com> <4C0B717C.5070208@univ-mlv.fr> Message-ID: <4C0DAF1B.3050007@oracle.com> Martin, CR 6959259 filed. > Then I noticed that StrictMath.random duplicates > the code from Math.random, so I updated > StrictMath.random as well. It would be more > maintainable to have StrictMath.random > simply call Math.random; I can do that, > but other StrictMath methods do no such delegation. I think that violates the current spec for each class as the RNG can not be shared. David Martin Buchholz said the following on 06/08/10 05:58: > On Sun, Jun 6, 2010 at 02:59, R?mi Forax wrote: > >> I think initRG can be written like that: >> >> private static synchronized Random initRNG() { >> Random randomNumberGenerator = this.randomNumberGenerator; >> return (randomNumberGenerator == null)? this.randomNumberGenerator = new >> Random() : randomNumberGenerator; >> } > > Alright, I incorporated this small improvement. > > Then I noticed that StrictMath.random duplicates > the code from Math.random, so I updated > StrictMath.random as well. It would be more > maintainable to have StrictMath.random > simply call Math.random; I can do that, > but other StrictMath methods do no such delegation. > > Then I made a small improvement to another > static Random field in Collections.java. > I didn't use double-checked-locking, as with > Math.random, but at least I removed the > theoretical never-observed weakness of > the second read of "r" being null. > > I regenerated the webrev. > > I still need a bugid. > > Martin > >> R?mi From martinrb at google.com Tue Jun 8 06:51:33 2010 From: martinrb at google.com (Martin Buchholz) Date: Mon, 7 Jun 2010 23:51:33 -0700 Subject: Removing a layer of synchronization on Math.random In-Reply-To: <4C0DAF1B.3050007@oracle.com> References: <4C0A586F.3030509@sun.com> <4C0B717C.5070208@univ-mlv.fr> <4C0DAF1B.3050007@oracle.com> Message-ID: On Mon, Jun 7, 2010 at 19:46, David Holmes wrote: > Martin, > > CR 6959259 filed. Thanks. >> Then I noticed that StrictMath.random duplicates >> the code from Math.random, so I updated >> StrictMath.random as well. ?It would be more >> maintainable to have StrictMath.random >> simply call Math.random; I can do that, >> but other StrictMath methods do no such delegation. > > I think that violates the current spec for each class as the RNG can not be > shared. Agreed. Martin From chris.hegarty at oracle.com Tue Jun 8 09:47:01 2010 From: chris.hegarty at oracle.com (chris.hegarty at oracle.com) Date: Tue, 08 Jun 2010 09:47:01 +0000 Subject: hg: jdk7/tl/jdk: 6957375: java/net/ResponseCache getResponseCode and ResponseCacheTest fail after rebranding Message-ID: <20100608094730.416AA47040@hg.openjdk.java.net> Changeset: 489c1720757b Author: chegar Date: 2010-06-08 10:46 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/489c1720757b 6957375: java/net/ResponseCache getResponseCode and ResponseCacheTest fail after rebranding Reviewed-by: ohair, wetmore, alanb ! test/java/net/ResponseCache/file1.cache From dmytro_sheyko at hotmail.com Tue Jun 8 12:41:42 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Tue, 8 Jun 2010 19:41:42 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort Message-ID: Hi, Coming back to NaN processing. It appeared that current code unnecessarily stirs up NaNs in the end of array even when they are just on their places. So I propose to replace these code /* * Phase 1: Move NaNs to the end of the array. */ for (int k = left; k <= right; k++) { float ak = a[k]; if (ak != ak) { // a[k] is NaN a[k--] = a[right]; a[right--] = ak; } } with following /* * Phase 1: Move NaNs to the end of the array. */ while (left <= right && Float.isNaN(a[right])) { right--; } for (int k = right - 1; k >= left; k--) { float ak = a[k]; if (Float.isNaN(ak)) { a[k] = a[right]; a[right] = ak; right--; } } Also I would like to note that while we are processing negative zeros, condition (k != p) is unnecessary. for (int k = left + 1, p = left; k <= right; k++) { float ak = a[k]; if (ak != 0.0f) { return; } if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f if (k != p) { // !!! always true a[k] = +0.0f; a[p] = -0.0f; } p++; } } Here k is strictly greater than p initially and then grows faster than p. > From: iaroslavski at mail.ru > To: dmytro_sheyko at hotmail.com > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > Subject: Re[4]: New portion of improvements for Dual-Pivot Quicksort > Date: Sat, 5 Jun 2010 23:40:31 +0400 > > I tried with separate method sortPivotCandidates(...), no changes in behaviour, > but at the same time I don't see that the method makes sources much cleaner, > inline comments are enough. I attach the latest version of DPQ. > > Fri, 4 Jun 2010 14:21:58 +0700 ?????? ?? Dmytro Sheyko : > > > Seems good, > > > > One note. Since we gave up to sort pivot candidates in local variables, maybe we can move this out to separate procedure (in order to make sources cleaner a bit), e.g. > > > > private static void sortPivotCandidates(double[] a, int ae1, int ae2, int ae3, int ae4, int ae5) > > > > Hope the compiler is able to inline it without extra cost. > > > > Thanks, > > Dmytro Sheyko > > > > > From: iaroslavski at mail.ru > > > To: dmytro_sheyko at hotmail.com > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > Subject: Re[2]: New portion of improvements for Dual-Pivot Quicksort > > > Date: Fri, 4 Jun 2010 01:17:57 +0400 > > > > > > Hello, > > > > > > I tried your case (which is selection sort) and it works as expected: not worse > > > than "network" or "bubble" sorting. But nevertheless, the best choice is to use > > > insertion sort, I wrote more elegant implementation, see: > > > > > > ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = a[e4]; > > > > > > // Sort these elements using insertion sort > > > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > > > > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > } > > > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > } > > > } > > > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > > > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > } > > > } > > > } > > > > > > ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] = ae4; > > > > > > Note that this implementation doesn't use local variables ae1, .. , ae5 > > > at all, and without variables it works faster. This code is not too long, > > > extra 4 lines only. And if on client VM it works as other "network" > > > implementations, but on server VM it wins 1.2%. > > > > > > In compare with first implementation of Dual-Pivot Quicksort, which > > > is used now in JDK 7, suggested version wins ~15% and 6% for client > > > and server modes. > > > > > > Updated version of the class I will send tomorrow. > > > > > > Dmytro, > > > could you please look at suggested insertion sort for 5 elements? > > > > > > Do you have any comments/improvements? One place to be improved > > > is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where > > > element is compared with all sorted elements, whereas we can save > > > comparisons by binary fork. But implementation becomes too complex > > > and long. > > > > > > As it can be expected, the best sorting for small arrays is insertion, > > > then selection and then only bubble sort, even for 5 elements. > > > > > > Best regards, > > > Vladimir _________________________________________________________________ Hotmail: Powerful Free email with security by Microsoft. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: DualPivotQuicksort.java.diff Type: application/octet-stream Size: 2164 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: DualPivotQuicksort.java Type: text/x-java Size: 111391 bytes Desc: not available URL: From iaroslavski at mail.ru Tue Jun 8 14:09:42 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Tue, 08 Jun 2010 18:09:42 +0400 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: Message-ID: <4C0E4F26.5050204@mail.ru> Hello, Good catch! I agree with k!=p condition, but have doubt about using Float.isNaN(ak) instead of ak != ak in for loop. Float.isNaN does exactly the same comparison and at the same time it is called for all elements of the array. I checked now and see that it is better to eliminate while loop, and the best case is: for (int k = right; k >= left; k--) { float ak = a[k]; if (ak != ak) { // a[k] is NaN a[k] = a[right]; a[right--] = ak; } } If we have a lot of NaNs, it will be proceeded on linear time and only small amount of elements will be sorted. If there are no NaNs [at the end] - more probably use case - this code works faster. I run simple test and it shows that case without while loop is little bit faster, ~0.5%. Please, see attached version. Thank you, Vladimir Dmytro Sheyko wrote: > Hi, > > Coming back to NaN processing. > It appeared that current code unnecessarily stirs up NaNs in the end of > array even when they are just on their places. > So I propose to replace these code > /* > * Phase 1: Move NaNs to the end of the array. > */ > for (int k = left; k <= right; k++) { > float ak = a[k]; > if (ak != ak) { // a[k] is NaN > a[k--] = a[right]; > a[right--] = ak; > } > } > with following > /* > * Phase 1: Move NaNs to the end of the array. > */ > while (left <= right && Float.isNaN(a[right])) { > right--; > } > for (int k = right - 1; k >= left; k--) { > float ak = a[k]; > if (Float.isNaN(ak)) { > a[k] = a[right]; > a[right] = ak; > right--; > } > } > > Also I would like to note that while we are processing negative zeros, > condition (k != p) is unnecessary. > > for (int k = left + 1, p = left; k <= right; k++) { > float ak = a[k]; > if (ak != 0.0f) { > return; > } > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > if (k != p) { // !!! always true > a[k] = +0.0f; > a[p] = -0.0f; > } > p++; > } > } > > Here k is strictly greater than p initially and then grows faster than p. > > > > From: iaroslavski at mail.ru > > To: dmytro_sheyko at hotmail.com > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > Subject: Re[4]: New portion of improvements for Dual-Pivot Quicksort > > Date: Sat, 5 Jun 2010 23:40:31 +0400 > > > > I tried with separate method sortPivotCandidates(...), no changes in > behaviour, > > but at the same time I don't see that the method makes sources much > cleaner, > > inline comments are enough. I attach the latest version of DPQ. > > > > Fri, 4 Jun 2010 14:21:58 +0700 ?????? ?? Dmytro Sheyko > : > > > > > Seems good, > > > > > > One note. Since we gave up to sort pivot candidates in local > variables, maybe we can move this out to separate procedure (in order to > make sources cleaner a bit), e.g. > > > > > > private static void sortPivotCandidates(double[] a, int ae1, int > ae2, int ae3, int ae4, int ae5) > > > > > > Hope the compiler is able to inline it without extra cost. > > > > > > Thanks, > > > Dmytro Sheyko > > > > > > > From: iaroslavski at mail.ru > > > > To: dmytro_sheyko at hotmail.com > > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > Subject: Re[2]: New portion of improvements for Dual-Pivot Quicksort > > > > Date: Fri, 4 Jun 2010 01:17:57 +0400 > > > > > > > > Hello, > > > > > > > > I tried your case (which is selection sort) and it works as > expected: not worse > > > > than "network" or "bubble" sorting. But nevertheless, the best > choice is to use > > > > insertion sort, I wrote more elegant implementation, see: > > > > > > > > ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = > a[e4]; > > > > > > > > // Sort these elements using insertion sort > > > > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > > > > > > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > } > > > > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > } > > > > } > > > > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > > > > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > } > > > > } > > > > } > > > > > > > > ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] = ae4; > > > > > > > > Note that this implementation doesn't use local variables ae1, .. > , ae5 > > > > at all, and without variables it works faster. This code is not > too long, > > > > extra 4 lines only. And if on client VM it works as other "network" > > > > implementations, but on server VM it wins 1.2%. > > > > > > > > In compare with first implementation of Dual-Pivot Quicksort, which > > > > is used now in JDK 7, suggested version wins ~15% and 6% for client > > > > and server modes. > > > > > > > > Updated version of the class I will send tomorrow. > > > > > > > > Dmytro, > > > > could you please look at suggested insertion sort for 5 elements? > > > > > > > > Do you have any comments/improvements? One place to be improved > > > > is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where > > > > element is compared with all sorted elements, whereas we can save > > > > comparisons by binary fork. But implementation becomes too complex > > > > and long. > > > > > > > > As it can be expected, the best sorting for small arrays is > insertion, > > > > then selection and then only bubble sort, even for 5 elements. > > > > > > > > Best regards, > > > > Vladimir -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: DualPivotQuicksort.java URL: From joe.darcy at oracle.com Tue Jun 8 15:31:02 2010 From: joe.darcy at oracle.com (Joe Darcy) Date: Tue, 08 Jun 2010 08:31:02 -0700 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" In-Reply-To: <4C08AF9B.4010605@univ-mlv.fr> References: <4C08A40A.7030105@oracle.com> <4C08AF9B.4010605@univ-mlv.fr> Message-ID: <4C0E6236.8010509@oracle.com> Thanks Martin and R?mi for the quick reviews! Upon further consideration, before doing the push I decided to look for instances in the jdk repo where this new constructor could be used and I found one in java.security.Security: --- old/src/share/classes/java/security/Security.java 2010-06-08 01:07:48.000000000 -0700 +++ new/src/share/classes/java/security/Security.java 2010-06-08 01:07:48.000000000 -0700 @@ -678,7 +678,7 @@ spiMap.put(type, clazz); return clazz; } catch (ClassNotFoundException e) { - throw (Error)new AssertionError("Spi class not found").initCause(e); + throw new AssertionError("Spi class not found", e); } } Security team, please review this change to java.security.Security; the new code should be operationally equivalent. All the public security regression tests pass on a build with this change. Updated full webrev at: http://cr.openjdk.java.net/~darcy/6935997.1/ Thanks, -Joe R?mi Forax wrote: > Le 04/06/2010 09:13, Martin Buchholz a ?crit : >> Looks good! >> >> Martin >> > > Ok for me too. > > R?mi > >> On Thu, Jun 3, 2010 at 23:58, Joe Darcy wrote: >> >>> Hello. >>> >>> Please review my fix for >>> >>> 6935997 "Please add a nested throwable constructor to AssertionError" >>> http://cr.openjdk.java.net/~darcy/6935997.0/ >>> >>> Thanks, >>> >>> -Joe >>> >>> > From ahughes at redhat.com Tue Jun 8 21:47:13 2010 From: ahughes at redhat.com (Andrew John Hughes) Date: Tue, 8 Jun 2010 22:47:13 +0100 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: <4C0D6D04.5090701@oracle.com> References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> Message-ID: On 7 June 2010 23:04, Xueming Shen wrote: > Hi Andrew, > > 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in > sun/nio/cs due to the use of -Werror > > (1)sun/io/ByteTocharISO2022JP.java > ? #129, ?#151 > > ? if ((byte1 & (byte)0x80) != 0){ > > ? ? ? if ((byte2 & (byte)0x80) != 0){ > > > (byte) casting is not necessary as well? > It's necessary. 0x80 is an integer literal (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) which requires a lossy narrowing conversion to byte (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) > (2)sun/io/ByteToCharJISAutoDetect.java > > ?we should (if I did not miss anything) simply change the > ?sun/nio/cs/ext/JISAutoDetect.getByteMask1|2 to static, then no longer need > to > ?have an instance in ByteToCharJISAutoDetect. > Well spotted! Changed. > (3)sun/nio/cs/ext/EUC_JP_LINUX.java > > ? ?encoderJ0208 no longer needed? > ?decodeMappingJ0208.start = 0xa1; > ?decodeMappingJ0208.end = 0xfe; > > ? ? seems like we should simply replace decodeMappingJ0208.start/end with > start/end > ? ? and the decodeMappingJ0208 is no longer necessary as well. > Likewise. > (4) > > ?again, it might be better to do something as below. The EUC_JP_xyz are > something need to > ?be re-written/-re-organized when we have time. > > ?short[] j0208Index1 = JIS_X_0208_Solaris_Decoder.getIndex1(); > ?String[]j0208Index2 = JIS_X_0208_Solaris_Decoder.getIndex2(); > > ? int start = 0xa1; > ? int end = -0xfe; > > 100 ? ? protected char decodeDouble(int byte1, int byte2) { > 101 ? ? ? ? ? ? if (byte1 == 0x8e) { > 102 ? ? ? ? ? ? ? ? return decoderJ0201.decode(byte2 - 256); > 103 ? ? ? ? ? ? } > 104 105 ? ? ? ? ? ? if (((byte1 < 0) > 106 ? ? ? ? ? ? ? ? || (byte1 > j0208Index1.length)) > 107 ? ? ? ? ? ? ? ? || ((byte2 < start) > 108 ? ? ? ? ? ? ? ? || (byte2 > end))) > 109 ? ? ? ? ? ? ? ? return REPLACE_CHAR; > 110 111 ? ? ? ? ? ? char result = super.decodeDouble(byte1, byte2); > 112 ? ? ? ? ? ? if (result != '\uFFFD') { > 113 ? ? ? ? ? ? ? ? return result; > 114 ? ? ? ? ? ? } else { > 115 ? ? ? ? ? ? ? ? int n = (j0208Index1[byte1 - 0x80] & 0xf) * > 116 ? ? ? ? ? ? ? ? ? ? ? ? (end - start + 1) > 117 ? ? ? ? ? ? ? ? ? ? ? ? + (byte2 - start); > 118 ? ? ? ? ? ? ? ? return j0208Index2[j0208Index1[byte1 - 0x80] >> > 4].charAt(n); > 119 ? ? ? ? ? ? } > 120 ? ? ? ? } > > ? encoderJ0208 is no longer needed. > Fixed. > (5) sun.nio.cs.ext.PCK.java > > ? JIS_X_0208_Solaris_Encoder jis0208 is no longer needed > Fixed. New webrev: http://cr.openjdk.java.net/~andrew/warnings/webrev.04/ Thanks for such a detailed review. I just fixed the issues that came up from javac and didn't review the resulting classes in detail. This should make them a little cleaner. > -sherman > > > Andrew John Hughes wrote: >> >> On 7 June 2010 19:06, Xueming Shen wrote: >> >>> >>> Andrew, I'm going through the webrev now. ?Need a little more time. >>> >>> -sherman >>> >>> Andrew John Hughes wrote: >>> >>>> >>>> On 2 June 2010 18:57, Andrew John Hughes wrote: >>>> >>>> >>>>> >>>>> When building with JAVAC_MAX_WARNINGS=true, the build fails in >>>>> sun/nio/cs due to the use of -Werror. >>>>> >>>>> The following webrev: >>>>> >>>>> http://cr.openjdk.java.net/~andrew/warnings/webrev.03/ >>>>> >>>>> fixes the remaining warnings exposed by JAVAC_MAX_WARNINGS by: >>>>> >>>>> * Removing redundant casts >>>>> * Adding generic types to a number of List, Map and Class instances >>>>> * Turning off deprecation warnings locally in make/sun/nio/cs/Makefile >>>>> >>>>> Ok to push? If so, can I have a bug ID for this? >>>>> >>>>> Thanks, >>>>> -- >>>>> Andrew :-) >>>>> >>>>> Free Java Software Engineer >>>>> Red Hat, Inc. (http://www.redhat.com) >>>>> >>>>> Support Free Java! >>>>> Contribute to GNU Classpath and the OpenJDK >>>>> http://www.gnu.org/software/classpath >>>>> http://openjdk.java.net >>>>> >>>>> PGP Key: 94EFD9D8 (http://subkeys.pgp.net) >>>>> Fingerprint: F8EF F1EA 401E 2E60 15FA ?7927 142C 2591 94EF D9D8 >>>>> >>>>> >>>>> >>>> >>>> Ping! Any feedback on this? >>>> >>>> >>> >>> >> >> Ok, no rush; I didn't know if anyone had even seen the e-mail as there >> was no response. >> > > -- Andrew :-) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 From bradford.wetmore at oracle.com Tue Jun 8 21:59:39 2010 From: bradford.wetmore at oracle.com (Brad Wetmore) Date: Tue, 08 Jun 2010 14:59:39 -0700 Subject: Code review request for 6935997 "Please add a nested throwable constructor to AssertionError" In-Reply-To: <4C0E6236.8010509@oracle.com> References: <4C08A40A.7030105@oracle.com> <4C08AF9B.4010605@univ-mlv.fr> <4C0E6236.8010509@oracle.com> Message-ID: <4C0EBD4B.4080706@oracle.com> As we discussed here, this looks fine. Brad On 6/8/2010 8:31 AM, Joe Darcy wrote: > Thanks Martin and R?mi for the quick reviews! > > Upon further consideration, before doing the push I decided to look for > instances in the jdk repo where this new constructor could be used and I > found one in java.security.Security: > > --- old/src/share/classes/java/security/Security.java 2010-06-08 > 01:07:48.000000000 -0700 > +++ new/src/share/classes/java/security/Security.java 2010-06-08 > 01:07:48.000000000 -0700 > @@ -678,7 +678,7 @@ > spiMap.put(type, clazz); > return clazz; > } catch (ClassNotFoundException e) { > - throw (Error)new AssertionError("Spi class not found").initCause(e); > + throw new AssertionError("Spi class not found", e); > } > } > > Security team, please review this change to java.security.Security; the > new code should be operationally equivalent. All the public security > regression tests pass on a build with this change. > > Updated full webrev at: > http://cr.openjdk.java.net/~darcy/6935997.1/ > > Thanks, > > -Joe > > R?mi Forax wrote: >> Le 04/06/2010 09:13, Martin Buchholz a ?crit : >>> Looks good! >>> >>> Martin >> >> Ok for me too. >> >> R?mi >> >>> On Thu, Jun 3, 2010 at 23:58, Joe Darcy wrote: >>>> Hello. >>>> >>>> Please review my fix for >>>> >>>> 6935997 "Please add a nested throwable constructor to AssertionError" >>>> http://cr.openjdk.java.net/~darcy/6935997.0/ >>>> >>>> Thanks, >>>> >>>> -Joe >>>> >> > From schlosna at gmail.com Tue Jun 8 22:18:00 2010 From: schlosna at gmail.com (David Schlosnagle) Date: Tue, 8 Jun 2010 18:18:00 -0400 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> Message-ID: On Tue, Jun 8, 2010 at 5:47 PM, Andrew John Hughes wrote: > New webrev: > > http://cr.openjdk.java.net/~andrew/warnings/webrev.04/ > Andrew, In src/share/classes/sun/nio/cs/ext/HKSCS.java, the following change seems odd setting a static field in the HKSCS.Decoder constructor. Is this correct functionality or is big5Dec intended to be an instance field? private static DoubleByte.Decoder big5Dec; protected Decoder(Charset cs, DoubleByte.Decoder big5Dec, char[][] b2cBmp, char[][] b2cSupp) { // super(cs, 0.5f, 1.0f); // need to extends DoubleByte.Decoder so the // sun.io can use it. this implementation super(cs, 0.5f, 1.0f, null, null, 0, 0); - this.big5Dec = big5Dec; + Decoder.big5Dec = big5Dec; this.b2cBmp = b2cBmp; this.b2cSupp = b2cSupp; } Thanks, Dave From martinrb at google.com Tue Jun 8 23:12:11 2010 From: martinrb at google.com (Martin Buchholz) Date: Tue, 8 Jun 2010 16:12:11 -0700 Subject: Must call RegisterNatives after getMethodID, else get UnsatisfiedLinkError Message-ID: Hi ClassLoader maintainers, This is a bug report. (I think this is a hotspot bug, but it might be a core library ClassLoader bug or even a URLClassLoader bug) If you use RegisterNatives with a class loaded using URLClassLoader, you must call GetMethodID before RegisterNatives, or you get an UnsatisfiedLinkError as in the test case below (you will need to edit the below to fill in the location of your jni include directory and your libjvm.so) $ cat Test.java; echo ---------------------; cat jvm.cc; echo --------------------------; g++ -I$JDK/include -I$JDK/include/linux -ldl jvm.cc && ./a.out public class Test { public Test() { System.out.println("My class loader is " + getClass().getClassLoader()); testNative(); System.out.println("back to Java"); } public static native void testNative(); } --------------------- #include #include #include JavaVM* jvm; JNIEnv* env; const char* libjvm = "$JDKDIR/libjvm.so"; const char* loader_url = "file://./"; const char* class_name = "Test"; void InitializeJVM() { JavaVMOption options[1]; options[0].optionString = (char*)"-Djava.class.path=."; //options[1].optionString = (char*)"-verbose:jni"; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_2; vm_args.options = options; vm_args.nOptions = 2; vm_args.ignoreUnrecognized = JNI_TRUE; void* handle = dlopen(libjvm, RTLD_LAZY); if (handle == NULL) perror("dlopen"); jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = reinterpret_cast (dlsym(handle, "JNI_CreateJavaVM")); if (func_create_java_vm == NULL) perror("dlsym"); jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); } void TestNative(JNIEnv* env, jclass cls) { printf("Successfully called registered native method\n"); } void RegisterNativeMethod(jclass cls) { static const JNINativeMethod jni_method = { (char*)"testNative", (char*)"()V", (void*)&TestNative }; env->RegisterNatives(cls, &jni_method, 1); if (env->ExceptionCheck()) env->ExceptionDescribe(); } void Test() { // URL[] urls = {new URL(url)} jclass cls = env->FindClass("java/net/URL"); jmethodID method = env->GetMethodID(cls, "", "(Ljava/lang/String;)V"); jstring jurl_str = env->NewStringUTF(loader_url); jobject jurl = env->NewObject(cls, method, jurl_str); jobjectArray jurls = env->NewObjectArray(1, cls, jurl); // URLClassLoader loader = new URLClassLoaer(urls) cls = env->FindClass("java/net/URLClassLoader"); method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); jobject jloader = env->NewObject(cls, method, jurls); // Class cls = loader.loadClass(name) method = env->GetMethodID( cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); jstring jname = env->NewStringUTF(class_name); cls = (jclass)env->CallObjectMethod(jloader, method, jname, (jboolean) true); method = env->GetMethodID(cls, "", "()V"); if (env->ExceptionCheck()) env->ExceptionDescribe(); // RegisterNatives must be called after GetMethodID. // If the order is reversed, we get UnsatisfiedLinkError, // which seems like a bug. RegisterNativeMethod(cls); env->NewObject(cls, method); if (env->ExceptionCheck()) env->ExceptionDescribe(); } int main(int argc, char** argv) { InitializeJVM(); Test(); return 0; } -------------------------- My class loader is sun.misc.Launcher$AppClassLoader at 1f7182c1 Successfully called registered native method back to Java Thanks, Martin From David.Holmes at oracle.com Wed Jun 9 01:18:41 2010 From: David.Holmes at oracle.com (David Holmes) Date: Wed, 09 Jun 2010 11:18:41 +1000 Subject: Must call RegisterNatives after getMethodID, else get UnsatisfiedLinkError In-Reply-To: References: Message-ID: <4C0EEBF1.2010302@oracle.com> Hi Martin, Not sure it's a classloader issue or a JNI issue ... My initial thoughts are that RegisterNatives is not dealing with an uninitialized class - the GetMethodID forces initialization. But I don't, at a causal look, see why that should be. Can you add -XX:+PrintJNIResolving and see what it reports, if anything? David Martin Buchholz said the following on 06/09/10 09:12: > Hi ClassLoader maintainers, > > This is a bug report. > > (I think this is a hotspot bug, but it might be a core library > ClassLoader bug or even a URLClassLoader bug) > > If you use RegisterNatives with a class loaded using URLClassLoader, > you must call GetMethodID > before RegisterNatives, or you get an UnsatisfiedLinkError as in the > test case below > > (you will need to edit the below to fill in the location of your jni > include directory and your libjvm.so) > > $ cat Test.java; echo ---------------------; cat jvm.cc; echo > --------------------------; g++ -I$JDK/include -I$JDK/include/linux > -ldl jvm.cc && ./a.out > public class Test { > public Test() { > System.out.println("My class loader is " + getClass().getClassLoader()); > testNative(); > System.out.println("back to Java"); > } > public static native void testNative(); > } > --------------------- > #include > #include > #include > > JavaVM* jvm; > JNIEnv* env; > const char* libjvm = > "$JDKDIR/libjvm.so"; > const char* loader_url = "file://./"; > const char* class_name = "Test"; > > void InitializeJVM() { > JavaVMOption options[1]; > options[0].optionString = (char*)"-Djava.class.path=."; > //options[1].optionString = (char*)"-verbose:jni"; > > JavaVMInitArgs vm_args; > vm_args.version = JNI_VERSION_1_2; > vm_args.options = options; > vm_args.nOptions = 2; > vm_args.ignoreUnrecognized = JNI_TRUE; > > void* handle = dlopen(libjvm, RTLD_LAZY); > if (handle == NULL) perror("dlopen"); > jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = > reinterpret_cast > (dlsym(handle, "JNI_CreateJavaVM")); > if (func_create_java_vm == NULL) perror("dlsym"); > jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); > } > > void TestNative(JNIEnv* env, jclass cls) { > printf("Successfully called registered native method\n"); > } > > void RegisterNativeMethod(jclass cls) { > static const JNINativeMethod jni_method = > { (char*)"testNative", > (char*)"()V", > (void*)&TestNative }; > env->RegisterNatives(cls, &jni_method, 1); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > } > > void Test() { > // URL[] urls = {new URL(url)} > jclass cls = env->FindClass("java/net/URL"); > jmethodID method = env->GetMethodID(cls, "", "(Ljava/lang/String;)V"); > jstring jurl_str = env->NewStringUTF(loader_url); > jobject jurl = env->NewObject(cls, method, jurl_str); > jobjectArray jurls = env->NewObjectArray(1, cls, jurl); > > // URLClassLoader loader = new URLClassLoaer(urls) > cls = env->FindClass("java/net/URLClassLoader"); > method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); > jobject jloader = env->NewObject(cls, method, jurls); > > // Class cls = loader.loadClass(name) > method = env->GetMethodID( > cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); > jstring jname = env->NewStringUTF(class_name); > cls = (jclass)env->CallObjectMethod(jloader, method, jname, (jboolean) true); > > method = env->GetMethodID(cls, "", "()V"); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > > // RegisterNatives must be called after GetMethodID. > // If the order is reversed, we get UnsatisfiedLinkError, > // which seems like a bug. > RegisterNativeMethod(cls); > > env->NewObject(cls, method); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > } > > int main(int argc, char** argv) { > InitializeJVM(); > Test(); > > return 0; > } > -------------------------- > My class loader is sun.misc.Launcher$AppClassLoader at 1f7182c1 > Successfully called registered native method > back to Java > > Thanks, > > Martin From joe.darcy at oracle.com Wed Jun 9 01:48:42 2010 From: joe.darcy at oracle.com (joe.darcy at oracle.com) Date: Wed, 09 Jun 2010 01:48:42 +0000 Subject: hg: jdk7/tl/jdk: 6935997: Please add a nested throwable constructor to AssertionError Message-ID: <20100609014903.F2C3C47074@hg.openjdk.java.net> Changeset: a21e3a29ca9d Author: darcy Date: 2010-06-08 18:52 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/a21e3a29ca9d 6935997: Please add a nested throwable constructor to AssertionError Reviewed-by: martin, forax, wetmore ! src/share/classes/java/lang/AssertionError.java ! src/share/classes/java/security/Security.java From fweimer at bfk.de Wed Jun 9 06:55:35 2010 From: fweimer at bfk.de (Florian Weimer) Date: Wed, 09 Jun 2010 06:55:35 +0000 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: (Andrew John Hughes's message of "Tue\, 8 Jun 2010 22\:47\:13 +0100") References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> Message-ID: <82ocfkn194.fsf@mid.bfk.de> * Andrew John Hughes: > On 7 June 2010 23:04, Xueming Shen wrote: >> Hi Andrew, >> >> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in >> sun/nio/cs due to the use of -Werror >> >> (1)sun/io/ByteTocharISO2022JP.java >> ? #129, ?#151 >> >> ? if ((byte1 & (byte)0x80) != 0){ >> >> ? ? ? if ((byte2 & (byte)0x80) != 0){ >> >> >> (byte) casting is not necessary as well? >> > > It's necessary. 0x80 is an integer literal > (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) > which requires a lossy narrowing conversion to byte > (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) Doesn't the & operator promote its arguments to int anyway? I don't think the cast to byte makes a difference here because it does not matter if 0x80 is sign-extended or zero-extended. It might be more efficient to use "byte1 < 0" and "byte2 < 0" instead. -- Florian Weimer BFK edv-consulting GmbH http://www.bfk.de/ Kriegsstra?e 100 tel: +49-721-96201-1 D-76133 Karlsruhe fax: +49-721-96201-99 From dmytro_sheyko at hotmail.com Wed Jun 9 09:08:17 2010 From: dmytro_sheyko at hotmail.com (Dmytro Sheyko) Date: Wed, 9 Jun 2010 16:08:17 +0700 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4C0E4F26.5050204@mail.ru> References: , <4C0E4F26.5050204@mail.ru> Message-ID: Hi, >From performance point of view, it does not matter whether we use Float.isNaN(ak) or (ak != ak). Hotspot generates the same native code. As for not skipping trailing nans, can you explain why it could be faster? Thank you, Dmytro Sheyko > Date: Tue, 8 Jun 2010 18:09:42 +0400 > From: iaroslavski at mail.ru > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > To: dmytro_sheyko at hotmail.com > CC: core-libs-dev at openjdk.java.net > > Hello, > > Good catch! I agree with k!=p condition, but have doubt about using > Float.isNaN(ak) instead of ak != ak in for loop. Float.isNaN does exactly > the same comparison and at the same time it is called for all elements > of the array. > > I checked now and see that it is better to eliminate while loop, > and the best case is: > > for (int k = right; k >= left; k--) { > float ak = a[k]; > if (ak != ak) { // a[k] is NaN > a[k] = a[right]; > a[right--] = ak; > } > } > > If we have a lot of NaNs, it will be proceeded on linear time > and only small amount of elements will be sorted. If there are > no NaNs [at the end] - more probably use case - this code works > faster. I run simple test and it shows that case without while loop > is little bit faster, ~0.5%. > > Please, see attached version. > > Thank you, > Vladimir > > Dmytro Sheyko wrote: > > Hi, > > > > Coming back to NaN processing. > > It appeared that current code unnecessarily stirs up NaNs in the end of > > array even when they are just on their places. > > So I propose to replace these code > > /* > > * Phase 1: Move NaNs to the end of the array. > > */ > > for (int k = left; k <= right; k++) { > > float ak = a[k]; > > if (ak != ak) { // a[k] is NaN > > a[k--] = a[right]; > > a[right--] = ak; > > } > > } > > with following > > /* > > * Phase 1: Move NaNs to the end of the array. > > */ > > while (left <= right && Float.isNaN(a[right])) { > > right--; > > } > > for (int k = right - 1; k >= left; k--) { > > float ak = a[k]; > > if (Float.isNaN(ak)) { > > a[k] = a[right]; > > a[right] = ak; > > right--; > > } > > } > > > > Also I would like to note that while we are processing negative zeros, > > condition (k != p) is unnecessary. > > > > for (int k = left + 1, p = left; k <= right; k++) { > > float ak = a[k]; > > if (ak != 0.0f) { > > return; > > } > > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > if (k != p) { // !!! always true > > a[k] = +0.0f; > > a[p] = -0.0f; > > } > > p++; > > } > > } > > > > Here k is strictly greater than p initially and then grows faster than p. > > > > > > > From: iaroslavski at mail.ru > > > To: dmytro_sheyko at hotmail.com > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > Subject: Re[4]: New portion of improvements for Dual-Pivot Quicksort > > > Date: Sat, 5 Jun 2010 23:40:31 +0400 > > > > > > I tried with separate method sortPivotCandidates(...), no changes in > > behaviour, > > > but at the same time I don't see that the method makes sources much > > cleaner, > > > inline comments are enough. I attach the latest version of DPQ. > > > > > > Fri, 4 Jun 2010 14:21:58 +0700 ?????? ?? Dmytro Sheyko > > : > > > > > > > Seems good, > > > > > > > > One note. Since we gave up to sort pivot candidates in local > > variables, maybe we can move this out to separate procedure (in order to > > make sources cleaner a bit), e.g. > > > > > > > > private static void sortPivotCandidates(double[] a, int ae1, int > > ae2, int ae3, int ae4, int ae5) > > > > > > > > Hope the compiler is able to inline it without extra cost. > > > > > > > > Thanks, > > > > Dmytro Sheyko > > > > > > > > > From: iaroslavski at mail.ru > > > > > To: dmytro_sheyko at hotmail.com > > > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > > Subject: Re[2]: New portion of improvements for Dual-Pivot Quicksort > > > > > Date: Fri, 4 Jun 2010 01:17:57 +0400 > > > > > > > > > > Hello, > > > > > > > > > > I tried your case (which is selection sort) and it works as > > expected: not worse > > > > > than "network" or "bubble" sorting. But nevertheless, the best > > choice is to use > > > > > insertion sort, I wrote more elegant implementation, see: > > > > > > > > > > ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = > > a[e4]; > > > > > > > > > > // Sort these elements using insertion sort > > > > > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > > > > > > > > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > } > > > > > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > } > > > > > } > > > > > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > > > > > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > } > > > > > } > > > > > } > > > > > > > > > > ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] = ae4; > > > > > > > > > > Note that this implementation doesn't use local variables ae1, .. > > , ae5 > > > > > at all, and without variables it works faster. This code is not > > too long, > > > > > extra 4 lines only. And if on client VM it works as other "network" > > > > > implementations, but on server VM it wins 1.2%. > > > > > > > > > > In compare with first implementation of Dual-Pivot Quicksort, which > > > > > is used now in JDK 7, suggested version wins ~15% and 6% for client > > > > > and server modes. > > > > > > > > > > Updated version of the class I will send tomorrow. > > > > > > > > > > Dmytro, > > > > > could you please look at suggested insertion sort for 5 elements? > > > > > > > > > > Do you have any comments/improvements? One place to be improved > > > > > is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where > > > > > element is compared with all sorted elements, whereas we can save > > > > > comparisons by binary fork. But implementation becomes too complex > > > > > and long. > > > > > > > > > > As it can be expected, the best sorting for small arrays is > > insertion, > > > > > then selection and then only bubble sort, even for 5 elements. > > > > > > > > > > Best regards, > > > > > Vladimir _________________________________________________________________ Hotmail: Free, trusted and rich email service. https://signup.live.com/signup.aspx?id=60969 -------------- next part -------------- An HTML attachment was scrubbed... URL: From ahughes at redhat.com Wed Jun 9 09:11:17 2010 From: ahughes at redhat.com (Andrew John Hughes) Date: Wed, 9 Jun 2010 10:11:17 +0100 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: <82ocfkn194.fsf@mid.bfk.de> References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> <82ocfkn194.fsf@mid.bfk.de> Message-ID: On 9 June 2010 07:55, Florian Weimer wrote: > * Andrew John Hughes: > >> On 7 June 2010 23:04, Xueming Shen wrote: >>> Hi Andrew, >>> >>> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in >>> sun/nio/cs due to the use of -Werror >>> >>> (1)sun/io/ByteTocharISO2022JP.java >>> ? #129, ?#151 >>> >>> ? if ((byte1 & (byte)0x80) != 0){ >>> >>> ? ? ? if ((byte2 & (byte)0x80) != 0){ >>> >>> >>> (byte) casting is not necessary as well? >>> >> >> It's necessary. ?0x80 is an integer literal >> (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) >> which requires a lossy narrowing conversion to byte >> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) > > Doesn't the & operator promote its arguments to int anyway? ?I don't > think the cast to byte makes a difference here because it does not > matter if 0x80 is sign-extended or zero-extended. > > It might be more efficient to use "byte1 < 0" and "byte2 < 0" instead. > You're right. I think I mentally read that as an assignment, not an and operation. If I'm reading it right now, it would seem to just be testing the sign bit. byte1 < 0 would be clearer if not faster, and I'd be for changing that, though that probably should be a separate patch. Sherman, does the new webrev look ok to push? > -- > Florian Weimer ? ? ? ? ? ? ? ? > BFK edv-consulting GmbH ? ? ? http://www.bfk.de/ > Kriegsstra?e 100 ? ? ? ? ? ? ?tel: +49-721-96201-1 > D-76133 Karlsruhe ? ? ? ? ? ? fax: +49-721-96201-99 > Thanks, -- Andrew :-) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 From aph at redhat.com Wed Jun 9 09:50:21 2010 From: aph at redhat.com (Andrew Haley) Date: Wed, 09 Jun 2010 10:50:21 +0100 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> <82ocfkn194.fsf@mid.bfk.de> Message-ID: <4C0F63DD.9030509@redhat.com> On 09/06/10 10:11, Andrew John Hughes wrote: > On 9 June 2010 07:55, Florian Weimer wrote: >> * Andrew John Hughes: >> >>> On 7 June 2010 23:04, Xueming Shen wrote: >>>> Hi Andrew, >>>> >>>> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in >>>> sun/nio/cs due to the use of -Werror >>>> >>>> (1)sun/io/ByteTocharISO2022JP.java >>>> #129, #151 >>>> >>>> if ((byte1 & (byte)0x80) != 0){ >>>> >>>> if ((byte2 & (byte)0x80) != 0){ >>>> >>>> >>>> (byte) casting is not necessary as well? >>>> >>> >>> It's necessary. 0x80 is an integer literal >>> (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) >>> which requires a lossy narrowing conversion to byte >>> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) >> >> Doesn't the & operator promote its arguments to int anyway? I don't >> think the cast to byte makes a difference here because it does not >> matter if 0x80 is sign-extended or zero-extended. >> >> It might be more efficient to use "byte1 < 0" and "byte2 < 0" instead. This code may be in a critical performance-related place. It's quite possible that it's done this way because the JIT compiles it very well. So, best not to change it without knowing what the effect is. Andrew. From David.Holmes at oracle.com Wed Jun 9 10:25:06 2010 From: David.Holmes at oracle.com (David Holmes) Date: Wed, 09 Jun 2010 20:25:06 +1000 Subject: Must call RegisterNatives after getMethodID, else get UnsatisfiedLinkError In-Reply-To: References: Message-ID: <4C0F6C02.1070404@oracle.com> Hi Martin, Turns out this is a known (and old) issue (thanks Yuri!): CR 6493522 "JNI_RegisterNatives fails to bind a method of an uninitialized class" I'll add this email info to the CR. David Martin Buchholz said the following on 06/09/10 09:12: > Hi ClassLoader maintainers, > > This is a bug report. > > (I think this is a hotspot bug, but it might be a core library > ClassLoader bug or even a URLClassLoader bug) > > If you use RegisterNatives with a class loaded using URLClassLoader, > you must call GetMethodID > before RegisterNatives, or you get an UnsatisfiedLinkError as in the > test case below > > (you will need to edit the below to fill in the location of your jni > include directory and your libjvm.so) > > $ cat Test.java; echo ---------------------; cat jvm.cc; echo > --------------------------; g++ -I$JDK/include -I$JDK/include/linux > -ldl jvm.cc && ./a.out > public class Test { > public Test() { > System.out.println("My class loader is " + getClass().getClassLoader()); > testNative(); > System.out.println("back to Java"); > } > public static native void testNative(); > } > --------------------- > #include > #include > #include > > JavaVM* jvm; > JNIEnv* env; > const char* libjvm = > "$JDKDIR/libjvm.so"; > const char* loader_url = "file://./"; > const char* class_name = "Test"; > > void InitializeJVM() { > JavaVMOption options[1]; > options[0].optionString = (char*)"-Djava.class.path=."; > //options[1].optionString = (char*)"-verbose:jni"; > > JavaVMInitArgs vm_args; > vm_args.version = JNI_VERSION_1_2; > vm_args.options = options; > vm_args.nOptions = 2; > vm_args.ignoreUnrecognized = JNI_TRUE; > > void* handle = dlopen(libjvm, RTLD_LAZY); > if (handle == NULL) perror("dlopen"); > jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = > reinterpret_cast > (dlsym(handle, "JNI_CreateJavaVM")); > if (func_create_java_vm == NULL) perror("dlsym"); > jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); > } > > void TestNative(JNIEnv* env, jclass cls) { > printf("Successfully called registered native method\n"); > } > > void RegisterNativeMethod(jclass cls) { > static const JNINativeMethod jni_method = > { (char*)"testNative", > (char*)"()V", > (void*)&TestNative }; > env->RegisterNatives(cls, &jni_method, 1); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > } > > void Test() { > // URL[] urls = {new URL(url)} > jclass cls = env->FindClass("java/net/URL"); > jmethodID method = env->GetMethodID(cls, "", "(Ljava/lang/String;)V"); > jstring jurl_str = env->NewStringUTF(loader_url); > jobject jurl = env->NewObject(cls, method, jurl_str); > jobjectArray jurls = env->NewObjectArray(1, cls, jurl); > > // URLClassLoader loader = new URLClassLoaer(urls) > cls = env->FindClass("java/net/URLClassLoader"); > method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); > jobject jloader = env->NewObject(cls, method, jurls); > > // Class cls = loader.loadClass(name) > method = env->GetMethodID( > cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); > jstring jname = env->NewStringUTF(class_name); > cls = (jclass)env->CallObjectMethod(jloader, method, jname, (jboolean) true); > > method = env->GetMethodID(cls, "", "()V"); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > > // RegisterNatives must be called after GetMethodID. > // If the order is reversed, we get UnsatisfiedLinkError, > // which seems like a bug. > RegisterNativeMethod(cls); > > env->NewObject(cls, method); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > } > > int main(int argc, char** argv) { > InitializeJVM(); > Test(); > > return 0; > } > -------------------------- > My class loader is sun.misc.Launcher$AppClassLoader at 1f7182c1 > Successfully called registered native method > back to Java > > Thanks, > > Martin From iaroslavski at mail.ru Wed Jun 9 12:28:43 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Wed, 09 Jun 2010 16:28:43 +0400 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: <4C0E4F26.5050204@mail.ru> Message-ID: <4C0F88FB.4020705@mail.ru> Hi, I just compared two cases: if (ak != ak) { // a[k] is NaN a[k] = a[right]; a[right--] = ak; } and if (Float.isNaN(ak)) { a[k] = a[right]; a[right--] = ak; } The results are: random ak != ak: 18846 isNaN(ak): 18860 ascendant ak != ak: 3767 isNaN(ak): 3928 descendant ak != ak: 4185 isNaN(ak): 4264 I think we can leave ak != ak with comment that ak is NaN. I also checked that processing NaNs at the end is not worse, therefore, let we have this code: while (left <= right && Float.isNaN(a[right])) { right--; } for (int k = right - 1; k >= left; k--) { float ak = a[k]; if (ak != ak) { // a[k] is NaN a[k] = a[right]; a[right--] = ak; } } and the same for double, see updated version in attachment. Thanks, Vladimir Dmytro Sheyko wrote: > Hi, > > From performance point of view, it does not matter whether we use > Float.isNaN(ak) or (ak != ak). Hotspot generates the same native code. > > As for not skipping trailing nans, can you explain why it could be faster? > > Thank you, > Dmytro Sheyko > > > Date: Tue, 8 Jun 2010 18:09:42 +0400 > > From: iaroslavski at mail.ru > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > To: dmytro_sheyko at hotmail.com > > CC: core-libs-dev at openjdk.java.net > > > > Hello, > > > > Good catch! I agree with k!=p condition, but have doubt about using > > Float.isNaN(ak) instead of ak != ak in for loop. Float.isNaN does exactly > > the same comparison and at the same time it is called for all elements > > of the array. > > > > I checked now and see that it is better to eliminate while loop, > > and the best case is: > > > > for (int k = right; k >= left; k--) { > > float ak = a[k]; > > if (ak != ak) { // a[k] is NaN > > a[k] = a[right]; > > a[right--] = ak; > > } > > } > > > > If we have a lot of NaNs, it will be proceeded on linear time > > and only small amount of elements will be sorted. If there are > > no NaNs [at the end] - more probably use case - this code works > > faster. I run simple test and it shows that case without while loop > > is little bit faster, ~0.5%. > > > > Please, see attached version. > > > > Thank you, > > Vladimir > > > > Dmytro Sheyko wrote: > > > Hi, > > > > > > Coming back to NaN processing. > > > It appeared that current code unnecessarily stirs up NaNs in the > end of > > > array even when they are just on their places. > > > So I propose to replace these code > > > /* > > > * Phase 1: Move NaNs to the end of the array. > > > */ > > > for (int k = left; k <= right; k++) { > > > float ak = a[k]; > > > if (ak != ak) { // a[k] is NaN > > > a[k--] = a[right]; > > > a[right--] = ak; > > > } > > > } > > > with following > > > /* > > > * Phase 1: Move NaNs to the end of the array. > > > */ > > > while (left <= right && Float.isNaN(a[right])) { > > > right--; > > > } > > > for (int k = right - 1; k >= left; k--) { > > > float ak = a[k]; > > > if (Float.isNaN(ak)) { > > > a[k] = a[right]; > > > a[right] = ak; > > > right--; > > > } > > > } > > > > > > Also I would like to note that while we are processing negative zeros, > > > condition (k != p) is unnecessary. > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > float ak = a[k]; > > > if (ak != 0.0f) { > > > return; > > > } > > > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > > if (k != p) { // !!! always true > > > a[k] = +0.0f; > > > a[p] = -0.0f; > > > } > > > p++; > > > } > > > } > > > > > > Here k is strictly greater than p initially and then grows faster > than p. > > > > > > > > > > From: iaroslavski at mail.ru > > > > To: dmytro_sheyko at hotmail.com > > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > Subject: Re[4]: New portion of improvements for Dual-Pivot Quicksort > > > > Date: Sat, 5 Jun 2010 23:40:31 +0400 > > > > > > > > I tried with separate method sortPivotCandidates(...), no changes in > > > behaviour, > > > > but at the same time I don't see that the method makes sources much > > > cleaner, > > > > inline comments are enough. I attach the latest version of DPQ. > > > > > > > > Fri, 4 Jun 2010 14:21:58 +0700 ?????? ?? Dmytro Sheyko > > > : > > > > > > > > > Seems good, > > > > > > > > > > One note. Since we gave up to sort pivot candidates in local > > > variables, maybe we can move this out to separate procedure (in > order to > > > make sources cleaner a bit), e.g. > > > > > > > > > > private static void sortPivotCandidates(double[] a, int ae1, int > > > ae2, int ae3, int ae4, int ae5) > > > > > > > > > > Hope the compiler is able to inline it without extra cost. > > > > > > > > > > Thanks, > > > > > Dmytro Sheyko > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > > > Subject: Re[2]: New portion of improvements for Dual-Pivot > Quicksort > > > > > > Date: Fri, 4 Jun 2010 01:17:57 +0400 > > > > > > > > > > > > Hello, > > > > > > > > > > > > I tried your case (which is selection sort) and it works as > > > expected: not worse > > > > > > than "network" or "bubble" sorting. But nevertheless, the best > > > choice is to use > > > > > > insertion sort, I wrote more elegant implementation, see: > > > > > > > > > > > > ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = > > > a[e4]; > > > > > > > > > > > > // Sort these elements using insertion sort > > > > > > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > > > > > > > > > > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > > } > > > > > > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > > > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > > } > > > > > > } > > > > > > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > > > > > > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > > > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > > } > > > > > > } > > > > > > } > > > > > > > > > > > > ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] > = ae4; > > > > > > > > > > > > Note that this implementation doesn't use local variables > ae1, .. > > > , ae5 > > > > > > at all, and without variables it works faster. This code is not > > > too long, > > > > > > extra 4 lines only. And if on client VM it works as other > "network" > > > > > > implementations, but on server VM it wins 1.2%. > > > > > > > > > > > > In compare with first implementation of Dual-Pivot Quicksort, > which > > > > > > is used now in JDK 7, suggested version wins ~15% and 6% for > client > > > > > > and server modes. > > > > > > > > > > > > Updated version of the class I will send tomorrow. > > > > > > > > > > > > Dmytro, > > > > > > could you please look at suggested insertion sort for 5 elements? > > > > > > > > > > > > Do you have any comments/improvements? One place to be improved > > > > > > is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where > > > > > > element is compared with all sorted elements, whereas we can save > > > > > > comparisons by binary fork. But implementation becomes too > complex > > > > > > and long. > > > > > > > > > > > > As it can be expected, the best sorting for small arrays is > > > insertion, > > > > > > then selection and then only bubble sort, even for 5 elements. > > > > > > > > > > > > Best regards, > > > > > > Vladimir -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: DualPivotQuicksort.java URL: From xueming.shen at oracle.com Wed Jun 9 17:22:14 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Wed, 09 Jun 2010 10:22:14 -0700 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> <82ocfkn194.fsf@mid.bfk.de> Message-ID: <4C0FCDC6.9040508@oracle.com> Andrew John Hughes wrote: > On 9 June 2010 07:55, Florian Weimer wrote: > >> * Andrew John Hughes: >> >> >>> On 7 June 2010 23:04, Xueming Shen wrote: >>> >>>> Hi Andrew, >>>> >>>> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in >>>> sun/nio/cs due to the use of -Werror >>>> >>>> (1)sun/io/ByteTocharISO2022JP.java >>>> #129, #151 >>>> >>>> if ((byte1 & (byte)0x80) != 0){ >>>> >>>> if ((byte2 & (byte)0x80) != 0){ >>>> >>>> >>>> (byte) casting is not necessary as well? >>>> >>>> >>> It's necessary. 0x80 is an integer literal >>> (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) >>> which requires a lossy narrowing conversion to byte >>> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) >>> >> Doesn't the & operator promote its arguments to int anyway? I don't >> think the cast to byte makes a difference here because it does not >> matter if 0x80 is sign-extended or zero-extended. >> >> It might be more efficient to use "byte1 < 0" and "byte2 < 0" instead. >> >> > > You're right. I think I mentally read that as an assignment, not an > and operation. > > If I'm reading it right now, it would seem to just be testing the sign > bit. byte1 < 0 would be clearer if not faster, and I'd be for > changing that, though that probably should be a separate patch. > > Sherman, does the new webrev look ok to push? > > (1)ByteToCharJISAutoDetect.java It appears we should move the maskTable1/2 initialization code out of the constructor block. 37 private static byte[] maskTable1 = JISAutoDetect.getByteMask1(); 38 private static byte[] maskTable2 = JISAutoDetect.getByteMask2(); (2)EUC_JP_Open.java 137 j0208Index1 = JIS_X_0208_Solaris_Encoder.getIndex1(); 138 j0208Index2 = JIS_X_0208_Solaris_Encoder.getIndex2(); can be moved out of the constructor as you do for the decoder. better to keep them consistent (as well as the code in EUC_JP_LINUX) (3)sun/nio/cs/ext/HKSCS.java - this.big5Dec = big5Dec; + Decoder.big5Dec = big5Dec; Dave is absolutely right here. big5Dec definitely should be an instance field instead of static, it's my bug in the original code. It should be private DoubleByte.Decoder big5Dec; protected Decoder(Charset cs, DoubleByte.Decoder big5Dec, char[][] b2cBmp, char[][] b2cSupp) { // super(cs, 0.5f, 1.0f); // need to extends DoubleByte.Decoder so the // sun.io can use it. this implementation super(cs, 0.5f, 1.0f, null, null, 0, 0); this.big5Dec = big5Dec; this.b2cBmp = b2cBmp; this.b2cSupp = b2cSupp; } Thanks, Sherman From alan.bateman at oracle.com Wed Jun 9 17:55:04 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Wed, 09 Jun 2010 17:55:04 +0000 Subject: hg: jdk7/tl/jdk: 6935563: (dc) Improve connection reset/port unreachable handling [win] Message-ID: <20100609175514.8E58447096@hg.openjdk.java.net> Changeset: af68ad345389 Author: alanb Date: 2010-06-09 18:51 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/af68ad345389 6935563: (dc) Improve connection reset/port unreachable handling [win] Reviewed-by: chegar ! src/windows/native/sun/nio/ch/DatagramChannelImpl.c ! src/windows/native/sun/nio/ch/Net.c + test/java/nio/channels/DatagramChannel/SelectWhenRefused.java From martinrb at google.com Wed Jun 9 19:39:49 2010 From: martinrb at google.com (Martin Buchholz) Date: Wed, 9 Jun 2010 12:39:49 -0700 Subject: Must call RegisterNatives after getMethodID, else get UnsatisfiedLinkError In-Reply-To: <4C0F6C02.1070404@oracle.com> References: <4C0F6C02.1070404@oracle.com> Message-ID: David, Thanks for the bug archaeology. Judging by the other commenters, this bug is a regression from jdk5, and has cost many other users hours of frustrating debugging time, so I think an increase to P2 is in order. Since it used to work, it shouldn't be too hard to fix - all you need to do is to properly track registered native methods. Sorry for not doing this kind of research myself - it's just too painful without my beloved jbugs script :-( Here's an improved version of our test case, with -XX:+PrintJNIResolving output added, that you might add to the bug report. $ cat Test.java; echo ---------------------; cat jvm.cc; echo --------------------------; JDK=`jver 1.7.0-b96`; g++ -I$JDK/include -I$JDK/include/linux -ldl -DJDK=\"$JDK\" jvm.cc && ./a.out public class Test { public Test() { System.out.println("My class loader is " + getClass().getClassLoader()); testNative(); System.out.println("back to Java"); } public static native void testNative(); } --------------------- #include #include #include #include JavaVM* jvm; JNIEnv* env; const char* libjvm = JDK "/jre/lib/amd64/server/libjvm.so"; const char* loader_url = "file://./"; const char* class_name = "Test"; #define countof(array) (sizeof(array)/sizeof(array[0])) void InitializeJVM() { JavaVMOption options[] = { { (char*)"-Djava.class.path=.", NULL }, { (char*)"-XX:+PrintJNIResolving", NULL }, //{ (char*)"-verbose:jni", NULL }, }; JavaVMInitArgs vm_args; vm_args.version = JNI_VERSION_1_2; vm_args.options = options; vm_args.nOptions = countof(options); vm_args.ignoreUnrecognized = JNI_TRUE; void* handle = dlopen(libjvm, RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(1); } jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = reinterpret_cast (dlsym(handle, "JNI_CreateJavaVM")); if (!func_create_java_vm) { fprintf(stderr, "%s\n", dlerror()); exit(1); } jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); } void TestNative(JNIEnv* env, jclass cls) { printf("Successfully called registered native method\n"); } void RegisterNativeMethod(jclass cls) { static const JNINativeMethod jni_method = { (char*)"testNative", (char*)"()V", (void*)&TestNative }; env->RegisterNatives(cls, &jni_method, 1); if (env->ExceptionCheck()) env->ExceptionDescribe(); } void Test() { // URL[] urls = {new URL(url)} jclass cls = env->FindClass("java/net/URL"); jmethodID method = env->GetMethodID(cls, "", "(Ljava/lang/String;)V"); jstring jurl_str = env->NewStringUTF(loader_url); jobject jurl = env->NewObject(cls, method, jurl_str); jobjectArray jurls = env->NewObjectArray(1, cls, jurl); // URLClassLoader loader = new URLClassLoaer(urls) cls = env->FindClass("java/net/URLClassLoader"); method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); jobject jloader = env->NewObject(cls, method, jurls); // Class cls = loader.loadClass(name) method = env->GetMethodID( cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); jstring jname = env->NewStringUTF(class_name); cls = (jclass)env->CallObjectMethod(jloader, method, jname, (jboolean) true); // RegisterNatives must be called after GetMethodID. // If the order is reversed, we get UnsatisfiedLinkError, // which seems like a bug. RegisterNativeMethod(cls); method = env->GetMethodID(cls, "", "()V"); if (env->ExceptionCheck()) env->ExceptionDescribe(); env->NewObject(cls, method); if (env->ExceptionCheck()) env->ExceptionDescribe(); } int main(int argc, char** argv) { InitializeJVM(); Test(); return 0; } -------------------------- [Dynamic-linking native method java.lang.Object.registerNatives ... JNI] [Registering JNI native method java.lang.Object.hashCode] [Registering JNI native method java.lang.Object.wait] [Registering JNI native method java.lang.Object.notify] [Registering JNI native method java.lang.Object.notifyAll] [Registering JNI native method java.lang.Object.clone] [Dynamic-linking native method java.lang.System.registerNatives ... JNI] [Registering JNI native method java.lang.System.currentTimeMillis] [Registering JNI native method java.lang.System.nanoTime] [Registering JNI native method java.lang.System.arraycopy] [Dynamic-linking native method java.lang.Thread.registerNatives ... JNI] [Registering JNI native method java.lang.Thread.start0] [Registering JNI native method java.lang.Thread.stop0] [Registering JNI native method java.lang.Thread.isAlive] [Registering JNI native method java.lang.Thread.suspend0] [Registering JNI native method java.lang.Thread.resume0] [Registering JNI native method java.lang.Thread.setPriority0] [Registering JNI native method java.lang.Thread.yield] [Registering JNI native method java.lang.Thread.sleep] [Registering JNI native method java.lang.Thread.currentThread] [Registering JNI native method java.lang.Thread.countStackFrames] [Registering JNI native method java.lang.Thread.interrupt0] [Registering JNI native method java.lang.Thread.isInterrupted] [Registering JNI native method java.lang.Thread.holdsLock] [Registering JNI native method java.lang.Thread.getThreads] [Registering JNI native method java.lang.Thread.dumpThreads] [Dynamic-linking native method java.security.AccessController.getStackAccessControlContext ... JNI] [Dynamic-linking native method java.security.AccessController.getInheritedAccessControlContext ... JNI] [Dynamic-linking native method java.lang.ClassLoader.registerNatives ... JNI] [Registering JNI native method java.lang.ClassLoader.retrieveDirectives] [Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI] [Dynamic-linking native method java.lang.Class.registerNatives ... JNI] [Registering JNI native method java.lang.Class.getName0] [Registering JNI native method java.lang.Class.getSuperclass] [Registering JNI native method java.lang.Class.getInterfaces] [Registering JNI native method java.lang.Class.getClassLoader0] [Registering JNI native method java.lang.Class.isInterface] [Registering JNI native method java.lang.Class.getSigners] [Registering JNI native method java.lang.Class.setSigners] [Registering JNI native method java.lang.Class.isArray] [Registering JNI native method java.lang.Class.isPrimitive] [Registering JNI native method java.lang.Class.getComponentType] [Registering JNI native method java.lang.Class.getModifiers] [Registering JNI native method java.lang.Class.getDeclaredFields0] [Registering JNI native method java.lang.Class.getDeclaredMethods0] [Registering JNI native method java.lang.Class.getDeclaredConstructors0] [Registering JNI native method java.lang.Class.getProtectionDomain0] [Registering JNI native method java.lang.Class.setProtectionDomain0] [Registering JNI native method java.lang.Class.getDeclaredClasses0] [Registering JNI native method java.lang.Class.getDeclaringClass] [Registering JNI native method java.lang.Class.getGenericSignature] [Registering JNI native method java.lang.Class.getRawAnnotations] [Registering JNI native method java.lang.Class.getConstantPool] [Registering JNI native method java.lang.Class.desiredAssertionStatus0] [Registering JNI native method java.lang.Class.getEnclosingMethod0] [Dynamic-linking native method java.lang.Class.getPrimitiveClass ... JNI] [Dynamic-linking native method java.lang.System.initProperties ... JNI] [Dynamic-linking native method sun.misc.Unsafe.registerNatives ... JNI] [Registering JNI native method sun.misc.Unsafe.getLoadAverage] [Dynamic-linking native method java.lang.Throwable.fillInStackTrace ... JNI] [Registering JNI native method sun.misc.Unsafe.copyMemory] [Registering JNI native method sun.misc.Unsafe.setMemory] [Registering JNI native method sun.misc.Unsafe.getObject] [Registering JNI native method sun.misc.Unsafe.putObject] [Registering JNI native method sun.misc.Unsafe.getObjectVolatile] [Registering JNI native method sun.misc.Unsafe.putObjectVolatile] [Registering JNI native method sun.misc.Unsafe.getBoolean] [Registering JNI native method sun.misc.Unsafe.putBoolean] [Registering JNI native method sun.misc.Unsafe.getBooleanVolatile] [Registering JNI native method sun.misc.Unsafe.putBooleanVolatile] [Registering JNI native method sun.misc.Unsafe.getByte] [Registering JNI native method sun.misc.Unsafe.putByte] [Registering JNI native method sun.misc.Unsafe.getByteVolatile] [Registering JNI native method sun.misc.Unsafe.putByteVolatile] [Registering JNI native method sun.misc.Unsafe.getShort] [Registering JNI native method sun.misc.Unsafe.putShort] [Registering JNI native method sun.misc.Unsafe.getShortVolatile] [Registering JNI native method sun.misc.Unsafe.putShortVolatile] [Registering JNI native method sun.misc.Unsafe.getChar] [Registering JNI native method sun.misc.Unsafe.putChar] [Registering JNI native method sun.misc.Unsafe.getCharVolatile] [Registering JNI native method sun.misc.Unsafe.putCharVolatile] [Registering JNI native method sun.misc.Unsafe.getInt] [Registering JNI native method sun.misc.Unsafe.putInt] [Registering JNI native method sun.misc.Unsafe.getIntVolatile] [Registering JNI native method sun.misc.Unsafe.putIntVolatile] [Registering JNI native method sun.misc.Unsafe.getLong] [Registering JNI native method sun.misc.Unsafe.putLong] [Registering JNI native method sun.misc.Unsafe.getLongVolatile] [Registering JNI native method sun.misc.Unsafe.putLongVolatile] [Registering JNI native method sun.misc.Unsafe.getFloat] [Registering JNI native method sun.misc.Unsafe.putFloat] [Registering JNI native method sun.misc.Unsafe.getFloatVolatile] [Registering JNI native method sun.misc.Unsafe.putFloatVolatile] [Registering JNI native method sun.misc.Unsafe.getDouble] [Registering JNI native method sun.misc.Unsafe.putDouble] [Registering JNI native method sun.misc.Unsafe.getDoubleVolatile] [Registering JNI native method sun.misc.Unsafe.putDoubleVolatile] [Registering JNI native method sun.misc.Unsafe.getByte] [Registering JNI native method sun.misc.Unsafe.putByte] [Registering JNI native method sun.misc.Unsafe.getShort] [Registering JNI native method sun.misc.Unsafe.putShort] [Registering JNI native method sun.misc.Unsafe.getChar] [Registering JNI native method sun.misc.Unsafe.putChar] [Registering JNI native method sun.misc.Unsafe.getInt] [Registering JNI native method sun.misc.Unsafe.putInt] [Registering JNI native method sun.misc.Unsafe.getLong] [Registering JNI native method sun.misc.Unsafe.putLong] [Registering JNI native method sun.misc.Unsafe.getFloat] [Registering JNI native method sun.misc.Unsafe.putFloat] [Registering JNI native method sun.misc.Unsafe.getDouble] [Registering JNI native method sun.misc.Unsafe.putDouble] [Registering JNI native method sun.misc.Unsafe.getAddress] [Registering JNI native method sun.misc.Unsafe.putAddress] [Registering JNI native method sun.misc.Unsafe.allocateMemory] [Registering JNI native method sun.misc.Unsafe.reallocateMemory] [Registering JNI native method sun.misc.Unsafe.freeMemory] [Registering JNI native method sun.misc.Unsafe.objectFieldOffset] [Registering JNI native method sun.misc.Unsafe.staticFieldOffset] [Registering JNI native method sun.misc.Unsafe.staticFieldBase] [Registering JNI native method sun.misc.Unsafe.ensureClassInitialized] [Registering JNI native method sun.misc.Unsafe.arrayBaseOffset] [Registering JNI native method sun.misc.Unsafe.arrayIndexScale] [Registering JNI native method sun.misc.Unsafe.addressSize] [Registering JNI native method sun.misc.Unsafe.pageSize] [Registering JNI native method sun.misc.Unsafe.defineClass] [Registering JNI native method sun.misc.Unsafe.defineClass] [Registering JNI native method sun.misc.Unsafe.allocateInstance] [Registering JNI native method sun.misc.Unsafe.monitorEnter] [Registering JNI native method sun.misc.Unsafe.monitorExit] [Registering JNI native method sun.misc.Unsafe.tryMonitorEnter] [Registering JNI native method sun.misc.Unsafe.throwException] [Registering JNI native method sun.misc.Unsafe.compareAndSwapObject] [Registering JNI native method sun.misc.Unsafe.compareAndSwapInt] [Registering JNI native method sun.misc.Unsafe.compareAndSwapLong] [Registering JNI native method sun.misc.Unsafe.putOrderedObject] [Registering JNI native method sun.misc.Unsafe.putOrderedInt] [Registering JNI native method sun.misc.Unsafe.putOrderedLong] [Registering JNI native method sun.misc.Unsafe.park] [Registering JNI native method sun.misc.Unsafe.unpark] [Dynamic-linking native method java.lang.Float.floatToRawIntBits ... JNI] [Dynamic-linking native method java.lang.Double.doubleToRawLongBits ... JNI] [Dynamic-linking native method sun.reflect.Reflection.getCallerClass ... JNI] [Dynamic-linking native method java.lang.String.intern ... JNI] [Dynamic-linking native method java.lang.Object.getClass ... JNI] [Dynamic-linking native method java.lang.Class.forName0 ... JNI] [Dynamic-linking native method sun.reflect.Reflection.getClassAccessFlags ... JNI] [Dynamic-linking native method sun.reflect.NativeConstructorAccessorImpl.newInstance0 ... JNI] [Dynamic-linking native method sun.misc.VM.initialize ... JNI] [Dynamic-linking native method java.io.FileSystem.getFileSystem ... JNI] [Dynamic-linking native method java.io.UnixFileSystem.initIDs ... JNI] [Dynamic-linking native method java.lang.System.mapLibraryName ... JNI] [Dynamic-linking native method java.io.UnixFileSystem.getBooleanAttributes0 ... JNI] [Dynamic-linking native method java.io.UnixFileSystem.canonicalize0 ... JNI] [Dynamic-linking native method java.lang.ClassLoader$NativeLibrary.load ... JNI] [Dynamic-linking native method java.io.FileInputStream.initIDs ... JNI] [Dynamic-linking native method java.io.FileDescriptor.initIDs ... JNI] [Dynamic-linking native method java.io.FileOutputStream.initIDs ... JNI] [Dynamic-linking native method java.lang.System.setIn0 ... JNI] [Dynamic-linking native method java.lang.System.setOut0 ... JNI] [Dynamic-linking native method java.lang.System.setErr0 ... JNI] [Dynamic-linking native method sun.misc.Signal.findSignal ... JNI] [Dynamic-linking native method sun.misc.Signal.handle0 ... JNI] [Dynamic-linking native method java.lang.Runtime.maxMemory ... JNI] [Dynamic-linking native method java.lang.Compiler.registerNatives ... JNI] [Registering JNI native method java.lang.Compiler.compileClass] [Registering JNI native method java.lang.Compiler.compileClasses] [Registering JNI native method java.lang.Compiler.command] [Registering JNI native method java.lang.Compiler.enable] [Registering JNI native method java.lang.Compiler.disable] [Dynamic-linking native method java.lang.ClassLoader.getCaller ... JNI] [Dynamic-linking native method java.lang.ClassLoader$NativeLibrary.find ... JNI] [Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI] [Dynamic-linking native method java.io.FileInputStream.open ... JNI] [Dynamic-linking native method java.io.FileInputStream.readBytes ... JNI] [Dynamic-linking native method java.io.FileInputStream.available ... JNI] [Dynamic-linking native method java.lang.reflect.Array.newArray ... JNI] [Dynamic-linking native method java.io.FileInputStream.close0 ... JNI] [Dynamic-linking native method java.io.UnixFileSystem.list ... JNI] [Dynamic-linking native method java.lang.ClassLoader.findLoadedClass0 ... JNI] [Dynamic-linking native method java.lang.ClassLoader.findBootstrapClass ... JNI] [Dynamic-linking native method java.security.AccessController.doPrivileged ... JNI] [Dynamic-linking native method java.io.UnixFileSystem.getLength ... JNI] [Dynamic-linking native method sun.misc.Perf.registerNatives ... JNI] [Registering JNI native method sun.misc.Perf.attach] [Registering JNI native method sun.misc.Perf.detach] [Registering JNI native method sun.misc.Perf.createLong] [Registering JNI native method sun.misc.Perf.createByteArray] [Registering JNI native method sun.misc.Perf.highResCounter] [Registering JNI native method sun.misc.Perf.highResFrequency] [Dynamic-linking native method java.lang.ClassLoader.defineClass1 ... JNI] [Dynamic-linking native method java.lang.ClassLoader.resolveClass0 ... JNI] [Registering JNI native method Test.testNative] [Dynamic-linking native method java.io.FileOutputStream.writeBytes ... JNI] My class loader is sun.misc.Launcher$AppClassLoader at b92d342 Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testNative()V [Dynamic-linking native method java.lang.Throwable.getStackTraceDepth ... JNI] [Dynamic-linking native method java.lang.Throwable.getStackTraceElement ... JNI] at Test.testNative(Native Method) at Test.(Test.java:4) Martin On Wed, Jun 9, 2010 at 03:25, David Holmes wrote: > Hi Martin, > > Turns out this is a known (and old) issue (thanks Yuri!): > > CR 6493522 "JNI_RegisterNatives fails to bind a method of an uninitialized > class" > > I'll add this email info to the CR. > > David > > Martin Buchholz said the following on 06/09/10 09:12: >> >> Hi ClassLoader maintainers, >> >> This is a bug report. >> >> (I think this is a hotspot bug, but it might be a core library >> ClassLoader bug or even a URLClassLoader bug) >> >> If you use RegisterNatives with a class loaded using URLClassLoader, >> you must call GetMethodID >> before RegisterNatives, or you get an UnsatisfiedLinkError as in the >> test case below >> >> (you will need to edit the below to fill in the location of your jni >> include directory and your libjvm.so) >> >> $ cat Test.java; echo ---------------------; cat jvm.cc; echo >> --------------------------; g++ -I$JDK/include -I$JDK/include/linux >> -ldl jvm.cc && ./a.out >> public class Test { >> ?public Test() { >> ? ?System.out.println("My class loader is " + >> getClass().getClassLoader()); >> ? ?testNative(); >> ? ?System.out.println("back to Java"); >> ?} >> ?public static native void testNative(); >> } >> --------------------- >> #include >> #include >> #include >> >> JavaVM* jvm; >> JNIEnv* env; >> const char* libjvm = >> ? ?"$JDKDIR/libjvm.so"; >> const char* loader_url = "file://./"; >> const char* class_name = "Test"; >> >> void InitializeJVM() { >> ?JavaVMOption options[1]; >> ?options[0].optionString = (char*)"-Djava.class.path=."; >> ?//options[1].optionString = (char*)"-verbose:jni"; >> >> ?JavaVMInitArgs vm_args; >> ?vm_args.version = JNI_VERSION_1_2; >> ?vm_args.options = options; >> ?vm_args.nOptions = 2; >> ?vm_args.ignoreUnrecognized = JNI_TRUE; >> >> ?void* handle = dlopen(libjvm, RTLD_LAZY); >> ?if (handle == NULL) perror("dlopen"); >> ?jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = >> ? ? ?reinterpret_cast >> ? ? ?(dlsym(handle, "JNI_CreateJavaVM")); >> ?if (func_create_java_vm == NULL) perror("dlsym"); >> ?jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); >> } >> >> void TestNative(JNIEnv* env, jclass cls) { >> ?printf("Successfully called registered native method\n"); >> } >> >> void RegisterNativeMethod(jclass cls) { >> ?static const JNINativeMethod jni_method = >> ? ? ?{ (char*)"testNative", >> ? ? ? ?(char*)"()V", >> ? ? ? ?(void*)&TestNative }; >> ?env->RegisterNatives(cls, &jni_method, 1); >> ?if (env->ExceptionCheck()) env->ExceptionDescribe(); >> } >> >> void Test() { >> ?// URL[] urls = {new URL(url)} >> ?jclass cls = env->FindClass("java/net/URL"); >> ?jmethodID method = env->GetMethodID(cls, "", >> "(Ljava/lang/String;)V"); >> ?jstring jurl_str = env->NewStringUTF(loader_url); >> ?jobject jurl = env->NewObject(cls, method, jurl_str); >> ?jobjectArray jurls = env->NewObjectArray(1, cls, jurl); >> >> ?// URLClassLoader loader = new URLClassLoaer(urls) >> ?cls = env->FindClass("java/net/URLClassLoader"); >> ?method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); >> ?jobject jloader = env->NewObject(cls, method, jurls); >> >> ?// Class cls = loader.loadClass(name) >> ?method = env->GetMethodID( >> ? ? ?cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); >> ?jstring jname = env->NewStringUTF(class_name); >> ?cls = (jclass)env->CallObjectMethod(jloader, method, jname, (jboolean) >> true); >> >> ?method = env->GetMethodID(cls, "", "()V"); >> ?if (env->ExceptionCheck()) env->ExceptionDescribe(); >> >> ?// RegisterNatives must be called after GetMethodID. >> ?// If the order is reversed, we get UnsatisfiedLinkError, >> ?// which seems like a bug. >> ?RegisterNativeMethod(cls); >> >> ?env->NewObject(cls, method); >> ?if (env->ExceptionCheck()) env->ExceptionDescribe(); >> } >> >> int main(int argc, char** argv) { >> ?InitializeJVM(); >> ?Test(); >> >> ?return 0; >> } >> -------------------------- >> My class loader is sun.misc.Launcher$AppClassLoader at 1f7182c1 >> Successfully called registered native method >> back to Java >> >> Thanks, >> >> Martin > From Ulf.Zibis at gmx.de Wed Jun 9 19:43:21 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Wed, 09 Jun 2010 21:43:21 +0200 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: <4C0D6D04.5090701@oracle.com> References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> Message-ID: <4C0FEED9.9020003@gmx.de> Hi Sherman, I'm happy to see those enhancements. Please allow me to note, that IIRC many of them and similar others I had addressed by my patches on https://bugs.openjdk.java.net/show_bug.cgi?id=10009x. Unfortunately https://bugs.openjdk.java.net is down today, so I can't be more specific. I would appreciate, someone would review my patches. -Ulf Am 08.06.2010 00:04, schrieb Xueming Shen: > Hi Andrew, > > 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails > in sun/nio/cs due to the use of -Werror > > (1)sun/io/ByteTocharISO2022JP.java > #129, #151 > > if ((byte1 & (byte)0x80) != 0){ > > if ((byte2 & (byte)0x80) != 0){ > > > (byte) casting is not necessary as well? > > (2)sun/io/ByteToCharJISAutoDetect.java > > we should (if I did not miss anything) simply change the > sun/nio/cs/ext/JISAutoDetect.getByteMask1|2 to static, then no > longer need to > have an instance in ByteToCharJISAutoDetect. > > (3)sun/nio/cs/ext/EUC_JP_LINUX.java > > encoderJ0208 no longer needed? > decodeMappingJ0208.start = 0xa1; > decodeMappingJ0208.end = 0xfe; > > seems like we should simply replace decodeMappingJ0208.start/end > with start/end > and the decodeMappingJ0208 is no longer necessary as well. > > (4) > > again, it might be better to do something as below. The EUC_JP_xyz > are something need to > be re-written/-re-organized when we have time. > > short[] j0208Index1 = JIS_X_0208_Solaris_Decoder.getIndex1(); > String[]j0208Index2 = JIS_X_0208_Solaris_Decoder.getIndex2(); > > int start = 0xa1; > int end = -0xfe; > > 100 protected char decodeDouble(int byte1, int byte2) { > 101 if (byte1 == 0x8e) { > 102 return decoderJ0201.decode(byte2 - 256); > 103 } > 104 105 if (((byte1 < 0) > 106 || (byte1 > j0208Index1.length)) > 107 || ((byte2 < start) > 108 || (byte2 > end))) > 109 return REPLACE_CHAR; > 110 111 char result = super.decodeDouble(byte1, byte2); > 112 if (result != '\uFFFD') { > 113 return result; > 114 } else { > 115 int n = (j0208Index1[byte1 - 0x80] & 0xf) * > 116 (end - start + 1) > 117 + (byte2 - start); > 118 return j0208Index2[j0208Index1[byte1 - 0x80] >> > 4].charAt(n); > 119 } > 120 } > > encoderJ0208 is no longer needed. > > (5) sun.nio.cs.ext.PCK.java > > JIS_X_0208_Solaris_Encoder jis0208 is no longer needed > > -sherman > From kelly.ohair at oracle.com Wed Jun 9 19:52:50 2010 From: kelly.ohair at oracle.com (Kelly O'Hair) Date: Wed, 9 Jun 2010 12:52:50 -0700 Subject: Must call RegisterNatives after getMethodID, else get UnsatisfiedLinkError In-Reply-To: References: <4C0F6C02.1070404@oracle.com> Message-ID: <6865BD5B-7A89-48DA-94BD-D75B6E60B673@oracle.com> It's been a while since I worked with this stuff, but I would have done a: jclass cls = env->FindClass("Test"); Which, if I recall, FindClass actually initializes the class. Just a stab in the dark. -kto On Jun 9, 2010, at 12:39 PM, Martin Buchholz wrote: > David, Thanks for the bug archaeology. Judging by the other > commenters, this bug is a regression from jdk5, and has cost many > other users hours of frustrating debugging time, so I think an > increase to P2 is in order. Since it used to work, it shouldn't be > too hard to fix - all you need to do is to properly track registered > native methods. > > Sorry for not doing this kind of research myself - it's just too > painful without my beloved jbugs script :-( > > Here's an improved version of our test case, with > -XX:+PrintJNIResolving output added, > that you might add to the bug report. > > $ cat Test.java; echo ---------------------; cat jvm.cc; echo > --------------------------; JDK=`jver 1.7.0-b96`; g++ -I$JDK/include > -I$JDK/include/linux -ldl -DJDK=\"$JDK\" jvm.cc && ./a.out > public class Test { > public Test() { > System.out.println("My class loader is " + > getClass().getClassLoader()); > testNative(); > System.out.println("back to Java"); > } > public static native void testNative(); > } > --------------------- > #include > #include > #include > #include > > JavaVM* jvm; > JNIEnv* env; > const char* libjvm = JDK "/jre/lib/amd64/server/libjvm.so"; > const char* loader_url = "file://./"; > const char* class_name = "Test"; > > #define countof(array) (sizeof(array)/sizeof(array[0])) > > void InitializeJVM() { > JavaVMOption options[] = { > { (char*)"-Djava.class.path=.", NULL }, > { (char*)"-XX:+PrintJNIResolving", NULL }, > //{ (char*)"-verbose:jni", NULL }, > }; > > JavaVMInitArgs vm_args; > vm_args.version = JNI_VERSION_1_2; > vm_args.options = options; > vm_args.nOptions = countof(options); > vm_args.ignoreUnrecognized = JNI_TRUE; > > void* handle = dlopen(libjvm, RTLD_LAZY); > if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(1); } > > jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = > reinterpret_cast > (dlsym(handle, "JNI_CreateJavaVM")); > if (!func_create_java_vm) { fprintf(stderr, "%s\n", dlerror()); > exit(1); } > > jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); > } > > void TestNative(JNIEnv* env, jclass cls) { > printf("Successfully called registered native method\n"); > } > > void RegisterNativeMethod(jclass cls) { > static const JNINativeMethod jni_method = > { (char*)"testNative", > (char*)"()V", > (void*)&TestNative }; > env->RegisterNatives(cls, &jni_method, 1); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > } > > void Test() { > // URL[] urls = {new URL(url)} > jclass cls = env->FindClass("java/net/URL"); > jmethodID method = env->GetMethodID(cls, "", "(Ljava/lang/ > String;)V"); > jstring jurl_str = env->NewStringUTF(loader_url); > jobject jurl = env->NewObject(cls, method, jurl_str); > jobjectArray jurls = env->NewObjectArray(1, cls, jurl); > > // URLClassLoader loader = new URLClassLoaer(urls) > cls = env->FindClass("java/net/URLClassLoader"); > method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); > jobject jloader = env->NewObject(cls, method, jurls); > > // Class cls = loader.loadClass(name) > method = env->GetMethodID( > cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); > jstring jname = env->NewStringUTF(class_name); > cls = (jclass)env->CallObjectMethod(jloader, method, jname, > (jboolean) true); > > // RegisterNatives must be called after GetMethodID. > // If the order is reversed, we get UnsatisfiedLinkError, > // which seems like a bug. > RegisterNativeMethod(cls); > > method = env->GetMethodID(cls, "", "()V"); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > > env->NewObject(cls, method); > if (env->ExceptionCheck()) env->ExceptionDescribe(); > } > > int main(int argc, char** argv) { > InitializeJVM(); > Test(); > > return 0; > } > -------------------------- > [Dynamic-linking native method java.lang.Object.registerNatives ... > JNI] > [Registering JNI native method java.lang.Object.hashCode] > [Registering JNI native method java.lang.Object.wait] > [Registering JNI native method java.lang.Object.notify] > [Registering JNI native method java.lang.Object.notifyAll] > [Registering JNI native method java.lang.Object.clone] > [Dynamic-linking native method java.lang.System.registerNatives ... > JNI] > [Registering JNI native method java.lang.System.currentTimeMillis] > [Registering JNI native method java.lang.System.nanoTime] > [Registering JNI native method java.lang.System.arraycopy] > [Dynamic-linking native method java.lang.Thread.registerNatives ... > JNI] > [Registering JNI native method java.lang.Thread.start0] > [Registering JNI native method java.lang.Thread.stop0] > [Registering JNI native method java.lang.Thread.isAlive] > [Registering JNI native method java.lang.Thread.suspend0] > [Registering JNI native method java.lang.Thread.resume0] > [Registering JNI native method java.lang.Thread.setPriority0] > [Registering JNI native method java.lang.Thread.yield] > [Registering JNI native method java.lang.Thread.sleep] > [Registering JNI native method java.lang.Thread.currentThread] > [Registering JNI native method java.lang.Thread.countStackFrames] > [Registering JNI native method java.lang.Thread.interrupt0] > [Registering JNI native method java.lang.Thread.isInterrupted] > [Registering JNI native method java.lang.Thread.holdsLock] > [Registering JNI native method java.lang.Thread.getThreads] > [Registering JNI native method java.lang.Thread.dumpThreads] > [Dynamic-linking native method > java.security.AccessController.getStackAccessControlContext ... JNI] > [Dynamic-linking native method > java.security.AccessController.getInheritedAccessControlContext ... > JNI] > [Dynamic-linking native method > java.lang.ClassLoader.registerNatives ... JNI] > [Registering JNI native method > java.lang.ClassLoader.retrieveDirectives] > [Dynamic-linking native method > java.security.AccessController.doPrivileged ... JNI] > [Dynamic-linking native method java.lang.Class.registerNatives ... > JNI] > [Registering JNI native method java.lang.Class.getName0] > [Registering JNI native method java.lang.Class.getSuperclass] > [Registering JNI native method java.lang.Class.getInterfaces] > [Registering JNI native method java.lang.Class.getClassLoader0] > [Registering JNI native method java.lang.Class.isInterface] > [Registering JNI native method java.lang.Class.getSigners] > [Registering JNI native method java.lang.Class.setSigners] > [Registering JNI native method java.lang.Class.isArray] > [Registering JNI native method java.lang.Class.isPrimitive] > [Registering JNI native method java.lang.Class.getComponentType] > [Registering JNI native method java.lang.Class.getModifiers] > [Registering JNI native method java.lang.Class.getDeclaredFields0] > [Registering JNI native method java.lang.Class.getDeclaredMethods0] > [Registering JNI native method > java.lang.Class.getDeclaredConstructors0] > [Registering JNI native method java.lang.Class.getProtectionDomain0] > [Registering JNI native method java.lang.Class.setProtectionDomain0] > [Registering JNI native method java.lang.Class.getDeclaredClasses0] > [Registering JNI native method java.lang.Class.getDeclaringClass] > [Registering JNI native method java.lang.Class.getGenericSignature] > [Registering JNI native method java.lang.Class.getRawAnnotations] > [Registering JNI native method java.lang.Class.getConstantPool] > [Registering JNI native method > java.lang.Class.desiredAssertionStatus0] > [Registering JNI native method java.lang.Class.getEnclosingMethod0] > [Dynamic-linking native method java.lang.Class.getPrimitiveClass ... > JNI] > [Dynamic-linking native method java.lang.System.initProperties ... > JNI] > [Dynamic-linking native method sun.misc.Unsafe.registerNatives ... > JNI] > [Registering JNI native method sun.misc.Unsafe.getLoadAverage] > [Dynamic-linking native method > java.lang.Throwable.fillInStackTrace ... JNI] > [Registering JNI native method sun.misc.Unsafe.copyMemory] > [Registering JNI native method sun.misc.Unsafe.setMemory] > [Registering JNI native method sun.misc.Unsafe.getObject] > [Registering JNI native method sun.misc.Unsafe.putObject] > [Registering JNI native method sun.misc.Unsafe.getObjectVolatile] > [Registering JNI native method sun.misc.Unsafe.putObjectVolatile] > [Registering JNI native method sun.misc.Unsafe.getBoolean] > [Registering JNI native method sun.misc.Unsafe.putBoolean] > [Registering JNI native method sun.misc.Unsafe.getBooleanVolatile] > [Registering JNI native method sun.misc.Unsafe.putBooleanVolatile] > [Registering JNI native method sun.misc.Unsafe.getByte] > [Registering JNI native method sun.misc.Unsafe.putByte] > [Registering JNI native method sun.misc.Unsafe.getByteVolatile] > [Registering JNI native method sun.misc.Unsafe.putByteVolatile] > [Registering JNI native method sun.misc.Unsafe.getShort] > [Registering JNI native method sun.misc.Unsafe.putShort] > [Registering JNI native method sun.misc.Unsafe.getShortVolatile] > [Registering JNI native method sun.misc.Unsafe.putShortVolatile] > [Registering JNI native method sun.misc.Unsafe.getChar] > [Registering JNI native method sun.misc.Unsafe.putChar] > [Registering JNI native method sun.misc.Unsafe.getCharVolatile] > [Registering JNI native method sun.misc.Unsafe.putCharVolatile] > [Registering JNI native method sun.misc.Unsafe.getInt] > [Registering JNI native method sun.misc.Unsafe.putInt] > [Registering JNI native method sun.misc.Unsafe.getIntVolatile] > [Registering JNI native method sun.misc.Unsafe.putIntVolatile] > [Registering JNI native method sun.misc.Unsafe.getLong] > [Registering JNI native method sun.misc.Unsafe.putLong] > [Registering JNI native method sun.misc.Unsafe.getLongVolatile] > [Registering JNI native method sun.misc.Unsafe.putLongVolatile] > [Registering JNI native method sun.misc.Unsafe.getFloat] > [Registering JNI native method sun.misc.Unsafe.putFloat] > [Registering JNI native method sun.misc.Unsafe.getFloatVolatile] > [Registering JNI native method sun.misc.Unsafe.putFloatVolatile] > [Registering JNI native method sun.misc.Unsafe.getDouble] > [Registering JNI native method sun.misc.Unsafe.putDouble] > [Registering JNI native method sun.misc.Unsafe.getDoubleVolatile] > [Registering JNI native method sun.misc.Unsafe.putDoubleVolatile] > [Registering JNI native method sun.misc.Unsafe.getByte] > [Registering JNI native method sun.misc.Unsafe.putByte] > [Registering JNI native method sun.misc.Unsafe.getShort] > [Registering JNI native method sun.misc.Unsafe.putShort] > [Registering JNI native method sun.misc.Unsafe.getChar] > [Registering JNI native method sun.misc.Unsafe.putChar] > [Registering JNI native method sun.misc.Unsafe.getInt] > [Registering JNI native method sun.misc.Unsafe.putInt] > [Registering JNI native method sun.misc.Unsafe.getLong] > [Registering JNI native method sun.misc.Unsafe.putLong] > [Registering JNI native method sun.misc.Unsafe.getFloat] > [Registering JNI native method sun.misc.Unsafe.putFloat] > [Registering JNI native method sun.misc.Unsafe.getDouble] > [Registering JNI native method sun.misc.Unsafe.putDouble] > [Registering JNI native method sun.misc.Unsafe.getAddress] > [Registering JNI native method sun.misc.Unsafe.putAddress] > [Registering JNI native method sun.misc.Unsafe.allocateMemory] > [Registering JNI native method sun.misc.Unsafe.reallocateMemory] > [Registering JNI native method sun.misc.Unsafe.freeMemory] > [Registering JNI native method sun.misc.Unsafe.objectFieldOffset] > [Registering JNI native method sun.misc.Unsafe.staticFieldOffset] > [Registering JNI native method sun.misc.Unsafe.staticFieldBase] > [Registering JNI native method sun.misc.Unsafe.ensureClassInitialized] > [Registering JNI native method sun.misc.Unsafe.arrayBaseOffset] > [Registering JNI native method sun.misc.Unsafe.arrayIndexScale] > [Registering JNI native method sun.misc.Unsafe.addressSize] > [Registering JNI native method sun.misc.Unsafe.pageSize] > [Registering JNI native method sun.misc.Unsafe.defineClass] > [Registering JNI native method sun.misc.Unsafe.defineClass] > [Registering JNI native method sun.misc.Unsafe.allocateInstance] > [Registering JNI native method sun.misc.Unsafe.monitorEnter] > [Registering JNI native method sun.misc.Unsafe.monitorExit] > [Registering JNI native method sun.misc.Unsafe.tryMonitorEnter] > [Registering JNI native method sun.misc.Unsafe.throwException] > [Registering JNI native method sun.misc.Unsafe.compareAndSwapObject] > [Registering JNI native method sun.misc.Unsafe.compareAndSwapInt] > [Registering JNI native method sun.misc.Unsafe.compareAndSwapLong] > [Registering JNI native method sun.misc.Unsafe.putOrderedObject] > [Registering JNI native method sun.misc.Unsafe.putOrderedInt] > [Registering JNI native method sun.misc.Unsafe.putOrderedLong] > [Registering JNI native method sun.misc.Unsafe.park] > [Registering JNI native method sun.misc.Unsafe.unpark] > [Dynamic-linking native method java.lang.Float.floatToRawIntBits ... > JNI] > [Dynamic-linking native method > java.lang.Double.doubleToRawLongBits ... JNI] > [Dynamic-linking native method > sun.reflect.Reflection.getCallerClass ... JNI] > [Dynamic-linking native method java.lang.String.intern ... JNI] > [Dynamic-linking native method java.lang.Object.getClass ... JNI] > [Dynamic-linking native method java.lang.Class.forName0 ... JNI] > [Dynamic-linking native method > sun.reflect.Reflection.getClassAccessFlags ... JNI] > [Dynamic-linking native method > sun.reflect.NativeConstructorAccessorImpl.newInstance0 ... JNI] > [Dynamic-linking native method sun.misc.VM.initialize ... JNI] > [Dynamic-linking native method java.io.FileSystem.getFileSystem ... > JNI] > [Dynamic-linking native method java.io.UnixFileSystem.initIDs ... JNI] > [Dynamic-linking native method java.lang.System.mapLibraryName ... > JNI] > [Dynamic-linking native method > java.io.UnixFileSystem.getBooleanAttributes0 ... JNI] > [Dynamic-linking native method > java.io.UnixFileSystem.canonicalize0 ... JNI] > [Dynamic-linking native method java.lang.ClassLoader > $NativeLibrary.load ... JNI] > [Dynamic-linking native method java.io.FileInputStream.initIDs ... > JNI] > [Dynamic-linking native method java.io.FileDescriptor.initIDs ... JNI] > [Dynamic-linking native method java.io.FileOutputStream.initIDs ... > JNI] > [Dynamic-linking native method java.lang.System.setIn0 ... JNI] > [Dynamic-linking native method java.lang.System.setOut0 ... JNI] > [Dynamic-linking native method java.lang.System.setErr0 ... JNI] > [Dynamic-linking native method sun.misc.Signal.findSignal ... JNI] > [Dynamic-linking native method sun.misc.Signal.handle0 ... JNI] > [Dynamic-linking native method java.lang.Runtime.maxMemory ... JNI] > [Dynamic-linking native method > java.lang.Compiler.registerNatives ... JNI] > [Registering JNI native method java.lang.Compiler.compileClass] > [Registering JNI native method java.lang.Compiler.compileClasses] > [Registering JNI native method java.lang.Compiler.command] > [Registering JNI native method java.lang.Compiler.enable] > [Registering JNI native method java.lang.Compiler.disable] > [Dynamic-linking native method java.lang.ClassLoader.getCaller ... > JNI] > [Dynamic-linking native method java.lang.ClassLoader > $NativeLibrary.find ... JNI] > [Dynamic-linking native method > java.security.AccessController.doPrivileged ... JNI] > [Dynamic-linking native method java.io.FileInputStream.open ... JNI] > [Dynamic-linking native method java.io.FileInputStream.readBytes ... > JNI] > [Dynamic-linking native method java.io.FileInputStream.available ... > JNI] > [Dynamic-linking native method java.lang.reflect.Array.newArray ... > JNI] > [Dynamic-linking native method java.io.FileInputStream.close0 ... JNI] > [Dynamic-linking native method java.io.UnixFileSystem.list ... JNI] > [Dynamic-linking native method > java.lang.ClassLoader.findLoadedClass0 ... JNI] > [Dynamic-linking native method > java.lang.ClassLoader.findBootstrapClass ... JNI] > [Dynamic-linking native method > java.security.AccessController.doPrivileged ... JNI] > [Dynamic-linking native method java.io.UnixFileSystem.getLength ... > JNI] > [Dynamic-linking native method sun.misc.Perf.registerNatives ... JNI] > [Registering JNI native method sun.misc.Perf.attach] > [Registering JNI native method sun.misc.Perf.detach] > [Registering JNI native method sun.misc.Perf.createLong] > [Registering JNI native method sun.misc.Perf.createByteArray] > [Registering JNI native method sun.misc.Perf.highResCounter] > [Registering JNI native method sun.misc.Perf.highResFrequency] > [Dynamic-linking native method > java.lang.ClassLoader.defineClass1 ... JNI] > [Dynamic-linking native method > java.lang.ClassLoader.resolveClass0 ... JNI] > [Registering JNI native method Test.testNative] > [Dynamic-linking native method > java.io.FileOutputStream.writeBytes ... JNI] > My class loader is sun.misc.Launcher$AppClassLoader at b92d342 > Exception in thread "main" java.lang.UnsatisfiedLinkError: > Test.testNative()V > [Dynamic-linking native method > java.lang.Throwable.getStackTraceDepth ... JNI] > [Dynamic-linking native method > java.lang.Throwable.getStackTraceElement ... JNI] > at Test.testNative(Native Method) > at Test.(Test.java:4) > > Martin > > On Wed, Jun 9, 2010 at 03:25, David Holmes > wrote: >> Hi Martin, >> >> Turns out this is a known (and old) issue (thanks Yuri!): >> >> CR 6493522 "JNI_RegisterNatives fails to bind a method of an >> uninitialized >> class" >> >> I'll add this email info to the CR. >> >> David >> >> Martin Buchholz said the following on 06/09/10 09:12: >>> >>> Hi ClassLoader maintainers, >>> >>> This is a bug report. >>> >>> (I think this is a hotspot bug, but it might be a core library >>> ClassLoader bug or even a URLClassLoader bug) >>> >>> If you use RegisterNatives with a class loaded using URLClassLoader, >>> you must call GetMethodID >>> before RegisterNatives, or you get an UnsatisfiedLinkError as in the >>> test case below >>> >>> (you will need to edit the below to fill in the location of your jni >>> include directory and your libjvm.so) >>> >>> $ cat Test.java; echo ---------------------; cat jvm.cc; echo >>> --------------------------; g++ -I$JDK/include -I$JDK/include/linux >>> -ldl jvm.cc && ./a.out >>> public class Test { >>> public Test() { >>> System.out.println("My class loader is " + >>> getClass().getClassLoader()); >>> testNative(); >>> System.out.println("back to Java"); >>> } >>> public static native void testNative(); >>> } >>> --------------------- >>> #include >>> #include >>> #include >>> >>> JavaVM* jvm; >>> JNIEnv* env; >>> const char* libjvm = >>> "$JDKDIR/libjvm.so"; >>> const char* loader_url = "file://./"; >>> const char* class_name = "Test"; >>> >>> void InitializeJVM() { >>> JavaVMOption options[1]; >>> options[0].optionString = (char*)"-Djava.class.path=."; >>> //options[1].optionString = (char*)"-verbose:jni"; >>> >>> JavaVMInitArgs vm_args; >>> vm_args.version = JNI_VERSION_1_2; >>> vm_args.options = options; >>> vm_args.nOptions = 2; >>> vm_args.ignoreUnrecognized = JNI_TRUE; >>> >>> void* handle = dlopen(libjvm, RTLD_LAZY); >>> if (handle == NULL) perror("dlopen"); >>> jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = >>> reinterpret_cast >>> (dlsym(handle, "JNI_CreateJavaVM")); >>> if (func_create_java_vm == NULL) perror("dlsym"); >>> jint result = (*func_create_java_vm)(&jvm, (void**)(&env), >>> &vm_args); >>> } >>> >>> void TestNative(JNIEnv* env, jclass cls) { >>> printf("Successfully called registered native method\n"); >>> } >>> >>> void RegisterNativeMethod(jclass cls) { >>> static const JNINativeMethod jni_method = >>> { (char*)"testNative", >>> (char*)"()V", >>> (void*)&TestNative }; >>> env->RegisterNatives(cls, &jni_method, 1); >>> if (env->ExceptionCheck()) env->ExceptionDescribe(); >>> } >>> >>> void Test() { >>> // URL[] urls = {new URL(url)} >>> jclass cls = env->FindClass("java/net/URL"); >>> jmethodID method = env->GetMethodID(cls, "", >>> "(Ljava/lang/String;)V"); >>> jstring jurl_str = env->NewStringUTF(loader_url); >>> jobject jurl = env->NewObject(cls, method, jurl_str); >>> jobjectArray jurls = env->NewObjectArray(1, cls, jurl); >>> >>> // URLClassLoader loader = new URLClassLoaer(urls) >>> cls = env->FindClass("java/net/URLClassLoader"); >>> method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); >>> jobject jloader = env->NewObject(cls, method, jurls); >>> >>> // Class cls = loader.loadClass(name) >>> method = env->GetMethodID( >>> cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); >>> jstring jname = env->NewStringUTF(class_name); >>> cls = (jclass)env->CallObjectMethod(jloader, method, jname, >>> (jboolean) >>> true); >>> >>> method = env->GetMethodID(cls, "", "()V"); >>> if (env->ExceptionCheck()) env->ExceptionDescribe(); >>> >>> // RegisterNatives must be called after GetMethodID. >>> // If the order is reversed, we get UnsatisfiedLinkError, >>> // which seems like a bug. >>> RegisterNativeMethod(cls); >>> >>> env->NewObject(cls, method); >>> if (env->ExceptionCheck()) env->ExceptionDescribe(); >>> } >>> >>> int main(int argc, char** argv) { >>> InitializeJVM(); >>> Test(); >>> >>> return 0; >>> } >>> -------------------------- >>> My class loader is sun.misc.Launcher$AppClassLoader at 1f7182c1 >>> Successfully called registered native method >>> back to Java >>> >>> Thanks, >>> >>> Martin >> From Ulf.Zibis at gmx.de Wed Jun 9 20:06:10 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Wed, 09 Jun 2010 22:06:10 +0200 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: <4C0F63DD.9030509@redhat.com> References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> <82ocfkn194.fsf@mid.bfk.de> <4C0F63DD.9030509@redhat.com> Message-ID: <4C0FF432.6020709@gmx.de> Am 09.06.2010 11:50, schrieb Andrew Haley: > On 09/06/10 10:11, Andrew John Hughes wrote: > >> On 9 June 2010 07:55, Florian Weimer wrote: >> >>> * Andrew John Hughes: >>> >>> >>>> On 7 June 2010 23:04, Xueming Shen wrote: >>>> >>>>> Hi Andrew, >>>>> >>>>> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in >>>>> sun/nio/cs due to the use of -Werror >>>>> >>>>> (1)sun/io/ByteTocharISO2022JP.java >>>>> #129, #151 >>>>> >>>>> if ((byte1& (byte)0x80) != 0){ >>>>> >>>>> if ((byte2& (byte)0x80) != 0){ >>>>> >>>>> >>>>> (byte) casting is not necessary as well? >>>>> >>>>> >>>> It's necessary. 0x80 is an integer literal >>>> (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) >>>> which requires a lossy narrowing conversion to byte >>>> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) >>>> >>> Doesn't the& operator promote its arguments to int anyway? I don't >>> think the cast to byte makes a difference here because it does not >>> matter if 0x80 is sign-extended or zero-extended. >>> >>> It might be more efficient to use "byte1< 0" and "byte2< 0" instead. >>> > This code may be in a critical performance-related place. It's quite > possible that it's done this way because the JIT compiles it very well. > > So, best not to change it without knowing what the effect is. IMO performance of sun.io coders is not that important, as they are kinda deprecated. On the other hand, we could avoid twiddling here, as there are wrappers, which would significantly reduce JDK's footprint: https://java-nio-charset-enhanced.dev.java.net/source/browse/java-nio-charset-enhanced/tags/milestone2/src/sun/io/ See thread: http://mail.openjdk.java.net/pipermail/core-libs-dev/2008-September/000678.html -Ulf From David.Holmes at oracle.com Wed Jun 9 22:48:06 2010 From: David.Holmes at oracle.com (David Holmes) Date: Thu, 10 Jun 2010 08:48:06 +1000 Subject: Must call RegisterNatives after getMethodID, else get UnsatisfiedLinkError In-Reply-To: <6865BD5B-7A89-48DA-94BD-D75B6E60B673@oracle.com> References: <4C0F6C02.1070404@oracle.com> <6865BD5B-7A89-48DA-94BD-D75B6E60B673@oracle.com> Message-ID: <4C101A26.70806@oracle.com> Kelly O'Hair said the following on 06/10/10 05:52: > It's been a while since I worked with this stuff, but I would have done a: > > jclass cls = env->FindClass("Test"); > > Which, if I recall, FindClass actually initializes the class. Yes but in this case they are actually creating their own classloader from native code and using that to load the target class. Of course in theory they could still load it in a such a way that the class is also initialized, but it might not be appropriate for class initialization to occur at this time - hence the approach taken. Cheers, David > Just a stab in the dark. > > -kto > > > On Jun 9, 2010, at 12:39 PM, Martin Buchholz wrote: > >> David, Thanks for the bug archaeology. Judging by the other >> commenters, this bug is a regression from jdk5, and has cost many >> other users hours of frustrating debugging time, so I think an >> increase to P2 is in order. Since it used to work, it shouldn't be >> too hard to fix - all you need to do is to properly track registered >> native methods. >> >> Sorry for not doing this kind of research myself - it's just too >> painful without my beloved jbugs script :-( >> >> Here's an improved version of our test case, with >> -XX:+PrintJNIResolving output added, >> that you might add to the bug report. >> >> $ cat Test.java; echo ---------------------; cat jvm.cc; echo >> --------------------------; JDK=`jver 1.7.0-b96`; g++ -I$JDK/include >> -I$JDK/include/linux -ldl -DJDK=\"$JDK\" jvm.cc && ./a.out >> public class Test { >> public Test() { >> System.out.println("My class loader is " + >> getClass().getClassLoader()); >> testNative(); >> System.out.println("back to Java"); >> } >> public static native void testNative(); >> } >> --------------------- >> #include >> #include >> #include >> #include >> >> JavaVM* jvm; >> JNIEnv* env; >> const char* libjvm = JDK "/jre/lib/amd64/server/libjvm.so"; >> const char* loader_url = "file://./"; >> const char* class_name = "Test"; >> >> #define countof(array) (sizeof(array)/sizeof(array[0])) >> >> void InitializeJVM() { >> JavaVMOption options[] = { >> { (char*)"-Djava.class.path=.", NULL }, >> { (char*)"-XX:+PrintJNIResolving", NULL }, >> //{ (char*)"-verbose:jni", NULL }, >> }; >> >> JavaVMInitArgs vm_args; >> vm_args.version = JNI_VERSION_1_2; >> vm_args.options = options; >> vm_args.nOptions = countof(options); >> vm_args.ignoreUnrecognized = JNI_TRUE; >> >> void* handle = dlopen(libjvm, RTLD_LAZY); >> if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(1); } >> >> jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = >> reinterpret_cast >> (dlsym(handle, "JNI_CreateJavaVM")); >> if (!func_create_java_vm) { fprintf(stderr, "%s\n", dlerror()); >> exit(1); } >> >> jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); >> } >> >> void TestNative(JNIEnv* env, jclass cls) { >> printf("Successfully called registered native method\n"); >> } >> >> void RegisterNativeMethod(jclass cls) { >> static const JNINativeMethod jni_method = >> { (char*)"testNative", >> (char*)"()V", >> (void*)&TestNative }; >> env->RegisterNatives(cls, &jni_method, 1); >> if (env->ExceptionCheck()) env->ExceptionDescribe(); >> } >> >> void Test() { >> // URL[] urls = {new URL(url)} >> jclass cls = env->FindClass("java/net/URL"); >> jmethodID method = env->GetMethodID(cls, "", >> "(Ljava/lang/String;)V"); >> jstring jurl_str = env->NewStringUTF(loader_url); >> jobject jurl = env->NewObject(cls, method, jurl_str); >> jobjectArray jurls = env->NewObjectArray(1, cls, jurl); >> >> // URLClassLoader loader = new URLClassLoaer(urls) >> cls = env->FindClass("java/net/URLClassLoader"); >> method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); >> jobject jloader = env->NewObject(cls, method, jurls); >> >> // Class cls = loader.loadClass(name) >> method = env->GetMethodID( >> cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); >> jstring jname = env->NewStringUTF(class_name); >> cls = (jclass)env->CallObjectMethod(jloader, method, jname, >> (jboolean) true); >> >> // RegisterNatives must be called after GetMethodID. >> // If the order is reversed, we get UnsatisfiedLinkError, >> // which seems like a bug. >> RegisterNativeMethod(cls); >> >> method = env->GetMethodID(cls, "", "()V"); >> if (env->ExceptionCheck()) env->ExceptionDescribe(); >> >> env->NewObject(cls, method); >> if (env->ExceptionCheck()) env->ExceptionDescribe(); >> } >> >> int main(int argc, char** argv) { >> InitializeJVM(); >> Test(); >> >> return 0; >> } >> -------------------------- >> [Dynamic-linking native method java.lang.Object.registerNatives ... JNI] >> [Registering JNI native method java.lang.Object.hashCode] >> [Registering JNI native method java.lang.Object.wait] >> [Registering JNI native method java.lang.Object.notify] >> [Registering JNI native method java.lang.Object.notifyAll] >> [Registering JNI native method java.lang.Object.clone] >> [Dynamic-linking native method java.lang.System.registerNatives ... JNI] >> [Registering JNI native method java.lang.System.currentTimeMillis] >> [Registering JNI native method java.lang.System.nanoTime] >> [Registering JNI native method java.lang.System.arraycopy] >> [Dynamic-linking native method java.lang.Thread.registerNatives ... JNI] >> [Registering JNI native method java.lang.Thread.start0] >> [Registering JNI native method java.lang.Thread.stop0] >> [Registering JNI native method java.lang.Thread.isAlive] >> [Registering JNI native method java.lang.Thread.suspend0] >> [Registering JNI native method java.lang.Thread.resume0] >> [Registering JNI native method java.lang.Thread.setPriority0] >> [Registering JNI native method java.lang.Thread.yield] >> [Registering JNI native method java.lang.Thread.sleep] >> [Registering JNI native method java.lang.Thread.currentThread] >> [Registering JNI native method java.lang.Thread.countStackFrames] >> [Registering JNI native method java.lang.Thread.interrupt0] >> [Registering JNI native method java.lang.Thread.isInterrupted] >> [Registering JNI native method java.lang.Thread.holdsLock] >> [Registering JNI native method java.lang.Thread.getThreads] >> [Registering JNI native method java.lang.Thread.dumpThreads] >> [Dynamic-linking native method >> java.security.AccessController.getStackAccessControlContext ... JNI] >> [Dynamic-linking native method >> java.security.AccessController.getInheritedAccessControlContext ... >> JNI] >> [Dynamic-linking native method java.lang.ClassLoader.registerNatives >> ... JNI] >> [Registering JNI native method java.lang.ClassLoader.retrieveDirectives] >> [Dynamic-linking native method >> java.security.AccessController.doPrivileged ... JNI] >> [Dynamic-linking native method java.lang.Class.registerNatives ... JNI] >> [Registering JNI native method java.lang.Class.getName0] >> [Registering JNI native method java.lang.Class.getSuperclass] >> [Registering JNI native method java.lang.Class.getInterfaces] >> [Registering JNI native method java.lang.Class.getClassLoader0] >> [Registering JNI native method java.lang.Class.isInterface] >> [Registering JNI native method java.lang.Class.getSigners] >> [Registering JNI native method java.lang.Class.setSigners] >> [Registering JNI native method java.lang.Class.isArray] >> [Registering JNI native method java.lang.Class.isPrimitive] >> [Registering JNI native method java.lang.Class.getComponentType] >> [Registering JNI native method java.lang.Class.getModifiers] >> [Registering JNI native method java.lang.Class.getDeclaredFields0] >> [Registering JNI native method java.lang.Class.getDeclaredMethods0] >> [Registering JNI native method java.lang.Class.getDeclaredConstructors0] >> [Registering JNI native method java.lang.Class.getProtectionDomain0] >> [Registering JNI native method java.lang.Class.setProtectionDomain0] >> [Registering JNI native method java.lang.Class.getDeclaredClasses0] >> [Registering JNI native method java.lang.Class.getDeclaringClass] >> [Registering JNI native method java.lang.Class.getGenericSignature] >> [Registering JNI native method java.lang.Class.getRawAnnotations] >> [Registering JNI native method java.lang.Class.getConstantPool] >> [Registering JNI native method java.lang.Class.desiredAssertionStatus0] >> [Registering JNI native method java.lang.Class.getEnclosingMethod0] >> [Dynamic-linking native method java.lang.Class.getPrimitiveClass ... JNI] >> [Dynamic-linking native method java.lang.System.initProperties ... JNI] >> [Dynamic-linking native method sun.misc.Unsafe.registerNatives ... JNI] >> [Registering JNI native method sun.misc.Unsafe.getLoadAverage] >> [Dynamic-linking native method java.lang.Throwable.fillInStackTrace >> ... JNI] >> [Registering JNI native method sun.misc.Unsafe.copyMemory] >> [Registering JNI native method sun.misc.Unsafe.setMemory] >> [Registering JNI native method sun.misc.Unsafe.getObject] >> [Registering JNI native method sun.misc.Unsafe.putObject] >> [Registering JNI native method sun.misc.Unsafe.getObjectVolatile] >> [Registering JNI native method sun.misc.Unsafe.putObjectVolatile] >> [Registering JNI native method sun.misc.Unsafe.getBoolean] >> [Registering JNI native method sun.misc.Unsafe.putBoolean] >> [Registering JNI native method sun.misc.Unsafe.getBooleanVolatile] >> [Registering JNI native method sun.misc.Unsafe.putBooleanVolatile] >> [Registering JNI native method sun.misc.Unsafe.getByte] >> [Registering JNI native method sun.misc.Unsafe.putByte] >> [Registering JNI native method sun.misc.Unsafe.getByteVolatile] >> [Registering JNI native method sun.misc.Unsafe.putByteVolatile] >> [Registering JNI native method sun.misc.Unsafe.getShort] >> [Registering JNI native method sun.misc.Unsafe.putShort] >> [Registering JNI native method sun.misc.Unsafe.getShortVolatile] >> [Registering JNI native method sun.misc.Unsafe.putShortVolatile] >> [Registering JNI native method sun.misc.Unsafe.getChar] >> [Registering JNI native method sun.misc.Unsafe.putChar] >> [Registering JNI native method sun.misc.Unsafe.getCharVolatile] >> [Registering JNI native method sun.misc.Unsafe.putCharVolatile] >> [Registering JNI native method sun.misc.Unsafe.getInt] >> [Registering JNI native method sun.misc.Unsafe.putInt] >> [Registering JNI native method sun.misc.Unsafe.getIntVolatile] >> [Registering JNI native method sun.misc.Unsafe.putIntVolatile] >> [Registering JNI native method sun.misc.Unsafe.getLong] >> [Registering JNI native method sun.misc.Unsafe.putLong] >> [Registering JNI native method sun.misc.Unsafe.getLongVolatile] >> [Registering JNI native method sun.misc.Unsafe.putLongVolatile] >> [Registering JNI native method sun.misc.Unsafe.getFloat] >> [Registering JNI native method sun.misc.Unsafe.putFloat] >> [Registering JNI native method sun.misc.Unsafe.getFloatVolatile] >> [Registering JNI native method sun.misc.Unsafe.putFloatVolatile] >> [Registering JNI native method sun.misc.Unsafe.getDouble] >> [Registering JNI native method sun.misc.Unsafe.putDouble] >> [Registering JNI native method sun.misc.Unsafe.getDoubleVolatile] >> [Registering JNI native method sun.misc.Unsafe.putDoubleVolatile] >> [Registering JNI native method sun.misc.Unsafe.getByte] >> [Registering JNI native method sun.misc.Unsafe.putByte] >> [Registering JNI native method sun.misc.Unsafe.getShort] >> [Registering JNI native method sun.misc.Unsafe.putShort] >> [Registering JNI native method sun.misc.Unsafe.getChar] >> [Registering JNI native method sun.misc.Unsafe.putChar] >> [Registering JNI native method sun.misc.Unsafe.getInt] >> [Registering JNI native method sun.misc.Unsafe.putInt] >> [Registering JNI native method sun.misc.Unsafe.getLong] >> [Registering JNI native method sun.misc.Unsafe.putLong] >> [Registering JNI native method sun.misc.Unsafe.getFloat] >> [Registering JNI native method sun.misc.Unsafe.putFloat] >> [Registering JNI native method sun.misc.Unsafe.getDouble] >> [Registering JNI native method sun.misc.Unsafe.putDouble] >> [Registering JNI native method sun.misc.Unsafe.getAddress] >> [Registering JNI native method sun.misc.Unsafe.putAddress] >> [Registering JNI native method sun.misc.Unsafe.allocateMemory] >> [Registering JNI native method sun.misc.Unsafe.reallocateMemory] >> [Registering JNI native method sun.misc.Unsafe.freeMemory] >> [Registering JNI native method sun.misc.Unsafe.objectFieldOffset] >> [Registering JNI native method sun.misc.Unsafe.staticFieldOffset] >> [Registering JNI native method sun.misc.Unsafe.staticFieldBase] >> [Registering JNI native method sun.misc.Unsafe.ensureClassInitialized] >> [Registering JNI native method sun.misc.Unsafe.arrayBaseOffset] >> [Registering JNI native method sun.misc.Unsafe.arrayIndexScale] >> [Registering JNI native method sun.misc.Unsafe.addressSize] >> [Registering JNI native method sun.misc.Unsafe.pageSize] >> [Registering JNI native method sun.misc.Unsafe.defineClass] >> [Registering JNI native method sun.misc.Unsafe.defineClass] >> [Registering JNI native method sun.misc.Unsafe.allocateInstance] >> [Registering JNI native method sun.misc.Unsafe.monitorEnter] >> [Registering JNI native method sun.misc.Unsafe.monitorExit] >> [Registering JNI native method sun.misc.Unsafe.tryMonitorEnter] >> [Registering JNI native method sun.misc.Unsafe.throwException] >> [Registering JNI native method sun.misc.Unsafe.compareAndSwapObject] >> [Registering JNI native method sun.misc.Unsafe.compareAndSwapInt] >> [Registering JNI native method sun.misc.Unsafe.compareAndSwapLong] >> [Registering JNI native method sun.misc.Unsafe.putOrderedObject] >> [Registering JNI native method sun.misc.Unsafe.putOrderedInt] >> [Registering JNI native method sun.misc.Unsafe.putOrderedLong] >> [Registering JNI native method sun.misc.Unsafe.park] >> [Registering JNI native method sun.misc.Unsafe.unpark] >> [Dynamic-linking native method java.lang.Float.floatToRawIntBits ... JNI] >> [Dynamic-linking native method java.lang.Double.doubleToRawLongBits >> ... JNI] >> [Dynamic-linking native method sun.reflect.Reflection.getCallerClass >> ... JNI] >> [Dynamic-linking native method java.lang.String.intern ... JNI] >> [Dynamic-linking native method java.lang.Object.getClass ... JNI] >> [Dynamic-linking native method java.lang.Class.forName0 ... JNI] >> [Dynamic-linking native method >> sun.reflect.Reflection.getClassAccessFlags ... JNI] >> [Dynamic-linking native method >> sun.reflect.NativeConstructorAccessorImpl.newInstance0 ... JNI] >> [Dynamic-linking native method sun.misc.VM.initialize ... JNI] >> [Dynamic-linking native method java.io.FileSystem.getFileSystem ... JNI] >> [Dynamic-linking native method java.io.UnixFileSystem.initIDs ... JNI] >> [Dynamic-linking native method java.lang.System.mapLibraryName ... JNI] >> [Dynamic-linking native method >> java.io.UnixFileSystem.getBooleanAttributes0 ... JNI] >> [Dynamic-linking native method java.io.UnixFileSystem.canonicalize0 >> ... JNI] >> [Dynamic-linking native method >> java.lang.ClassLoader$NativeLibrary.load ... JNI] >> [Dynamic-linking native method java.io.FileInputStream.initIDs ... JNI] >> [Dynamic-linking native method java.io.FileDescriptor.initIDs ... JNI] >> [Dynamic-linking native method java.io.FileOutputStream.initIDs ... JNI] >> [Dynamic-linking native method java.lang.System.setIn0 ... JNI] >> [Dynamic-linking native method java.lang.System.setOut0 ... JNI] >> [Dynamic-linking native method java.lang.System.setErr0 ... JNI] >> [Dynamic-linking native method sun.misc.Signal.findSignal ... JNI] >> [Dynamic-linking native method sun.misc.Signal.handle0 ... JNI] >> [Dynamic-linking native method java.lang.Runtime.maxMemory ... JNI] >> [Dynamic-linking native method java.lang.Compiler.registerNatives ... >> JNI] >> [Registering JNI native method java.lang.Compiler.compileClass] >> [Registering JNI native method java.lang.Compiler.compileClasses] >> [Registering JNI native method java.lang.Compiler.command] >> [Registering JNI native method java.lang.Compiler.enable] >> [Registering JNI native method java.lang.Compiler.disable] >> [Dynamic-linking native method java.lang.ClassLoader.getCaller ... JNI] >> [Dynamic-linking native method >> java.lang.ClassLoader$NativeLibrary.find ... JNI] >> [Dynamic-linking native method >> java.security.AccessController.doPrivileged ... JNI] >> [Dynamic-linking native method java.io.FileInputStream.open ... JNI] >> [Dynamic-linking native method java.io.FileInputStream.readBytes ... JNI] >> [Dynamic-linking native method java.io.FileInputStream.available ... JNI] >> [Dynamic-linking native method java.lang.reflect.Array.newArray ... JNI] >> [Dynamic-linking native method java.io.FileInputStream.close0 ... JNI] >> [Dynamic-linking native method java.io.UnixFileSystem.list ... JNI] >> [Dynamic-linking native method java.lang.ClassLoader.findLoadedClass0 >> ... JNI] >> [Dynamic-linking native method >> java.lang.ClassLoader.findBootstrapClass ... JNI] >> [Dynamic-linking native method >> java.security.AccessController.doPrivileged ... JNI] >> [Dynamic-linking native method java.io.UnixFileSystem.getLength ... JNI] >> [Dynamic-linking native method sun.misc.Perf.registerNatives ... JNI] >> [Registering JNI native method sun.misc.Perf.attach] >> [Registering JNI native method sun.misc.Perf.detach] >> [Registering JNI native method sun.misc.Perf.createLong] >> [Registering JNI native method sun.misc.Perf.createByteArray] >> [Registering JNI native method sun.misc.Perf.highResCounter] >> [Registering JNI native method sun.misc.Perf.highResFrequency] >> [Dynamic-linking native method java.lang.ClassLoader.defineClass1 ... >> JNI] >> [Dynamic-linking native method java.lang.ClassLoader.resolveClass0 ... >> JNI] >> [Registering JNI native method Test.testNative] >> [Dynamic-linking native method java.io.FileOutputStream.writeBytes ... >> JNI] >> My class loader is sun.misc.Launcher$AppClassLoader at b92d342 >> Exception in thread "main" java.lang.UnsatisfiedLinkError: >> Test.testNative()V >> [Dynamic-linking native method java.lang.Throwable.getStackTraceDepth >> ... JNI] >> [Dynamic-linking native method >> java.lang.Throwable.getStackTraceElement ... JNI] >> at Test.testNative(Native Method) >> at Test.(Test.java:4) >> >> Martin >> >> On Wed, Jun 9, 2010 at 03:25, David Holmes >> wrote: >>> Hi Martin, >>> >>> Turns out this is a known (and old) issue (thanks Yuri!): >>> >>> CR 6493522 "JNI_RegisterNatives fails to bind a method of an >>> uninitialized >>> class" >>> >>> I'll add this email info to the CR. >>> >>> David >>> >>> Martin Buchholz said the following on 06/09/10 09:12: >>>> >>>> Hi ClassLoader maintainers, >>>> >>>> This is a bug report. >>>> >>>> (I think this is a hotspot bug, but it might be a core library >>>> ClassLoader bug or even a URLClassLoader bug) >>>> >>>> If you use RegisterNatives with a class loaded using URLClassLoader, >>>> you must call GetMethodID >>>> before RegisterNatives, or you get an UnsatisfiedLinkError as in the >>>> test case below >>>> >>>> (you will need to edit the below to fill in the location of your jni >>>> include directory and your libjvm.so) >>>> >>>> $ cat Test.java; echo ---------------------; cat jvm.cc; echo >>>> --------------------------; g++ -I$JDK/include -I$JDK/include/linux >>>> -ldl jvm.cc && ./a.out >>>> public class Test { >>>> public Test() { >>>> System.out.println("My class loader is " + >>>> getClass().getClassLoader()); >>>> testNative(); >>>> System.out.println("back to Java"); >>>> } >>>> public static native void testNative(); >>>> } >>>> --------------------- >>>> #include >>>> #include >>>> #include >>>> >>>> JavaVM* jvm; >>>> JNIEnv* env; >>>> const char* libjvm = >>>> "$JDKDIR/libjvm.so"; >>>> const char* loader_url = "file://./"; >>>> const char* class_name = "Test"; >>>> >>>> void InitializeJVM() { >>>> JavaVMOption options[1]; >>>> options[0].optionString = (char*)"-Djava.class.path=."; >>>> //options[1].optionString = (char*)"-verbose:jni"; >>>> >>>> JavaVMInitArgs vm_args; >>>> vm_args.version = JNI_VERSION_1_2; >>>> vm_args.options = options; >>>> vm_args.nOptions = 2; >>>> vm_args.ignoreUnrecognized = JNI_TRUE; >>>> >>>> void* handle = dlopen(libjvm, RTLD_LAZY); >>>> if (handle == NULL) perror("dlopen"); >>>> jint JNICALL (*func_create_java_vm)(JavaVM**, void**, void*) = >>>> reinterpret_cast >>>> (dlsym(handle, "JNI_CreateJavaVM")); >>>> if (func_create_java_vm == NULL) perror("dlsym"); >>>> jint result = (*func_create_java_vm)(&jvm, (void**)(&env), &vm_args); >>>> } >>>> >>>> void TestNative(JNIEnv* env, jclass cls) { >>>> printf("Successfully called registered native method\n"); >>>> } >>>> >>>> void RegisterNativeMethod(jclass cls) { >>>> static const JNINativeMethod jni_method = >>>> { (char*)"testNative", >>>> (char*)"()V", >>>> (void*)&TestNative }; >>>> env->RegisterNatives(cls, &jni_method, 1); >>>> if (env->ExceptionCheck()) env->ExceptionDescribe(); >>>> } >>>> >>>> void Test() { >>>> // URL[] urls = {new URL(url)} >>>> jclass cls = env->FindClass("java/net/URL"); >>>> jmethodID method = env->GetMethodID(cls, "", >>>> "(Ljava/lang/String;)V"); >>>> jstring jurl_str = env->NewStringUTF(loader_url); >>>> jobject jurl = env->NewObject(cls, method, jurl_str); >>>> jobjectArray jurls = env->NewObjectArray(1, cls, jurl); >>>> >>>> // URLClassLoader loader = new URLClassLoaer(urls) >>>> cls = env->FindClass("java/net/URLClassLoader"); >>>> method = env->GetMethodID(cls, "", "([Ljava/net/URL;)V"); >>>> jobject jloader = env->NewObject(cls, method, jurls); >>>> >>>> // Class cls = loader.loadClass(name) >>>> method = env->GetMethodID( >>>> cls, "loadClass", "(Ljava/lang/String;Z)Ljava/lang/Class;"); >>>> jstring jname = env->NewStringUTF(class_name); >>>> cls = (jclass)env->CallObjectMethod(jloader, method, jname, (jboolean) >>>> true); >>>> >>>> method = env->GetMethodID(cls, "", "()V"); >>>> if (env->ExceptionCheck()) env->ExceptionDescribe(); >>>> >>>> // RegisterNatives must be called after GetMethodID. >>>> // If the order is reversed, we get UnsatisfiedLinkError, >>>> // which seems like a bug. >>>> RegisterNativeMethod(cls); >>>> >>>> env->NewObject(cls, method); >>>> if (env->ExceptionCheck()) env->ExceptionDescribe(); >>>> } >>>> >>>> int main(int argc, char** argv) { >>>> InitializeJVM(); >>>> Test(); >>>> >>>> return 0; >>>> } >>>> -------------------------- >>>> My class loader is sun.misc.Launcher$AppClassLoader at 1f7182c1 >>>> Successfully called registered native method >>>> back to Java >>>> >>>> Thanks, >>>> >>>> Martin >>> > From maurizio.cimadamore at oracle.com Thu Jun 10 08:33:48 2010 From: maurizio.cimadamore at oracle.com (maurizio.cimadamore at oracle.com) Date: Thu, 10 Jun 2010 08:33:48 +0000 Subject: hg: jdk7/tl/langtools: 6945418: Project Coin: Simplified Varargs Method Invocation Message-ID: <20100610083350.5ACE0470D3@hg.openjdk.java.net> Changeset: 46cf751559ae Author: mcimadamore Date: 2010-06-10 09:29 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/46cf751559ae 6945418: Project Coin: Simplified Varargs Method Invocation Summary: Add new mandatory warning for unsafe vararg method declaration. Warning can be suppressed as usual (@SuppressWarnings("varargs")/-Xlint:-varargs) Reviewed-by: jjg, darcy ! src/share/classes/com/sun/tools/javac/code/Lint.java ! src/share/classes/com/sun/tools/javac/comp/Attr.java ! src/share/classes/com/sun/tools/javac/comp/Check.java ! src/share/classes/com/sun/tools/javac/comp/Infer.java ! src/share/classes/com/sun/tools/javac/comp/Resolve.java ! src/share/classes/com/sun/tools/javac/resources/compiler.properties ! src/share/classes/com/sun/tools/javac/util/List.java ! test/tools/javac/varargs/6730476/T6730476a.java ! test/tools/javac/varargs/6806876/T6806876.out + test/tools/javac/varargs/warning/Warn4.java From mandy.chung at oracle.com Thu Jun 10 21:21:54 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Thu, 10 Jun 2010 21:21:54 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100610212214.3C53B470F4@hg.openjdk.java.net> Changeset: 1474dfa499e3 Author: mchung Date: 2010-06-10 14:14 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/1474dfa499e3 6959965: jstat: Add new -classload option to print class loading statistics Summary: Add a new jstat -classload option Reviewed-by: alanb ! make/sun/tools/Makefile ! src/share/classes/sun/tools/jstat/Arguments.java ! src/share/classes/sun/tools/jstat/OptionFinder.java ! src/share/classes/sun/tools/jstat/OptionLister.java ! src/share/classes/sun/tools/jstat/resources/jstat_options + src/share/classes/sun/tools/jstat/resources/jstat_unsupported_options + test/sun/tools/jstat/classloadOutput1.awk + test/sun/tools/jstat/jstatClassloadOutput1.sh ! test/sun/tools/jstat/jstatOptions1.sh + test/sun/tools/jstat/options2.out Changeset: af827b7eb81d Author: mchung Date: 2010-06-10 14:21 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/af827b7eb81d Merge From ahughes at redhat.com Thu Jun 10 21:35:16 2010 From: ahughes at redhat.com (Andrew John Hughes) Date: Thu, 10 Jun 2010 22:35:16 +0100 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: <4C0FCDC6.9040508@oracle.com> References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> <82ocfkn194.fsf@mid.bfk.de> <4C0FCDC6.9040508@oracle.com> Message-ID: On 9 June 2010 18:22, Xueming Shen wrote: > Andrew John Hughes wrote: >> >> On 9 June 2010 07:55, Florian Weimer wrote: >> >>> >>> * Andrew John Hughes: >>> >>> >>>> >>>> On 7 June 2010 23:04, Xueming Shen wrote: >>>> >>>>> >>>>> Hi Andrew, >>>>> >>>>> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in >>>>> sun/nio/cs due to the use of -Werror >>>>> >>>>> (1)sun/io/ByteTocharISO2022JP.java >>>>> ?#129, ?#151 >>>>> >>>>> ?if ((byte1 & (byte)0x80) != 0){ >>>>> >>>>> ? ? ?if ((byte2 & (byte)0x80) != 0){ >>>>> >>>>> >>>>> (byte) casting is not necessary as well? >>>>> >>>>> >>>> >>>> It's necessary. ?0x80 is an integer literal >>>> >>>> (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) >>>> which requires a lossy narrowing conversion to byte >>>> >>>> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) >>>> >>> >>> Doesn't the & operator promote its arguments to int anyway? ?I don't >>> think the cast to byte makes a difference here because it does not >>> matter if 0x80 is sign-extended or zero-extended. >>> >>> It might be more efficient to use "byte1 < 0" and "byte2 < 0" instead. >>> >>> >> >> You're right. ?I think I mentally read that as an assignment, not an >> and operation. >> >> If I'm reading it right now, it would seem to just be testing the sign >> bit. ?byte1 < 0 would be clearer if not faster, and I'd be for >> changing that, though that probably should be a separate patch. >> >> Sherman, does the new webrev look ok to push? >> >> > > (1)ByteToCharJISAutoDetect.java > ? It appears we should move the maskTable1/2 initialization code out of the > constructor block. > > ?37 ? ? private static byte[] maskTable1 = JISAutoDetect.getByteMask1(); > ?38 ? ? private static byte[] maskTable2 = JISAutoDetect.getByteMask2(); > Done. I also made them final. > (2)EUC_JP_Open.java > > 137 ? ? ? ? ? ? j0208Index1 = JIS_X_0208_Solaris_Encoder.getIndex1(); > 138 ? ? ? ? ? ? j0208Index2 = JIS_X_0208_Solaris_Encoder.getIndex2(); > > ?can be moved out of the constructor as you do for the decoder. better to > ?keep them consistent (as well as the code in EUC_JP_LINUX) > Done. I made both sets private, static and final as well, and updated EUC_JP, EUC_JP_LINUX, PCK and SJIS in the same way. > > (3)sun/nio/cs/ext/HKSCS.java > > - ? ? ? ? ? ?this.big5Dec = big5Dec; > + ? ? ? ? ? ?Decoder.big5Dec = big5Dec; > > Dave is absolutely right here. big5Dec definitely should be an instance > field instead of static, it's my bug in the original code. It should be > > ? ? ? ?private DoubleByte.Decoder big5Dec; > > ? ? ? ?protected Decoder(Charset cs, > ? ? ? ? ? ? ? ? ? ? ? ? ?DoubleByte.Decoder big5Dec, > ? ? ? ? ? ? ? ? ? ? ? ? ?char[][] b2cBmp, char[][] b2cSupp) > ? ? ? ?{ > ? ? ? ? ? ?// super(cs, 0.5f, 1.0f); > ? ? ? ? ? ?// need to extends DoubleByte.Decoder so the > ? ? ? ? ? ?// sun.io can use it. this implementation > ? ? ? ? ? ?super(cs, 0.5f, 1.0f, null, null, 0, 0); > ? ? ? ? ? ?this.big5Dec = big5Dec; > ? ? ? ? ? ?this.b2cBmp = b2cBmp; > ? ? ? ? ? ?this.b2cSupp = b2cSupp; > ? ? ? ?} > Cool. One latent bug fixed too :-) > > Thanks, > Sherman > > > > > New webrev: http://cr.openjdk.java.net/~andrew/warnings/webrev.05/ Ok to push? Thanks, -- Andrew :-) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 From xueming.shen at oracle.com Thu Jun 10 22:11:06 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Thu, 10 Jun 2010 15:11:06 -0700 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> <82ocfkn194.fsf@mid.bfk.de> <4C0FCDC6.9040508@oracle.com> Message-ID: <4C1162FA.8000808@oracle.com> Andrew, Thanks for working on it. The change looks fine, except one final nit:-) EUC_JP_Open: #127 & #140 it appears encoderJ0208 is no longer needed. Please run those tests at sun/nio/cs before push, I don't really trust my own eyes these days:-) Sherman Andrew John Hughes wrote: > On 9 June 2010 18:22, Xueming Shen wrote: > >> Andrew John Hughes wrote: >> >>> On 9 June 2010 07:55, Florian Weimer wrote: >>> >>> >>>> * Andrew John Hughes: >>>> >>>> >>>> >>>>> On 7 June 2010 23:04, Xueming Shen wrote: >>>>> >>>>> >>>>>> Hi Andrew, >>>>>> >>>>>> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in >>>>>> sun/nio/cs due to the use of -Werror >>>>>> >>>>>> (1)sun/io/ByteTocharISO2022JP.java >>>>>> #129, #151 >>>>>> >>>>>> if ((byte1 & (byte)0x80) != 0){ >>>>>> >>>>>> if ((byte2 & (byte)0x80) != 0){ >>>>>> >>>>>> >>>>>> (byte) casting is not necessary as well? >>>>>> >>>>>> >>>>>> >>>>> It's necessary. 0x80 is an integer literal >>>>> >>>>> (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) >>>>> which requires a lossy narrowing conversion to byte >>>>> >>>>> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) >>>>> >>>>> >>>> Doesn't the & operator promote its arguments to int anyway? I don't >>>> think the cast to byte makes a difference here because it does not >>>> matter if 0x80 is sign-extended or zero-extended. >>>> >>>> It might be more efficient to use "byte1 < 0" and "byte2 < 0" instead. >>>> >>>> >>>> >>> You're right. I think I mentally read that as an assignment, not an >>> and operation. >>> >>> If I'm reading it right now, it would seem to just be testing the sign >>> bit. byte1 < 0 would be clearer if not faster, and I'd be for >>> changing that, though that probably should be a separate patch. >>> >>> Sherman, does the new webrev look ok to push? >>> >>> >>> >> (1)ByteToCharJISAutoDetect.java >> It appears we should move the maskTable1/2 initialization code out of the >> constructor block. >> >> 37 private static byte[] maskTable1 = JISAutoDetect.getByteMask1(); >> 38 private static byte[] maskTable2 = JISAutoDetect.getByteMask2(); >> >> > > Done. I also made them final. > > >> (2)EUC_JP_Open.java >> >> 137 j0208Index1 = JIS_X_0208_Solaris_Encoder.getIndex1(); >> 138 j0208Index2 = JIS_X_0208_Solaris_Encoder.getIndex2(); >> >> can be moved out of the constructor as you do for the decoder. better to >> keep them consistent (as well as the code in EUC_JP_LINUX) >> >> > > Done. I made both sets private, static and final as well, and updated > EUC_JP, EUC_JP_LINUX, PCK and SJIS in the same way. > > >> (3)sun/nio/cs/ext/HKSCS.java >> >> - this.big5Dec = big5Dec; >> + Decoder.big5Dec = big5Dec; >> >> Dave is absolutely right here. big5Dec definitely should be an instance >> field instead of static, it's my bug in the original code. It should be >> >> private DoubleByte.Decoder big5Dec; >> >> protected Decoder(Charset cs, >> DoubleByte.Decoder big5Dec, >> char[][] b2cBmp, char[][] b2cSupp) >> { >> // super(cs, 0.5f, 1.0f); >> // need to extends DoubleByte.Decoder so the >> // sun.io can use it. this implementation >> super(cs, 0.5f, 1.0f, null, null, 0, 0); >> this.big5Dec = big5Dec; >> this.b2cBmp = b2cBmp; >> this.b2cSupp = b2cSupp; >> } >> >> > > Cool. One latent bug fixed too :-) > > > >> Thanks, >> Sherman >> >> >> >> >> >> > > New webrev: http://cr.openjdk.java.net/~andrew/warnings/webrev.05/ > > Ok to push? > > Thanks, > From jonathan.gibbons at oracle.com Thu Jun 10 23:08:30 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Thu, 10 Jun 2010 23:08:30 +0000 Subject: hg: jdk7/tl/langtools: 6944312: Potential rebranding issues in openjdk/langtools repository sources Message-ID: <20100610230832.0F335470FD@hg.openjdk.java.net> Changeset: f2fdd52e4e87 Author: jjg Date: 2010-06-10 16:08 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/f2fdd52e4e87 6944312: Potential rebranding issues in openjdk/langtools repository sources Reviewed-by: darcy ! src/share/classes/com/sun/javadoc/package.html ! src/share/classes/com/sun/mirror/overview.html ! src/share/classes/com/sun/source/tree/DisjointTypeTree.java ! src/share/classes/com/sun/tools/apt/comp/Apt.java ! src/share/classes/com/sun/tools/apt/main/CommandLine.java ! src/share/classes/com/sun/tools/apt/main/JavaCompiler.java ! src/share/classes/com/sun/tools/apt/main/Main.java ! src/share/classes/com/sun/tools/apt/util/Bark.java ! src/share/classes/com/sun/tools/classfile/AccessFlags.java ! src/share/classes/com/sun/tools/classfile/Annotation.java ! src/share/classes/com/sun/tools/classfile/AnnotationDefault_attribute.java ! src/share/classes/com/sun/tools/classfile/Attribute.java ! src/share/classes/com/sun/tools/classfile/AttributeException.java ! src/share/classes/com/sun/tools/classfile/Attributes.java ! src/share/classes/com/sun/tools/classfile/CharacterRangeTable_attribute.java ! src/share/classes/com/sun/tools/classfile/ClassFile.java ! src/share/classes/com/sun/tools/classfile/ClassReader.java ! src/share/classes/com/sun/tools/classfile/ClassTranslator.java ! src/share/classes/com/sun/tools/classfile/ClassWriter.java ! src/share/classes/com/sun/tools/classfile/Code_attribute.java ! src/share/classes/com/sun/tools/classfile/CompilationID_attribute.java ! src/share/classes/com/sun/tools/classfile/ConstantPool.java ! src/share/classes/com/sun/tools/classfile/ConstantPoolException.java ! src/share/classes/com/sun/tools/classfile/ConstantValue_attribute.java ! src/share/classes/com/sun/tools/classfile/DefaultAttribute.java ! src/share/classes/com/sun/tools/classfile/Deprecated_attribute.java ! src/share/classes/com/sun/tools/classfile/Descriptor.java ! src/share/classes/com/sun/tools/classfile/DescriptorException.java ! src/share/classes/com/sun/tools/classfile/EnclosingMethod_attribute.java ! src/share/classes/com/sun/tools/classfile/Exceptions_attribute.java ! src/share/classes/com/sun/tools/classfile/ExtendedAnnotation.java ! src/share/classes/com/sun/tools/classfile/Field.java ! src/share/classes/com/sun/tools/classfile/InnerClasses_attribute.java ! src/share/classes/com/sun/tools/classfile/Instruction.java ! src/share/classes/com/sun/tools/classfile/LineNumberTable_attribute.java ! src/share/classes/com/sun/tools/classfile/LocalVariableTable_attribute.java ! src/share/classes/com/sun/tools/classfile/LocalVariableTypeTable_attribute.java ! src/share/classes/com/sun/tools/classfile/Method.java ! src/share/classes/com/sun/tools/classfile/Opcode.java ! src/share/classes/com/sun/tools/classfile/RuntimeAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeInvisibleAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeInvisibleParameterAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeInvisibleTypeAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeParameterAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeTypeAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeVisibleAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeVisibleParameterAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/RuntimeVisibleTypeAnnotations_attribute.java ! src/share/classes/com/sun/tools/classfile/Signature.java ! src/share/classes/com/sun/tools/classfile/Signature_attribute.java ! src/share/classes/com/sun/tools/classfile/SourceDebugExtension_attribute.java ! src/share/classes/com/sun/tools/classfile/SourceFile_attribute.java ! src/share/classes/com/sun/tools/classfile/SourceID_attribute.java ! src/share/classes/com/sun/tools/classfile/StackMapTable_attribute.java ! src/share/classes/com/sun/tools/classfile/StackMap_attribute.java ! src/share/classes/com/sun/tools/classfile/Synthetic_attribute.java ! src/share/classes/com/sun/tools/classfile/Type.java ! src/share/classes/com/sun/tools/javac/Launcher.java ! src/share/classes/com/sun/tools/javac/Server.java ! src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java ! src/share/classes/com/sun/tools/javac/api/Formattable.java ! src/share/classes/com/sun/tools/javac/api/JavacScope.java ! src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java ! src/share/classes/com/sun/tools/javac/api/JavacTool.java ! src/share/classes/com/sun/tools/javac/api/JavacTrees.java ! src/share/classes/com/sun/tools/javac/api/Messages.java ! src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java ! src/share/classes/com/sun/tools/javac/code/Attribute.java ! src/share/classes/com/sun/tools/javac/code/BoundKind.java ! src/share/classes/com/sun/tools/javac/code/Flags.java ! src/share/classes/com/sun/tools/javac/code/Kinds.java ! src/share/classes/com/sun/tools/javac/code/Lint.java ! src/share/classes/com/sun/tools/javac/code/Printer.java ! src/share/classes/com/sun/tools/javac/code/Scope.java ! src/share/classes/com/sun/tools/javac/code/Source.java ! src/share/classes/com/sun/tools/javac/code/Symbol.java ! src/share/classes/com/sun/tools/javac/code/Symtab.java ! src/share/classes/com/sun/tools/javac/code/TargetType.java ! src/share/classes/com/sun/tools/javac/code/Type.java ! src/share/classes/com/sun/tools/javac/code/TypeAnnotationPosition.java ! src/share/classes/com/sun/tools/javac/code/TypeTags.java ! src/share/classes/com/sun/tools/javac/code/Types.java ! src/share/classes/com/sun/tools/javac/comp/Annotate.java ! src/share/classes/com/sun/tools/javac/comp/Attr.java ! src/share/classes/com/sun/tools/javac/comp/AttrContext.java ! src/share/classes/com/sun/tools/javac/comp/AttrContextEnv.java ! src/share/classes/com/sun/tools/javac/comp/Check.java ! src/share/classes/com/sun/tools/javac/comp/ConstFold.java ! src/share/classes/com/sun/tools/javac/comp/Enter.java ! src/share/classes/com/sun/tools/javac/comp/Env.java ! src/share/classes/com/sun/tools/javac/comp/Flow.java ! src/share/classes/com/sun/tools/javac/comp/Infer.java ! src/share/classes/com/sun/tools/javac/comp/Lower.java ! src/share/classes/com/sun/tools/javac/comp/MemberEnter.java ! src/share/classes/com/sun/tools/javac/comp/Resolve.java ! src/share/classes/com/sun/tools/javac/comp/Todo.java ! src/share/classes/com/sun/tools/javac/comp/TransTypes.java ! src/share/classes/com/sun/tools/javac/file/BaseFileObject.java ! src/share/classes/com/sun/tools/javac/file/CacheFSInfo.java ! src/share/classes/com/sun/tools/javac/file/FSInfo.java ! src/share/classes/com/sun/tools/javac/file/JavacFileManager.java ! src/share/classes/com/sun/tools/javac/file/Paths.java ! src/share/classes/com/sun/tools/javac/file/RegularFileObject.java ! src/share/classes/com/sun/tools/javac/file/RelativePath.java ! src/share/classes/com/sun/tools/javac/file/SymbolArchive.java ! src/share/classes/com/sun/tools/javac/file/ZipArchive.java ! src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java ! src/share/classes/com/sun/tools/javac/file/ZipFileIndexArchive.java ! src/share/classes/com/sun/tools/javac/jvm/ByteCodes.java ! src/share/classes/com/sun/tools/javac/jvm/CRTFlags.java ! src/share/classes/com/sun/tools/javac/jvm/CRTable.java ! src/share/classes/com/sun/tools/javac/jvm/ClassFile.java ! src/share/classes/com/sun/tools/javac/jvm/ClassReader.java ! src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java ! src/share/classes/com/sun/tools/javac/jvm/Code.java ! src/share/classes/com/sun/tools/javac/jvm/Gen.java ! src/share/classes/com/sun/tools/javac/jvm/Items.java ! src/share/classes/com/sun/tools/javac/jvm/Pool.java ! src/share/classes/com/sun/tools/javac/jvm/Target.java ! src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java ! src/share/classes/com/sun/tools/javac/main/CommandLine.java ! src/share/classes/com/sun/tools/javac/main/JavaCompiler.java ! src/share/classes/com/sun/tools/javac/main/JavacOption.java ! src/share/classes/com/sun/tools/javac/main/Main.java ! src/share/classes/com/sun/tools/javac/main/OptionName.java ! src/share/classes/com/sun/tools/javac/main/RecognizedOptions.java ! src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java ! src/share/classes/com/sun/tools/javac/model/FilteredMemberList.java ! src/share/classes/com/sun/tools/javac/model/JavacElements.java ! src/share/classes/com/sun/tools/javac/model/JavacSourcePosition.java ! src/share/classes/com/sun/tools/javac/model/JavacTypes.java ! src/share/classes/com/sun/tools/javac/nio/JavacPathFileManager.java ! src/share/classes/com/sun/tools/javac/nio/PathFileManager.java ! src/share/classes/com/sun/tools/javac/nio/PathFileObject.java ! src/share/classes/com/sun/tools/javac/parser/DocCommentScanner.java ! src/share/classes/com/sun/tools/javac/parser/EndPosParser.java ! src/share/classes/com/sun/tools/javac/parser/JavacParser.java ! src/share/classes/com/sun/tools/javac/parser/Keywords.java ! src/share/classes/com/sun/tools/javac/parser/Lexer.java ! src/share/classes/com/sun/tools/javac/parser/Parser.java ! src/share/classes/com/sun/tools/javac/parser/ParserFactory.java ! src/share/classes/com/sun/tools/javac/parser/Scanner.java ! src/share/classes/com/sun/tools/javac/parser/Token.java ! src/share/classes/com/sun/tools/javac/processing/AnnotationProcessingError.java ! src/share/classes/com/sun/tools/javac/processing/JavacFiler.java ! src/share/classes/com/sun/tools/javac/processing/JavacMessager.java ! src/share/classes/com/sun/tools/javac/processing/JavacProcessingEnvironment.java ! src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java ! src/share/classes/com/sun/tools/javac/processing/PrintingProcessor.java ! src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java ! src/share/classes/com/sun/tools/javac/sym/CreateSymbols.java ! src/share/classes/com/sun/tools/javac/tree/JCTree.java ! src/share/classes/com/sun/tools/javac/tree/Pretty.java ! src/share/classes/com/sun/tools/javac/tree/TreeCopier.java ! src/share/classes/com/sun/tools/javac/tree/TreeInfo.java ! src/share/classes/com/sun/tools/javac/tree/TreeMaker.java ! src/share/classes/com/sun/tools/javac/tree/TreeScanner.java ! src/share/classes/com/sun/tools/javac/tree/TreeTranslator.java ! src/share/classes/com/sun/tools/javac/util/Abort.java ! src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java ! src/share/classes/com/sun/tools/javac/util/AbstractLog.java ! src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java ! src/share/classes/com/sun/tools/javac/util/Bits.java ! src/share/classes/com/sun/tools/javac/util/ByteBuffer.java ! src/share/classes/com/sun/tools/javac/util/ClientCodeException.java ! src/share/classes/com/sun/tools/javac/util/CloseableURLClassLoader.java ! src/share/classes/com/sun/tools/javac/util/Constants.java ! src/share/classes/com/sun/tools/javac/util/Context.java ! src/share/classes/com/sun/tools/javac/util/Convert.java ! src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java ! src/share/classes/com/sun/tools/javac/util/FatalError.java ! src/share/classes/com/sun/tools/javac/util/ForwardingDiagnosticFormatter.java ! src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java ! src/share/classes/com/sun/tools/javac/util/JavacMessages.java ! src/share/classes/com/sun/tools/javac/util/LayoutCharacters.java ! src/share/classes/com/sun/tools/javac/util/List.java ! src/share/classes/com/sun/tools/javac/util/ListBuffer.java ! src/share/classes/com/sun/tools/javac/util/Log.java ! src/share/classes/com/sun/tools/javac/util/MandatoryWarningHandler.java ! src/share/classes/com/sun/tools/javac/util/Name.java ! src/share/classes/com/sun/tools/javac/util/Names.java ! src/share/classes/com/sun/tools/javac/util/Options.java ! src/share/classes/com/sun/tools/javac/util/Pair.java ! src/share/classes/com/sun/tools/javac/util/Position.java ! src/share/classes/com/sun/tools/javac/util/PropagatedException.java ! src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java ! src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java ! src/share/classes/com/sun/tools/javac/util/SharedNameTable.java ! src/share/classes/com/sun/tools/javac/util/UnsharedNameTable.java ! src/share/classes/com/sun/tools/javac/util/Warner.java ! src/share/classes/com/sun/tools/javah/Gen.java ! src/share/classes/com/sun/tools/javah/InternalError.java ! src/share/classes/com/sun/tools/javah/JNI.java ! src/share/classes/com/sun/tools/javah/JavahFileManager.java ! src/share/classes/com/sun/tools/javah/JavahTask.java ! src/share/classes/com/sun/tools/javah/JavahTool.java ! src/share/classes/com/sun/tools/javah/LLNI.java ! src/share/classes/com/sun/tools/javah/Main.java ! src/share/classes/com/sun/tools/javah/Mangle.java ! src/share/classes/com/sun/tools/javah/NativeHeaderTool.java ! src/share/classes/com/sun/tools/javah/TypeSignature.java ! src/share/classes/com/sun/tools/javah/Util.java ! src/share/classes/com/sun/tools/javap/AnnotationWriter.java ! src/share/classes/com/sun/tools/javap/AttributeWriter.java ! src/share/classes/com/sun/tools/javap/BasicWriter.java ! src/share/classes/com/sun/tools/javap/ClassWriter.java ! src/share/classes/com/sun/tools/javap/CodeWriter.java ! src/share/classes/com/sun/tools/javap/ConstantWriter.java ! src/share/classes/com/sun/tools/javap/Context.java ! src/share/classes/com/sun/tools/javap/DisassemblerTool.java ! src/share/classes/com/sun/tools/javap/InstructionDetailWriter.java ! src/share/classes/com/sun/tools/javap/InternalError.java ! src/share/classes/com/sun/tools/javap/JavapFileManager.java ! src/share/classes/com/sun/tools/javap/JavapTask.java ! src/share/classes/com/sun/tools/javap/LocalVariableTableWriter.java ! src/share/classes/com/sun/tools/javap/LocalVariableTypeTableWriter.java ! src/share/classes/com/sun/tools/javap/Main.java ! src/share/classes/com/sun/tools/javap/Messages.java ! src/share/classes/com/sun/tools/javap/Options.java ! src/share/classes/com/sun/tools/javap/SourceWriter.java ! src/share/classes/com/sun/tools/javap/StackMapWriter.java ! src/share/classes/com/sun/tools/javap/TryBlockWriter.java ! src/share/classes/com/sun/tools/javap/TypeAnnotationWriter.java ! src/share/classes/javax/lang/model/overview.html ! test/tools/apt/mirror/declaration/pkg1/pkg2/package.html ! test/tools/javac/6948381/T6948381.java ! test/tools/javac/6948381/npe/A.java ! test/tools/javac/6948381/npe/B.java ! test/tools/javac/api/evalexpr/ByteArrayClassLoader.java ! test/tools/javac/api/evalexpr/CompileFromString.java ! test/tools/javac/api/evalexpr/MemoryFileManager.java ! test/tools/javac/generics/diamond/T6951833.java ! test/tools/javac/generics/typevars/T6880344.java ! test/tools/javac/varargs/warning/Warn4.java From jonathan.gibbons at oracle.com Fri Jun 11 00:10:24 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Fri, 11 Jun 2010 00:10:24 +0000 Subject: hg: jdk7/tl/langtools: 6960407: Potential rebranding issues in openjdk/langtools repository sources Message-ID: <20100611001026.309AD47106@hg.openjdk.java.net> Changeset: 366a7b9b5627 Author: jjg Date: 2010-06-10 17:09 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/366a7b9b5627 6960407: Potential rebranding issues in openjdk/langtools repository sources Reviewed-by: darcy ! make/Makefile ! make/Makefile-classic ! src/share/classes/com/sun/source/tree/Tree.java ! src/share/classes/com/sun/source/util/JavacTask.java ! src/share/classes/com/sun/source/util/TaskEvent.java ! src/share/classes/com/sun/source/util/TaskListener.java ! src/share/classes/com/sun/tools/doclets/formats/html/package.html ! src/share/classes/com/sun/tools/javac/api/JavacTaskImpl.java ! src/share/classes/com/sun/tools/javac/code/Flags.java ! src/share/classes/com/sun/tools/javac/code/Lint.java ! src/share/classes/com/sun/tools/javac/code/Symtab.java ! src/share/classes/com/sun/tools/javac/comp/Attr.java ! src/share/classes/com/sun/tools/javac/comp/Check.java ! src/share/classes/com/sun/tools/javac/resources/compiler.properties ! src/share/classes/com/sun/tools/javadoc/resources/javadoc.properties ! src/share/classes/com/sun/tools/javadoc/resources/javadoc_zh_CN.properties ! src/share/classes/javax/tools/JavaFileManager.java From martinrb at google.com Fri Jun 11 00:43:35 2010 From: martinrb at google.com (martinrb at google.com) Date: Fri, 11 Jun 2010 00:43:35 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100611004354.30B0B47115@hg.openjdk.java.net> Changeset: f7a69b261b1d Author: martin Date: 2010-06-10 15:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/f7a69b261b1d 6960394: Stop linking with -lnsl on Linux Summary: Define LIBNSL (like LIBSOCKET), non-empty only on Solaris Reviewed-by: ohair ! make/common/Defs-linux.gmk ! make/common/Defs-solaris.gmk ! make/java/hpi/hpi_common.gmk ! make/java/java/Makefile ! make/java/java_hprof_demo/Makefile ! make/java/net/Makefile ! make/jpda/transport/socket/Makefile ! make/mkdemo/jvmti/hprof/Makefile ! src/share/demo/jvmti/hprof/sample.makefile.txt Changeset: aa8effe6bb54 Author: martin Date: 2010-06-10 15:55 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/aa8effe6bb54 6959259: Minor improvements to static Random field caching Summary: Cache fields in locals; small javadoc clarifications Reviewed-by: emcmanus, dholmes, forax, dl ! src/share/classes/java/lang/Math.java ! src/share/classes/java/lang/StrictMath.java ! src/share/classes/java/util/Collections.java From weijun.wang at sun.com Fri Jun 11 03:39:23 2010 From: weijun.wang at sun.com (weijun.wang at sun.com) Date: Fri, 11 Jun 2010 03:39:23 +0000 Subject: hg: jdk7/tl/jdk: 6958869: regression: PKIXValidator fails when multiple trust anchors have same dn Message-ID: <20100611033932.C9E6047122@hg.openjdk.java.net> Changeset: b1ec20722051 Author: weijun Date: 2010-06-11 11:38 +0800 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/b1ec20722051 6958869: regression: PKIXValidator fails when multiple trust anchors have same dn Reviewed-by: xuelei, wetmore, mullan ! src/share/classes/sun/security/validator/PKIXValidator.java ! test/sun/security/validator/CertReplace.java ! test/sun/security/validator/certreplace.sh + test/sun/security/validator/samedn.sh From alan.bateman at oracle.com Fri Jun 11 13:48:12 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Fri, 11 Jun 2010 13:48:12 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100611134851.A993747154@hg.openjdk.java.net> Changeset: 06699a990ac7 Author: alanb Date: 2010-06-11 14:31 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/06699a990ac7 6934585: TEST_BUG: java/nio/channels/AsynchronousSocketChannel/Basic.java Reviewed-by: chegar ! test/ProblemList.txt ! test/java/nio/channels/AsynchronousSocketChannel/Basic.java Changeset: 7079585d6e0e Author: alanb Date: 2010-06-11 14:47 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/7079585d6e0e 6938230: (so) SocketAdaptor.close() does not translate IOException resulting in Error Reviewed-by: chegar ! src/share/classes/sun/nio/ch/ServerSocketAdaptor.java ! src/share/classes/sun/nio/ch/SocketAdaptor.java From jonathan.gibbons at oracle.com Fri Jun 11 14:12:43 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Fri, 11 Jun 2010 14:12:43 +0000 Subject: hg: jdk7/tl/langtools: 6877961: langtools build should allow more options when running jtreg Message-ID: <20100611141247.DBB294715A@hg.openjdk.java.net> Changeset: 224533455888 Author: jjg Date: 2010-06-11 07:12 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/224533455888 6877961: langtools build should allow more options when running jtreg Reviewed-by: mcimadamore ! make/build.xml From kumar.x.srinivasan at oracle.com Fri Jun 11 18:40:30 2010 From: kumar.x.srinivasan at oracle.com (Kumar Srinivasan) Date: Fri, 11 Jun 2010 11:40:30 -0700 Subject: test please ignore Message-ID: <4C12831E.6050702@oracle.COM> testing to see if my oracle id works now. Please delete and sorry for the spam. Kumar From jonathan.gibbons at oracle.com Sat Jun 12 00:24:52 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Sat, 12 Jun 2010 00:24:52 +0000 Subject: hg: jdk7/tl/langtools: 6958836: javadoc should support -Xmaxerrs and -Xmaxwarns Message-ID: <20100612002454.26E3547192@hg.openjdk.java.net> Changeset: d1ea43cb71c1 Author: jjg Date: 2010-06-11 17:24 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/d1ea43cb71c1 6958836: javadoc should support -Xmaxerrs and -Xmaxwarns Reviewed-by: darcy ! src/share/classes/com/sun/tools/javac/util/Log.java ! src/share/classes/com/sun/tools/javadoc/DocletInvoker.java ! src/share/classes/com/sun/tools/javadoc/Messager.java ! src/share/classes/com/sun/tools/javadoc/Start.java ! src/share/classes/com/sun/tools/javadoc/resources/javadoc.properties + test/tools/javadoc/6958836/Test.java + test/tools/javadoc/6958836/errs/Errors.java + test/tools/javadoc/6958836/warns/Warnings.java From ahughes at redhat.com Sat Jun 12 00:32:58 2010 From: ahughes at redhat.com (ahughes at redhat.com) Date: Sat, 12 Jun 2010 00:32:58 +0000 Subject: hg: jdk7/tl/jdk: 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in sun/nio/cs due to the use of -Werror Message-ID: <20100612003308.5662547193@hg.openjdk.java.net> Changeset: c849dc20dc85 Author: andrew Date: 2010-06-12 01:32 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/c849dc20dc85 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails in sun/nio/cs due to the use of -Werror Summary: Remove unneeded casts, add generic types and make better use of static data Reviewed-by: sherman ! make/sun/nio/cs/Makefile ! src/share/classes/sun/io/ByteToCharISO2022.java ! src/share/classes/sun/io/ByteToCharISO2022JP.java ! src/share/classes/sun/io/ByteToCharJISAutoDetect.java ! src/share/classes/sun/io/CharToBytePCK.java ! src/share/classes/sun/nio/cs/ext/DoubleByte.java ! src/share/classes/sun/nio/cs/ext/EUC_JP.java ! src/share/classes/sun/nio/cs/ext/EUC_JP_LINUX.java ! src/share/classes/sun/nio/cs/ext/EUC_JP_Open.java ! src/share/classes/sun/nio/cs/ext/EUC_TW.java ! src/share/classes/sun/nio/cs/ext/GB18030.java ! src/share/classes/sun/nio/cs/ext/HKSCS.java ! src/share/classes/sun/nio/cs/ext/ISO2022.java ! src/share/classes/sun/nio/cs/ext/JISAutoDetect.java ! src/share/classes/sun/nio/cs/ext/PCK.java ! src/share/classes/sun/nio/cs/ext/SJIS.java ! src/solaris/classes/sun/nio/cs/ext/COMPOUND_TEXT_Encoder.java ! src/solaris/classes/sun/nio/cs/ext/CompoundTextSupport.java From ahughes at redhat.com Sat Jun 12 00:35:31 2010 From: ahughes at redhat.com (Andrew John Hughes) Date: Sat, 12 Jun 2010 01:35:31 +0100 Subject: PING: Re: Fix build failure with JAVAC_MAX_WARNINGS=true in sun/nio/cs In-Reply-To: <4C1162FA.8000808@oracle.com> References: <4C0D3532.8080808@oracle.com> <4C0D6D04.5090701@oracle.com> <82ocfkn194.fsf@mid.bfk.de> <4C0FCDC6.9040508@oracle.com> <4C1162FA.8000808@oracle.com> Message-ID: On 10 June 2010 23:11, Xueming Shen wrote: > Andrew, > > Thanks for working on it. > Thanks for such a through review process. > The change looks fine, except one final nit:-) > > EUC_JP_Open: #127 & #140 > ? it appears encoderJ0208 is no longer needed. > Fixed. > Please run those tests at sun/nio/cs before push, I don't really trust my > own eyes > these days:-) > Everything passed that passed before (sun/nio/cs/TestStringCoding failed before and after with a SecurityException) so I pushed the fix: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/c849dc20dc85 > Sherman > > > Andrew John Hughes wrote: >> >> On 9 June 2010 18:22, Xueming Shen wrote: >> >>> >>> Andrew John Hughes wrote: >>> >>>> >>>> On 9 June 2010 07:55, Florian Weimer wrote: >>>> >>>> >>>>> >>>>> * Andrew John Hughes: >>>>> >>>>> >>>>> >>>>>> >>>>>> On 7 June 2010 23:04, Xueming Shen wrote: >>>>>> >>>>>> >>>>>>> >>>>>>> Hi Andrew, >>>>>>> >>>>>>> 6959197: When building with JAVAC_MAX_WARNINGS=true, the build fails >>>>>>> in >>>>>>> sun/nio/cs due to the use of -Werror >>>>>>> >>>>>>> (1)sun/io/ByteTocharISO2022JP.java >>>>>>> ?#129, ?#151 >>>>>>> >>>>>>> ?if ((byte1 & (byte)0x80) != 0){ >>>>>>> >>>>>>> ? ? if ((byte2 & (byte)0x80) != 0){ >>>>>>> >>>>>>> >>>>>>> (byte) casting is not necessary as well? >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> It's necessary. ?0x80 is an integer literal >>>>>> >>>>>> >>>>>> (http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.1) >>>>>> which requires a lossy narrowing conversion to byte >>>>>> >>>>>> >>>>>> (http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.3) >>>>>> >>>>>> >>>>> >>>>> Doesn't the & operator promote its arguments to int anyway? ?I don't >>>>> think the cast to byte makes a difference here because it does not >>>>> matter if 0x80 is sign-extended or zero-extended. >>>>> >>>>> It might be more efficient to use "byte1 < 0" and "byte2 < 0" instead. >>>>> >>>>> >>>>> >>>> >>>> You're right. ?I think I mentally read that as an assignment, not an >>>> and operation. >>>> >>>> If I'm reading it right now, it would seem to just be testing the sign >>>> bit. ?byte1 < 0 would be clearer if not faster, and I'd be for >>>> changing that, though that probably should be a separate patch. >>>> >>>> Sherman, does the new webrev look ok to push? >>>> >>>> >>>> >>> >>> (1)ByteToCharJISAutoDetect.java >>> ?It appears we should move the maskTable1/2 initialization code out of >>> the >>> constructor block. >>> >>> ?37 ? ? private static byte[] maskTable1 = JISAutoDetect.getByteMask1(); >>> ?38 ? ? private static byte[] maskTable2 = JISAutoDetect.getByteMask2(); >>> >>> >> >> Done. ?I also made them final. >> >> >>> >>> (2)EUC_JP_Open.java >>> >>> 137 ? ? ? ? ? ? j0208Index1 = JIS_X_0208_Solaris_Encoder.getIndex1(); >>> 138 ? ? ? ? ? ? j0208Index2 = JIS_X_0208_Solaris_Encoder.getIndex2(); >>> >>> ?can be moved out of the constructor as you do for the decoder. better to >>> ?keep them consistent (as well as the code in EUC_JP_LINUX) >>> >>> >> >> Done. ?I made both sets private, static and final as well, and updated >> EUC_JP, EUC_JP_LINUX, PCK and SJIS in the same way. >> >> >>> >>> (3)sun/nio/cs/ext/HKSCS.java >>> >>> - ? ? ? ? ? ?this.big5Dec = big5Dec; >>> + ? ? ? ? ? ?Decoder.big5Dec = big5Dec; >>> >>> Dave is absolutely right here. big5Dec definitely should be an instance >>> field instead of static, it's my bug in the original code. It should be >>> >>> ? ? ? private DoubleByte.Decoder big5Dec; >>> >>> ? ? ? protected Decoder(Charset cs, >>> ? ? ? ? ? ? ? ? ? ? ? ? DoubleByte.Decoder big5Dec, >>> ? ? ? ? ? ? ? ? ? ? ? ? char[][] b2cBmp, char[][] b2cSupp) >>> ? ? ? { >>> ? ? ? ? ? // super(cs, 0.5f, 1.0f); >>> ? ? ? ? ? // need to extends DoubleByte.Decoder so the >>> ? ? ? ? ? // sun.io can use it. this implementation >>> ? ? ? ? ? super(cs, 0.5f, 1.0f, null, null, 0, 0); >>> ? ? ? ? ? this.big5Dec = big5Dec; >>> ? ? ? ? ? this.b2cBmp = b2cBmp; >>> ? ? ? ? ? this.b2cSupp = b2cSupp; >>> ? ? ? } >>> >>> >> >> Cool. ?One latent bug fixed too :-) >> >> >> >>> >>> Thanks, >>> Sherman >>> >>> >>> >>> >>> >>> >> >> New webrev: http://cr.openjdk.java.net/~andrew/warnings/webrev.05/ >> >> Ok to push? >> >> Thanks, >> > > Thanks, -- Andrew :-) Free Java Software Engineer Red Hat, Inc. (http://www.redhat.com) Support Free Java! Contribute to GNU Classpath and the OpenJDK http://www.gnu.org/software/classpath http://openjdk.java.net PGP Key: 94EFD9D8 (http://subkeys.pgp.net) Fingerprint: F8EF F1EA 401E 2E60 15FA 7927 142C 2591 94EF D9D8 From martinrb at google.com Sat Jun 12 02:04:17 2010 From: martinrb at google.com (martinrb at google.com) Date: Sat, 12 Jun 2010 02:04:17 +0000 Subject: hg: jdk7/tl/jdk: 6944584: Improvements to subprocess handling on Unix Message-ID: <20100612020426.E9C9147199@hg.openjdk.java.net> Changeset: 422531c98ba5 Author: martin Date: 2010-06-11 18:55 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/422531c98ba5 6944584: Improvements to subprocess handling on Unix Summary: use thread pool for reaper thread; move most I/O operations out of reaper thread Reviewed-by: michaelm, hiroshi ! src/share/classes/java/lang/ProcessBuilder.java ! src/solaris/classes/java/lang/UNIXProcess.java.linux ! test/java/lang/ProcessBuilder/Basic.java From martinrb at google.com Sat Jun 12 02:06:19 2010 From: martinrb at google.com (Martin Buchholz) Date: Fri, 11 Jun 2010 19:06:19 -0700 Subject: UNIXProcess improvements In-Reply-To: References: <20100416161831.C21CE511@eggemoggin.niobe.net> <4BCC7F14.6080600@sun.com> <4BCDCF0E.5090604@sun.com> Message-ID: I finally submitted this change 6944584: Improvements to subprocess handling on Unix Thanks to all the reviewers. Martin From Ulf.Zibis at gmx.de Sun Jun 13 12:32:30 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Sun, 13 Jun 2010 14:32:30 +0200 Subject: String.split() should return 0 items if input is empty Message-ID: <4C14CFDE.2000807@gmx.de> Shouldn't String.split("x") return 0 items (=null) if input is empty (=.length()==0), as there is neither a matching pattern "x", nor some trailing chars and trailing empty strings should be discarded? Thanks, -Ulf From Ulf.Zibis at gmx.de Sun Jun 13 12:39:14 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Sun, 13 Jun 2010 14:39:14 +0200 Subject: String.split() should return 0 items if input is empty In-Reply-To: <4C14CFDE.2000807@gmx.de> References: <4C14CFDE.2000807@gmx.de> Message-ID: <4C14D172.3020103@gmx.de> Correction: 0 items (=new String[0]) Actually it returns new String[1] with one zero-length String. -Ulf Am 13.06.2010 14:32, schrieb Ulf Zibis: > Shouldn't String.split("x") return 0 items (=null) if input is empty > (=.length()==0), > as there is neither a matching pattern "x", nor some trailing chars > and trailing empty strings should be discarded? > > Thanks, > > -Ulf > > > From Ulf.Zibis at gmx.de Sun Jun 13 13:51:39 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Sun, 13 Jun 2010 15:51:39 +0200 Subject: String.split() should return 0 items if input is empty In-Reply-To: <4C14D172.3020103@gmx.de> References: <4C14CFDE.2000807@gmx.de> <4C14D172.3020103@gmx.de> Message-ID: <4C14E26B.7060400@gmx.de> On the other hand: " ".token.split(" "); // Bug: should return { "" } for token " " should return: { "" } (=new String[1]) but actually returns { } (=new String[0]) . -Ulf Am 13.06.2010 14:39, schrieb Ulf Zibis: > Correction: 0 items (=new String[0]) > Actually it returns new String[1] with one zero-length String. > > -Ulf > > > Am 13.06.2010 14:32, schrieb Ulf Zibis: >> Shouldn't String.split("x") return 0 items (=null) if input is empty >> (=.length()==0), >> as there is neither a matching pattern "x", nor some trailing chars >> and trailing empty strings should be discarded? >> >> Thanks, >> >> -Ulf >> >> >> > > From iaroslavski at mail.ru Sun Jun 13 22:07:54 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Mon, 14 Jun 2010 02:07:54 +0400 Subject: =?koi8-r?Q?Re[2]=3A_New_portion_of_improvements_for_Dual-Pivot_Quicksort?= In-Reply-To: References: Message-ID: Hello, Here is the latest version of Dual-Pivot Quicksort with minor javadoc changes. Does anybody have comments/suggestions/improvements? Thank you, Vladimir > > Date: Tue, 8 Jun 2010 18:09:42 +0400 > > From: iaroslavski at mail.ru > > Subject: Re: New portion of improvements for Dual-Pivot Quicksort > > To: dmytro_sheyko at hotmail.com > > CC: core-libs-dev at openjdk.java.net > > > > Hello, > > > > Good catch! I agree with k!=p condition, but have doubt about using > > Float.isNaN(ak) instead of ak != ak in for loop. Float.isNaN does exactly > > the same comparison and at the same time it is called for all elements > > of the array. > > > > I checked now and see that it is better to eliminate while loop, > > and the best case is: > > > > for (int k = right; k >= left; k--) { > > float ak = a[k]; > > if (ak != ak) { // a[k] is NaN > > a[k] = a[right]; > > a[right--] = ak; > > } > > } > > > > If we have a lot of NaNs, it will be proceeded on linear time > > and only small amount of elements will be sorted. If there are > > no NaNs [at the end] - more probably use case - this code works > > faster. I run simple test and it shows that case without while loop > > is little bit faster, ~0.5%. > > > > Please, see attached version. > > > > Thank you, > > Vladimir > > > > Dmytro Sheyko wrote: > > > Hi, > > > > > > Coming back to NaN processing. > > > It appeared that current code unnecessarily stirs up NaNs in the end of > > > array even when they are just on their places. > > > So I propose to replace these code > > > /* > > > * Phase 1: Move NaNs to the end of the array. > > > */ > > > for (int k = left; k <= right; k++) { > > > float ak = a[k]; > > > if (ak != ak) { // a[k] is NaN > > > a[k--] = a[right]; > > > a[right--] = ak; > > > } > > > } > > > with following > > > /* > > > * Phase 1: Move NaNs to the end of the array. > > > */ > > > while (left <= right && Float.isNaN(a[right])) { > > > right--; > > > } > > > for (int k = right - 1; k >= left; k--) { > > > float ak = a[k]; > > > if (Float.isNaN(ak)) { > > > a[k] = a[right]; > > > a[right] = ak; > > > right--; > > > } > > > } > > > > > > Also I would like to note that while we are processing negative zeros, > > > condition (k != p) is unnecessary. > > > > > > for (int k = left + 1, p = left; k <= right; k++) { > > > float ak = a[k]; > > > if (ak != 0.0f) { > > > return; > > > } > > > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > > > if (k != p) { // !!! always true > > > a[k] = +0.0f; > > > a[p] = -0.0f; > > > } > > > p++; > > > } > > > } > > > > > > Here k is strictly greater than p initially and then grows faster than p. > > > > > > > > > > From: iaroslavski at mail.ru > > > > To: dmytro_sheyko at hotmail.com > > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > Subject: Re[4]: New portion of improvements for Dual-Pivot Quicksort > > > > Date: Sat, 5 Jun 2010 23:40:31 +0400 > > > > > > > > I tried with separate method sortPivotCandidates(...), no changes in > > > behaviour, > > > > but at the same time I don't see that the method makes sources much > > > cleaner, > > > > inline comments are enough. I attach the latest version of DPQ. > > > > > > > > Fri, 4 Jun 2010 14:21:58 +0700 ?????? ?? Dmytro Sheyko > > > : > > > > > > > > > Seems good, > > > > > > > > > > One note. Since we gave up to sort pivot candidates in local > > > variables, maybe we can move this out to separate procedure (in order to > > > make sources cleaner a bit), e.g. > > > > > > > > > > private static void sortPivotCandidates(double[] a, int ae1, int > > > ae2, int ae3, int ae4, int ae5) > > > > > > > > > > Hope the compiler is able to inline it without extra cost. > > > > > > > > > > Thanks, > > > > > Dmytro Sheyko > > > > > > > > > > > From: iaroslavski at mail.ru > > > > > > To: dmytro_sheyko at hotmail.com > > > > > > CC: core-libs-dev at openjdk.java.net; iaroslavski at mail.ru > > > > > > Subject: Re[2]: New portion of improvements for Dual-Pivot Quicksort > > > > > > Date: Fri, 4 Jun 2010 01:17:57 +0400 > > > > > > > > > > > > Hello, > > > > > > > > > > > > I tried your case (which is selection sort) and it works as > > > expected: not worse > > > > > > than "network" or "bubble" sorting. But nevertheless, the best > > > choice is to use > > > > > > insertion sort, I wrote more elegant implementation, see: > > > > > > > > > > > > ///int ae1 = a[e1], ae3 = a[e3], ae5 = a[e5], ae2 = a[e2], ae4 = > > > a[e4]; > > > > > > > > > > > > // Sort these elements using insertion sort > > > > > > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > > > > > > > > > > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > > } > > > > > > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > > > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > > } > > > > > > } > > > > > > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > > > > > > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > > > > > > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > > > > > > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > > > > > > } > > > > > > } > > > > > > } > > > > > > > > > > > > ///a[e1] = ae1; a[e3] = ae3; a[e5] = ae5; a[e2] = ae2; a[e4] = ae4; > > > > > > > > > > > > Note that this implementation doesn't use local variables ae1, .. > > > , ae5 > > > > > > at all, and without variables it works faster. This code is not > > > too long, > > > > > > extra 4 lines only. And if on client VM it works as other "network" > > > > > > implementations, but on server VM it wins 1.2%. > > > > > > > > > > > > In compare with first implementation of Dual-Pivot Quicksort, which > > > > > > is used now in JDK 7, suggested version wins ~15% and 6% for client > > > > > > and server modes. > > > > > > > > > > > > Updated version of the class I will send tomorrow. > > > > > > > > > > > > Dmytro, > > > > > > could you please look at suggested insertion sort for 5 elements? > > > > > > > > > > > > Do you have any comments/improvements? One place to be improved > > > > > > is last two ifs "if (a[e4] < ..." and "if (a[e5] < ..." where > > > > > > element is compared with all sorted elements, whereas we can save > > > > > > comparisons by binary fork. But implementation becomes too complex > > > > > > and long. > > > > > > > > > > > > As it can be expected, the best sorting for small arrays is > > > insertion, > > > > > > then selection and then only bubble sort, even for 5 elements. > > > > > > > > > > > > Best regards, > > > > > > Vladimir -------------- next part -------------- A non-text attachment was scrubbed... Name: DualPivotQuicksort.java Type: application/octet-stream Size: 111326 bytes Desc: not available URL: From kelly.ohair at oracle.com Mon Jun 14 03:10:40 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Mon, 14 Jun 2010 03:10:40 +0000 Subject: hg: jdk7/tl/jdk: 6960898: Regression due to src/share/classes/java/lang/ProcessBuilder.java changes Message-ID: <20100614031109.DE768471FE@hg.openjdk.java.net> Changeset: 5a61a4f65c9c Author: martin Date: 2010-06-13 17:19 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/5a61a4f65c9c 6960898: Regression due to src/share/classes/java/lang/ProcessBuilder.java changes Summary: Use Null{In,Out}putStream.INSTANCE as with Linux code Reviewed-by: ohair ! src/solaris/classes/java/lang/UNIXProcess.java.solaris ! src/windows/classes/java/lang/ProcessImpl.java From jonathan.gibbons at oracle.com Mon Jun 14 18:29:31 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Mon, 14 Jun 2010 18:29:31 +0000 Subject: hg: jdk7/tl/corba: 6960831: fix CORBA build warnings Message-ID: <20100614182932.630894721F@hg.openjdk.java.net> Changeset: 032585ad970d Author: jjg Date: 2010-06-14 11:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/032585ad970d 6960831: fix CORBA build warnings Reviewed-by: darcy ! src/share/classes/com/sun/corba/se/impl/orbutil/CorbaResourceUtil.java ! src/share/classes/com/sun/corba/se/impl/orbutil/ObjectUtility.java ! src/share/classes/com/sun/corba/se/impl/presentation/rmi/ExceptionHandlerImpl.java ! src/share/classes/org/omg/CORBA/ORB.java ! src/share/classes/sun/corba/Bridge.java From alan.bateman at oracle.com Tue Jun 15 09:36:32 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Tue, 15 Jun 2010 09:36:32 +0000 Subject: hg: jdk7/tl/jdk: 6961062: (dc) Several DatagramChannel tests timeout or fail with "address already in use" Message-ID: <20100615093701.E94A247248@hg.openjdk.java.net> Changeset: 76a9c90e9019 Author: alanb Date: 2010-06-15 10:03 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/76a9c90e9019 6961062: (dc) Several DatagramChannel tests timeout or fail with "address already in use" Reviewed-by: chegar ! test/ProblemList.txt ! test/java/nio/channels/DatagramChannel/Connect.java ! test/java/nio/channels/DatagramChannel/EmptyBuffer.java ! test/java/nio/channels/DatagramChannel/NoSender.java ! test/java/nio/channels/DatagramChannel/SRTest.java ! test/java/nio/channels/DatagramChannel/Sender.java From kumar.x.srinivasan at oracle.com Tue Jun 15 13:59:16 2010 From: kumar.x.srinivasan at oracle.com (Kumar Srinivasan) Date: Tue, 15 Jun 2010 06:59:16 -0700 Subject: Review please : 6575373 : Error verifying signatures of pack200 files in some cases In-Reply-To: <4C177F48.9060502@sun.com> References: <4C11185C.1030806@oracle.COM> <4C177F48.9060502@sun.com> Message-ID: <4C178734.9000506@oracle.COM> Ah yes, I will fix this. Kumar > Hello Kumar, > > I think we should update the comment above the changed line in > PropMap.java too. > > Thanks, > Nikolay > > Kumar Srinivasan wrote: >> Hello, >> >> This is a very simple fix to a long standing issue with pack200, it >> changes the >> default behavior of pack200 to use one segment by default, which will >> cover most common use cases. >> >> http://cr.openjdk.java.net/~ksrini/6575373/ >> >> Thanks >> Kumar >> From forax at univ-mlv.fr Tue Jun 15 14:08:16 2010 From: forax at univ-mlv.fr (=?ISO-8859-1?Q?R=E9mi_Forax?=) Date: Tue, 15 Jun 2010 16:08:16 +0200 Subject: Review please : 6575373 : Error verifying signatures of pack200 files in some cases In-Reply-To: <4C178734.9000506@oracle.COM> References: <4C11185C.1030806@oracle.COM> <4C177F48.9060502@sun.com> <4C178734.9000506@oracle.COM> Message-ID: <4C178950.1010008@univ-mlv.fr> Le 15/06/2010 15:59, Kumar Srinivasan a ?crit : > Ah yes, I will fix this. > Kumar You should change the comment in PropMap.java to something saying that the limit segment size is unlimited. R?mi > >> Hello Kumar, >> >> I think we should update the comment above the changed line in >> PropMap.java too. >> >> Thanks, >> Nikolay >> >> Kumar Srinivasan wrote: >>> Hello, >>> >>> This is a very simple fix to a long standing issue with pack200, it >>> changes the >>> default behavior of pack200 to use one segment by default, which will >>> cover most common use cases. >>> >>> http://cr.openjdk.java.net/~ksrini/6575373/ >>> >>> Thanks >>> Kumar >>> > From mandy.chung at oracle.com Tue Jun 15 16:54:57 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Tue, 15 Jun 2010 16:54:57 +0000 Subject: hg: jdk7/tl/jdk: 4 new changesets Message-ID: <20100615165557.5275347273@hg.openjdk.java.net> Changeset: fb2d88134382 Author: mchung Date: 2010-06-14 14:44 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/fb2d88134382 6960789: com.sun.servicetag API needs to be added in ct.sym Summary: Include com.sun.servicetag classes when generating ct.sym Reviewed-by: alanb, jjg ! make/common/Release.gmk ! test/ProblemList.txt Changeset: c1f7ff3447ba Author: mchung Date: 2010-06-15 09:49 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/c1f7ff3447ba 6952161: Rebranding: Registration html for servicetag Summary: Rebrand register.html and jdk_header.png Reviewed-by: ohair, asaha, ogino, mfang ! src/share/classes/com/sun/servicetag/resources/jdk_header.png ! src/share/classes/com/sun/servicetag/resources/register.html ! src/share/classes/com/sun/servicetag/resources/register_ja.html ! src/share/classes/com/sun/servicetag/resources/register_zh_CN.html Changeset: 915ca65d1db7 Author: mchung Date: 2010-06-15 09:52 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/915ca65d1db7 Merge ! test/ProblemList.txt Changeset: 8d7438dede10 Author: mchung Date: 2010-06-15 09:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/8d7438dede10 6959641: testcase failing java/util/Locale/Bug4184873Test.java Summary: Revert the Bug4184873_{he,id,yi} files to revision 0 (before rebranding) Reviewed-by: naoto ! test/ProblemList.txt ! test/java/util/Locale/Bug4184873_he ! test/java/util/Locale/Bug4184873_id ! test/java/util/Locale/Bug4184873_yi From mandy.chung at oracle.com Tue Jun 15 17:22:33 2010 From: mandy.chung at oracle.com (Mandy Chung) Date: Tue, 15 Jun 2010 10:22:33 -0700 Subject: Review request: test/java/util/logging/ParentLoggersTest.java fails in samevm mode Message-ID: <4C17B6D9.8070800@oracle.com> Fixed 6961408: test/java/util/logging/ParentLoggersTest.java fails in samevm mode Webrev at: http://cr.openjdk.java.net/~mchung/6961408/webrev.00/ This fix updates the test to check the list of loggers before and after the test run and also takes out all logging tests from the ProblemList.txt. Thanks Mandy From alan.bateman at oracle.com Tue Jun 15 20:47:39 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Tue, 15 Jun 2010 20:47:39 +0000 Subject: hg: jdk7/tl/jdk: 3 new changesets Message-ID: <20100615204819.753764727F@hg.openjdk.java.net> Changeset: 72022d7d4578 Author: alanb Date: 2010-06-15 16:36 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/72022d7d4578 6932744: TEST_BUG: java/nio/channels/Selector/OpRead.java failing Reviewed-by: chegar ! test/ProblemList.txt ! test/java/nio/channels/Selector/OpRead.java Changeset: 91124d60b2ed Author: alanb Date: 2010-06-15 16:42 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/91124d60b2ed 6961358: TEST_BUG: java/nio/channels/SocketChannel/OpenLeak.java can't run in samevm mode Reviewed-by: chegar ! test/ProblemList.txt ! test/java/nio/channels/SocketChannel/OpenLeak.java Changeset: 125ec775c9d1 Author: alanb Date: 2010-06-15 21:43 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/125ec775c9d1 Merge ! test/ProblemList.txt From mandy.chung at oracle.com Tue Jun 15 22:22:00 2010 From: mandy.chung at oracle.com (Mandy Chung) Date: Tue, 15 Jun 2010 15:22:00 -0700 Subject: Review request: TEST_BUG: test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails Message-ID: <4C17FD08.6080001@oracle.com> 6961502: TEST_BUG: test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails Webrev at: http://cr.openjdk.java.net/~mchung/6961502/webrev.00/ This test intends to test various cases of passing java.nio.ByteBuffers to defineClass(). However, it never tests what it is intended for. In othervm mode, the system class loader, the parent of DummyClassLoader, successfully finds TestClass and defines it before it gets to the DummyClassLoader to do the job. This test fails in samevm mode since jtreg URLClassLoader to load classes for the test.classes directory is not in the DummyClassLoader's delegation hierarchy. Thanks Mandy From mandy.chung at oracle.com Tue Jun 15 23:13:33 2010 From: mandy.chung at oracle.com (Mandy Chung) Date: Tue, 15 Jun 2010 16:13:33 -0700 Subject: Review request: 6961518: TEST_BUG: add @run main/othervm in tests that call setSecurityManager Message-ID: <4C18091D.3050507@oracle.com> Hi Kelly, Can you review the test fix for: 6961518: TEST_BUG: add @run main/othervm in tests that call setSecurityManager Webrev at: http://cr.openjdk.java.net/~mchung/6961518/webrev.00/ ** Thanks Mandy -------------- next part -------------- An HTML attachment was scrubbed... URL: From kelly.ohair at oracle.com Tue Jun 15 23:16:28 2010 From: kelly.ohair at oracle.com (Kelly O'Hair) Date: Tue, 15 Jun 2010 16:16:28 -0700 Subject: Review request: 6961518: TEST_BUG: add @run main/othervm in tests that call setSecurityManager In-Reply-To: <4C18091D.3050507@oracle.com> References: <4C18091D.3050507@oracle.com> Message-ID: <17CF8821-F9CD-4658-BABD-8F91AB6106D7@oracle.com> Looks great to me. -kto On Jun 15, 2010, at 4:13 PM, Mandy Chung wrote: > Hi Kelly, > > Can you review the test fix for: > > 6961518: TEST_BUG: add @run main/othervm in tests that call > setSecurityManager > > Webrev at: > http://cr.openjdk.java.net/~mchung/6961518/webrev.00/ > > Thanks > Mandy From mandy.chung at oracle.com Wed Jun 16 03:35:44 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Wed, 16 Jun 2010 03:35:44 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100616033602.C92D547290@hg.openjdk.java.net> Changeset: 1b7879ca3e74 Author: mchung Date: 2010-06-15 20:29 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/1b7879ca3e74 6961518: TEST_BUG: add @run main/othervm in tests that call setSecurityManager Summary: Mark tests to run in othervm Reviewed-by: ohair ! test/ProblemList.txt ! test/java/beans/Beans/Test4080522.java ! test/java/beans/EventHandler/Test6277246.java ! test/java/beans/EventHandler/Test6277266.java ! test/java/beans/Introspector/Test6277246.java ! test/java/lang/ClassLoader/UninitializedParent.java ! test/java/lang/ClassLoader/findSystemClass/Loader.java ! test/java/lang/System/IgnoreNullSecurityManager.java ! test/java/lang/annotation/ParameterAnnotations.java ! test/java/util/ResourceBundle/Bug6359330.java ! test/java/util/ResourceBundle/Test4300693.java Changeset: 55e512967525 Author: mchung Date: 2010-06-15 20:34 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/55e512967525 6961506: TEST_BUG: ResourceBundle/Bug4168625Test.java and TestBug4179766.java fails in samevm mode Summary: Set the proper parent class loader of Loader and SimpleLoader Reviewed-by: naoto ! test/ProblemList.txt ! test/java/util/ResourceBundle/Bug4168625Test.java ! test/java/util/ResourceBundle/TestBug4179766.java From alan.bateman at oracle.com Wed Jun 16 13:25:33 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Wed, 16 Jun 2010 13:25:33 +0000 Subject: hg: jdk7/tl/jdk: 6961630: TEST_BUG: Several SocketChannel and Selector tests can fail with "address already in use" Message-ID: <20100616132610.F2EC6472B3@hg.openjdk.java.net> Changeset: 8a4557c5dfa1 Author: alanb Date: 2010-06-16 14:24 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/8a4557c5dfa1 6961630: TEST_BUG: Several SocketChannel and Selector tests can fail with "address already in use" Reviewed-by: chegar ! test/ProblemList.txt ! test/java/nio/channels/Selector/ByteServer.java ! test/java/nio/channels/Selector/CloseThenRegister.java ! test/java/nio/channels/Selector/ReadAfterConnect.java ! test/java/nio/channels/Selector/SelectAfterRead.java ! test/java/nio/channels/Selector/SelectWrite.java ! test/java/nio/channels/SocketChannel/BigReadWrite.java ! test/java/nio/channels/SocketChannel/VectorIO.java ! test/java/nio/channels/SocketChannel/Write.java ! test/java/nio/channels/spi/SelectorProvider/inheritedChannel/EchoTest.java From Alan.Bateman at oracle.com Wed Jun 16 14:19:52 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Wed, 16 Jun 2010 15:19:52 +0100 Subject: Review request: TEST_BUG: test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails In-Reply-To: <4C17FD08.6080001@oracle.com> References: <4C17FD08.6080001@oracle.com> Message-ID: <4C18DD88.8050007@oracle.com> Mandy Chung wrote: > 6961502: TEST_BUG: > test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails > > Webrev at: > http://cr.openjdk.java.net/~mchung/6961502/webrev.00/ > > This test intends to test various cases of passing > java.nio.ByteBuffers to defineClass(). However, it never tests what > it is intended for. In othervm mode, the system class loader, the > parent of DummyClassLoader, successfully finds TestClass and defines > it before it gets to the DummyClassLoader to do the job. > > This test fails in samevm mode since jtreg URLClassLoader to load > classes for the test.classes directory is not in the > DummyClassLoader's delegation hierarchy. > > Thanks > Mandy Good catch! The changes looks okay to me but I have a few comments: 1. Would it be better to set "defined" when called with a class name of "TestClass"? 2. It might be nicer to have an accessor method for defined [eg: if (cld[i].defineCalled() ]. 3. It might be nicer to use flip to flip the buffer. 4. While you are there, it might be good to eliminate the raw types (change Class to Class etc.) -Alan. From mandy.chung at oracle.com Wed Jun 16 16:36:37 2010 From: mandy.chung at oracle.com (Mandy Chung) Date: Wed, 16 Jun 2010 09:36:37 -0700 Subject: Review request: TEST_BUG: test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails In-Reply-To: <4C18DD88.8050007@oracle.com> References: <4C17FD08.6080001@oracle.com> <4C18DD88.8050007@oracle.com> Message-ID: <4C18FD95.3040207@oracle.com> Alan Bateman wrote: > Mandy Chung wrote: >> 6961502: TEST_BUG: >> test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails >> >> Webrev at: >> http://cr.openjdk.java.net/~mchung/6961502/webrev.00/ >> >> This test intends to test various cases of passing >> java.nio.ByteBuffers to defineClass(). However, it never tests what >> it is intended for. In othervm mode, the system class loader, the >> parent of DummyClassLoader, successfully finds TestClass and defines >> it before it gets to the DummyClassLoader to do the job. >> >> This test fails in samevm mode since jtreg URLClassLoader to load >> classes for the test.classes directory is not in the >> DummyClassLoader's delegation hierarchy. >> >> Thanks >> Mandy > Good catch! The changes looks okay to me but I have a few comments: > > 1. Would it be better to set "defined" when called with a class name > of "TestClass"? I removed the "defined" variable and instead check if its class loader matches what is expected. I also found that the TestClass is loaded by the system class loader in othervm mode and I fixed that as well. > 2. It might be nicer to have an accessor method for defined [eg: if > (cld[i].defineCalled() ]. > 3. It might be nicer to use flip to flip the buffer. > 4. While you are there, it might be good to eliminate the raw types > (change Class to Class etc.) > I cleaned up the test and the revised webrev is at: http://cr.openjdk.java.net/~mchung/6961502/webrev.01/ Mandy From Alan.Bateman at oracle.com Wed Jun 16 18:12:23 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Wed, 16 Jun 2010 19:12:23 +0100 Subject: Review request: TEST_BUG: test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails In-Reply-To: <4C18FD95.3040207@oracle.com> References: <4C17FD08.6080001@oracle.com> <4C18DD88.8050007@oracle.com> <4C18FD95.3040207@oracle.com> Message-ID: <4C191407.1060205@oracle.com> Mandy Chung wrote: > : > I removed the "defined" variable and instead check if its class loader > matches what is expected. I also found that the TestClass is loaded > by the system class loader in othervm mode and I fixed that as well. > I cleaned up the test and the revised webrev is at: > http://cr.openjdk.java.net/~mchung/6961502/webrev.01/ I kinda wondered if TestClass would be loaded by the expected loader in othervm mode. Anyway, the updated test looks fine to me. -Alan. From kumar.x.srinivasan at oracle.com Wed Jun 16 19:38:25 2010 From: kumar.x.srinivasan at oracle.com (kumar.x.srinivasan at oracle.com) Date: Wed, 16 Jun 2010 19:38:25 +0000 Subject: hg: jdk7/tl/jdk: 6575373: Error verifying signatures of pack200 files in some cases Message-ID: <20100616193905.C323D472CD@hg.openjdk.java.net> Changeset: 8a286789de96 Author: ksrini Date: 2010-06-16 12:36 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/8a286789de96 6575373: Error verifying signatures of pack200 files in some cases Reviewed-by: jrose, forax ! src/share/classes/com/sun/java/util/jar/pack/PropMap.java ! src/share/classes/java/util/jar/Pack200.java ! test/tools/pack200/Pack200Test.java + test/tools/pack200/SegmentLimit.java From mandy.chung at oracle.com Wed Jun 16 19:40:31 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Wed, 16 Jun 2010 19:40:31 +0000 Subject: hg: jdk7/tl/jdk: 6961502: TEST_BUG: test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails Message-ID: <20100616194050.DC8E4472CE@hg.openjdk.java.net> Changeset: 705777f990cf Author: mchung Date: 2010-06-16 12:40 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/705777f990cf 6961502: TEST_BUG: test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java fails Summary: Fix the test to define TestClass by DummyClassLoader as it intends to do Reviewed-by: alanb ! test/ProblemList.txt ! test/java/lang/ClassLoader/defineClass/DefineClassByteBuffer.java From lana.steuck at oracle.com Wed Jun 16 22:54:13 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Wed, 16 Jun 2010 22:54:13 +0000 Subject: hg: jdk7/tl: 2 new changesets Message-ID: <20100616225413.E1EBF472D7@hg.openjdk.java.net> Changeset: 5e197c942c6e Author: mikejwre Date: 2010-06-03 13:30 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/5e197c942c6e Added tag jdk7-b96 for changeset cf71cb515116 ! .hgtags Changeset: 5bbc7438b333 Author: mikejwre Date: 2010-06-10 13:58 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/5bbc7438b333 Added tag jdk7-b97 for changeset 5e197c942c6e ! .hgtags From lana.steuck at oracle.com Wed Jun 16 22:54:21 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Wed, 16 Jun 2010 22:54:21 +0000 Subject: hg: jdk7/tl/corba: 9 new changesets Message-ID: <20100616225428.289AA472D8@hg.openjdk.java.net> Changeset: c16ac7e7a579 Author: ohair Date: 2010-05-26 20:18 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/c16ac7e7a579 6956202: Fix a few missed rebranding issues, please contact lines etc. Reviewed-by: jjg, darcy, weijun ! src/share/classes/com/sun/corba/se/pept/package.html ! src/share/classes/com/sun/corba/se/spi/ior/package.html ! src/share/classes/com/sun/corba/se/spi/monitoring/package.html ! src/share/classes/javax/activity/package.html ! src/share/classes/javax/rmi/CORBA/package.html ! src/share/classes/javax/rmi/package.html ! src/share/classes/javax/transaction/package.html ! src/share/classes/javax/transaction/xa/package.html ! src/share/classes/org/omg/CORBA/DynAnyPackage/package.html ! src/share/classes/org/omg/CORBA/ORBPackage/package.html ! src/share/classes/org/omg/CORBA/portable/package.html ! src/share/classes/org/omg/IOP/CodecFactoryPackage/package.html ! src/share/classes/org/omg/IOP/CodecPackage/package.html ! src/share/classes/org/omg/IOP/package.html ! src/share/classes/org/omg/Messaging/package.html ! src/share/classes/org/omg/PortableInterceptor/ORBInitInfoPackage/package.html ! src/share/classes/org/omg/PortableInterceptor/package.html Changeset: 1b5234624436 Author: ohair Date: 2010-05-28 10:40 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/1b5234624436 6956930: Remove unused OS_VENDOR make variable Reviewed-by: trims ! make/common/shared/Platform.gmk Changeset: edc2a2659c77 Author: mikejwre Date: 2010-06-02 15:39 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/edc2a2659c77 Merge Changeset: 8c6e70ef006c Author: mikejwre Date: 2010-06-03 13:30 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/8c6e70ef006c Added tag jdk7-b96 for changeset edc2a2659c77 ! .hgtags Changeset: 1f87478a2d66 Author: lana Date: 2010-06-07 16:15 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/1f87478a2d66 Merge - make/com/sun/corba/minclude/ioser_io.jmk Changeset: 2657ee0d2d14 Author: andrew Date: 2010-06-03 19:37 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/2657ee0d2d14 6958257: Add support for alpha Summary: Allow the Zero port to be built on alpha architectures Reviewed-by: ohair ! make/common/Defs-linux.gmk Changeset: 4ec9d59374ca Author: mikejwre Date: 2010-06-09 18:56 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/4ec9d59374ca Merge Changeset: 3b99409057e4 Author: mikejwre Date: 2010-06-10 13:58 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/3b99409057e4 Added tag jdk7-b97 for changeset 4ec9d59374ca ! .hgtags Changeset: 8f0a1a30461d Author: lana Date: 2010-06-16 13:41 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/8f0a1a30461d Merge From lana.steuck at oracle.com Wed Jun 16 22:58:02 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Wed, 16 Jun 2010 22:58:02 +0000 Subject: hg: jdk7/tl/hotspot: 25 new changesets Message-ID: <20100616225857.6CBCF472DE@hg.openjdk.java.net> Changeset: 503a1a5856f1 Author: trims Date: 2010-05-27 12:40 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/503a1a5856f1 6956513: Bump the HS19 build number to 02 Summary: Update the HS19 build number to 02 Reviewed-by: jcoomes ! make/hotspot_version Changeset: 9d4dd91c4a0a Author: poonam Date: 2010-05-15 18:24 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/9d4dd91c4a0a 6745217: jmap assertion failure Summary: SA shows exception with core files > 2GB. These changes fix that by correcting the size of CMSBitmap during its allocation. Reviewed-by: swamyv ! agent/src/share/classes/sun/jvm/hotspot/memory/CMSBitMap.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java Changeset: 7ccc203eb6ff Author: dcubed Date: 2010-05-17 03:53 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/7ccc203eb6ff Merge Changeset: d3562366cbfd Author: dcubed Date: 2010-05-17 06:35 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/d3562366cbfd 6949515: 3/3 VM crash when calling GetMethodDeclaringClass Summary: Use resolve_external_guard() instead of resolve_non_null(). Reviewed-by: thurka, kamg, acorn ! src/share/vm/runtime/jniHandles.hpp Changeset: 892898e961c5 Author: dcubed Date: 2010-05-17 07:11 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/892898e961c5 Merge ! src/share/vm/runtime/jniHandles.hpp Changeset: 79bf863697eb Author: kvn Date: 2010-05-17 11:32 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/79bf863697eb 6951686: Using large pages on Linux prevents zero based compressed oops Summary: Use req_addr when attaching shared memory segment. Reviewed-by: twisti ! src/os/linux/vm/os_linux.cpp Changeset: bfe29ec02863 Author: never Date: 2010-05-17 16:50 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/bfe29ec02863 6950075: nmethod sweeper should operate concurrently Reviewed-by: never, kvn Contributed-by: eric.caspole at amd.com ! src/share/vm/code/codeCache.cpp ! src/share/vm/code/codeCache.hpp ! src/share/vm/code/nmethod.cpp ! src/share/vm/code/nmethod.hpp ! src/share/vm/compiler/compileBroker.cpp ! src/share/vm/runtime/globals.hpp ! src/share/vm/runtime/safepoint.cpp ! src/share/vm/runtime/sweeper.cpp ! src/share/vm/runtime/sweeper.hpp Changeset: c52275c698d1 Author: kvn Date: 2010-05-18 09:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/c52275c698d1 6953267: assert in EA code with -XX:+StressReflectiveCode Summary: Add missing checks into EA code. Reviewed-by: never ! src/share/vm/opto/escape.cpp Changeset: 99791ad65936 Author: never Date: 2010-05-18 13:45 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/99791ad65936 6953539: after 6892658 c1 reports that it doesn't inline StringBuffer.append Reviewed-by: kvn, twisti ! src/share/vm/c1/c1_GraphBuilder.cpp Changeset: b5fdf39b9749 Author: never Date: 2010-05-18 23:58 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/b5fdf39b9749 6953576: bottom_type for matched AddPNodes doesn't always agree with ideal Reviewed-by: kvn ! src/share/vm/adlc/formssel.cpp ! src/share/vm/adlc/formssel.hpp ! src/share/vm/adlc/output_c.cpp ! src/share/vm/adlc/output_h.cpp ! src/share/vm/opto/addnode.cpp ! src/share/vm/opto/addnode.hpp Changeset: eb79484f795f Author: kvn Date: 2010-04-05 10:17 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/eb79484f795f 6937111: Restore optimization for Phi of AddP (6552204) Summary: Restored the original code which was removed by the fix for 6614100. Reviewed-by: never ! src/share/vm/opto/cfgnode.cpp Changeset: 1a1603f975b5 Author: kvn Date: 2010-05-19 10:22 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/1a1603f975b5 Merge ! src/share/vm/opto/cfgnode.cpp Changeset: 1a88d3c58e1d Author: jrose Date: 2010-05-20 01:34 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/1a88d3c58e1d Merge ! src/share/vm/runtime/globals.hpp Changeset: cc387008223e Author: apetrusenko Date: 2010-05-14 10:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/cc387008223e 6921317: (partial) G1: assert(top() == bottom() || zfs == Allocated,"Region must be empty, or we must be setting it to Summary: Extended the failing assertion with the new message format to get more data. Reviewed-by: tonyp ! src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp ! src/share/vm/gc_implementation/g1/heapRegion.cpp Changeset: a00b51b2dda4 Author: ysr Date: 2010-05-17 00:47 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/a00b51b2dda4 6948539: CMS+UseCompressedOops: placement of cms_free bit interferes with promoted object link Summary: When using compressed oops, use compressed promoted pointers in b63:b31 of the mark word, so as not to interfere with the CMS "freeness bit" at b7. Updated mark-word layout documentation. Reviewed-by: minqi, poonam, jmasa, coleenp ! src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.hpp ! src/share/vm/oops/markOop.hpp Changeset: fb1a39993f69 Author: jcoomes Date: 2010-05-18 11:02 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/fb1a39993f69 6951319: enable solaris builds using Sun Studio 12 update 1 Reviewed-by: kamg, ysr, dholmes, johnc ! make/solaris/makefiles/amd64.make ! make/solaris/makefiles/fastdebug.make ! make/solaris/makefiles/i486.make ! make/solaris/makefiles/launcher.make ! make/solaris/makefiles/optimized.make ! make/solaris/makefiles/product.make ! make/solaris/makefiles/sparcWorks.make ! make/solaris/makefiles/vm.make ! src/cpu/sparc/vm/assembler_sparc.hpp ! src/cpu/sparc/vm/assembler_sparc.inline.hpp ! src/os_cpu/solaris_x86/vm/atomic_solaris_x86.inline.hpp ! src/os_cpu/solaris_x86/vm/solaris_x86_32.il ! src/os_cpu/solaris_x86/vm/solaris_x86_64.il ! src/share/vm/gc_implementation/g1/concurrentMark.cpp ! src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp ! src/share/vm/gc_implementation/shared/spaceDecorator.hpp ! src/share/vm/gc_implementation/shared/vmGCOperations.cpp ! src/share/vm/runtime/java.cpp ! src/share/vm/runtime/vframe.cpp ! src/share/vm/runtime/vm_version.cpp ! src/share/vm/utilities/dtrace.hpp Changeset: 15190cbcabe9 Author: ysr Date: 2010-05-19 10:37 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/15190cbcabe9 6953483: Typo related to ReduceInitialCardMarks leaves concurrent collectors vulnerable to heap corruption Summary: Corrected mis-spelling of COMPILER2 in #ifdef, which could cause heap corruption in CMS due to precleaning when +ReduceInitialCardMarks. Thanks to ChenGuang Sun for bringing this typo to our attention. Reviewed-by: tonyp, jmasa, jcoomes, kvn ! src/share/vm/gc_interface/collectedHeap.cpp Changeset: 1634cec09505 Author: ysr Date: 2010-05-19 16:05 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/1634cec09505 6953952: collectedHeap.cpp should use #ifdef _LP64 not LP64 Summary: Changed LP64 to _LP64 in collectedHeap.cpp. Reviewed-by: kvn, jcoomes ! src/share/vm/gc_interface/collectedHeap.cpp Changeset: c9a07413e82b Author: jcoomes Date: 2010-05-20 08:32 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/c9a07413e82b Merge ! src/share/vm/gc_implementation/g1/heapRegion.cpp Changeset: 7c6ae41266c5 Author: trims Date: 2010-05-27 12:42 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/7c6ae41266c5 Merge Changeset: c18cbe5936b8 Author: trims Date: 2010-05-27 19:08 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories Summary: Change all the Sun copyrights to Oracle copyright Reviewed-by: ohair ! ASSEMBLY_EXCEPTION ! LICENSE ! THIRD_PARTY_README ! agent/make/ClosureFinder.java ! agent/make/Makefile ! agent/make/bugspot.bat ! agent/make/build.xml ! agent/make/clhsdbproc.sh ! agent/make/clhsdbproc64.sh ! agent/make/clhsdbwindbg.bat ! agent/make/clhsdbwindbg64.bat ! agent/make/dumpflagsproc.sh ! agent/make/dumpflagsproc64.sh ! agent/make/dumpflagswindbg.bat ! agent/make/dumpflagswindbg64.bat ! agent/make/dumpsyspropsproc.sh ! agent/make/dumpsyspropsproc64.sh ! agent/make/dumpsyspropswindbg.bat ! agent/make/dumpsyspropswindbg64.bat ! agent/make/finalizerinfoproc.sh ! agent/make/finalizerinfoproc64.sh ! agent/make/finalizerinfowindbg.bat ! agent/make/finalizerinfowindbg64.bat ! agent/make/grantAll.policy ! agent/make/heapdumpproc.sh ! agent/make/heapdumpproc64.sh ! agent/make/heapdumpwindbg.bat ! agent/make/heapdumpwindbg64.bat ! agent/make/heapsumproc.sh ! agent/make/heapsumproc64.sh ! agent/make/heapsumwindbg.bat ! agent/make/heapsumwindbg64.bat ! agent/make/hsdb.bat ! agent/make/hsdb.sh ! agent/make/hsdbproc.sh ! agent/make/hsdbproc64.sh ! agent/make/hsdbwindbg.bat ! agent/make/hsdbwindbg64.bat ! agent/make/jcoreproc.sh ! agent/make/jcoreproc64.sh ! agent/make/jcorewindbg.bat ! agent/make/jcorewindbg64.bat ! agent/make/jdbcore.sh ! agent/make/jdbcore64.sh ! agent/make/jdbproc.sh ! agent/make/jdbproc64.sh ! agent/make/jhistoproc.sh ! agent/make/jhistoproc64.sh ! agent/make/jhistowindbg.bat ! agent/make/jhistowindbg64.bat ! agent/make/jsdbproc.sh ! agent/make/jsdbproc64.sh ! agent/make/jsdbwindbg.bat ! agent/make/jsdbwindbg64.bat ! agent/make/jstackproc.sh ! agent/make/jstackproc64.sh ! agent/make/jstackwindbg.bat ! agent/make/jstackwindbg64.bat ! agent/make/permstatproc.sh ! agent/make/permstatproc64.sh ! agent/make/permstatwindbg.bat ! agent/make/permstatwindbg64.bat ! agent/make/pmapproc.sh ! agent/make/pmapproc64.sh ! agent/make/pmapwindbg.bat ! agent/make/pmapwindbg64.bat ! agent/make/pstackproc.sh ! agent/make/pstackproc64.sh ! agent/make/pstackwindbg.bat ! agent/make/pstackwindbg64.bat ! agent/make/saenv.bat ! agent/make/saenv.sh ! agent/make/saenv64.bat ! agent/make/saenv64.sh ! agent/make/soqlproc.sh ! agent/make/soqlproc64.sh ! agent/make/soqlwindbg.bat ! agent/make/soqlwindbg64.bat ! agent/make/start-debug-server-proc.sh ! agent/make/start-debug-server-proc64.sh ! agent/make/start-debug-server-windbg.bat ! agent/make/start-debug-server-windbg64.bat ! agent/make/start-rmiregistry.bat ! agent/make/start-rmiregistry.sh ! agent/src/os/linux/LinuxDebuggerLocal.c ! agent/src/os/linux/Makefile ! agent/src/os/linux/elfmacros.h ! agent/src/os/linux/libproc.h ! agent/src/os/linux/libproc_impl.c ! agent/src/os/linux/libproc_impl.h ! agent/src/os/linux/mapfile ! agent/src/os/linux/proc_service.h ! agent/src/os/linux/ps_core.c ! agent/src/os/linux/ps_proc.c ! agent/src/os/linux/salibelf.c ! agent/src/os/linux/salibelf.h ! agent/src/os/linux/symtab.c ! agent/src/os/linux/symtab.h ! agent/src/os/linux/test.c ! agent/src/os/solaris/Makefile ! agent/src/os/solaris/dbx/Makefile ! agent/src/os/solaris/dbx/helloWorld.cpp ! agent/src/os/solaris/dbx/proc_service_2.h ! agent/src/os/solaris/dbx/shell_imp.h ! agent/src/os/solaris/dbx/svc_agent_dbx.cpp ! agent/src/os/solaris/dbx/svc_agent_dbx.hpp ! agent/src/os/solaris/proc/Makefile ! agent/src/os/solaris/proc/libproc.h ! agent/src/os/solaris/proc/mapfile ! agent/src/os/solaris/proc/salibproc.h ! agent/src/os/solaris/proc/saproc.cpp ! agent/src/os/solaris/proc/saproc_audit.cpp ! agent/src/os/win32/BasicList.hpp ! agent/src/os/win32/Buffer.cpp ! agent/src/os/win32/Buffer.hpp ! agent/src/os/win32/Dispatcher.cpp ! agent/src/os/win32/Dispatcher.hpp ! agent/src/os/win32/Handler.hpp ! agent/src/os/win32/IOBuf.cpp ! agent/src/os/win32/IOBuf.hpp ! agent/src/os/win32/LockableList.hpp ! agent/src/os/win32/Makefile ! agent/src/os/win32/Message.hpp ! agent/src/os/win32/Monitor.cpp ! agent/src/os/win32/Monitor.hpp ! agent/src/os/win32/Reaper.cpp ! agent/src/os/win32/Reaper.hpp ! agent/src/os/win32/SwDbgSrv.cpp ! agent/src/os/win32/SwDbgSub.cpp ! agent/src/os/win32/initWinsock.cpp ! agent/src/os/win32/initWinsock.hpp ! agent/src/os/win32/ioUtils.cpp ! agent/src/os/win32/ioUtils.hpp ! agent/src/os/win32/isNT4.cpp ! agent/src/os/win32/isNT4.hpp ! agent/src/os/win32/libInfo.cpp ! agent/src/os/win32/libInfo.hpp ! agent/src/os/win32/nt4internals.cpp ! agent/src/os/win32/nt4internals.hpp ! agent/src/os/win32/ports.h ! agent/src/os/win32/procList.cpp ! agent/src/os/win32/procList.hpp ! agent/src/os/win32/serverLists.cpp ! agent/src/os/win32/serverLists.hpp ! agent/src/os/win32/toolHelp.cpp ! agent/src/os/win32/toolHelp.hpp ! agent/src/os/win32/windbg/Makefile ! agent/src/os/win32/windbg/sawindbg.cpp ! agent/src/scripts/README ! agent/src/scripts/start-debug-server.bat ! agent/src/scripts/start-debug-server.sh ! agent/src/scripts/start-debug-server64.sh ! agent/src/scripts/start-rmiregistry.bat ! agent/src/scripts/start-rmiregistry.sh ! agent/src/scripts/start-rmiregistry64.sh ! agent/src/share/classes/com/sun/java/swing/action/AboutAction.java ! agent/src/share/classes/com/sun/java/swing/action/ActionManager.java ! agent/src/share/classes/com/sun/java/swing/action/ActionUtilities.java ! agent/src/share/classes/com/sun/java/swing/action/AlignCenterAction.java ! agent/src/share/classes/com/sun/java/swing/action/AlignLeftAction.java ! agent/src/share/classes/com/sun/java/swing/action/AlignRightAction.java ! agent/src/share/classes/com/sun/java/swing/action/ApplyAction.java ! agent/src/share/classes/com/sun/java/swing/action/BackAction.java ! agent/src/share/classes/com/sun/java/swing/action/CancelAction.java ! agent/src/share/classes/com/sun/java/swing/action/DelegateAction.java ! agent/src/share/classes/com/sun/java/swing/action/ExitAction.java ! agent/src/share/classes/com/sun/java/swing/action/FileMenu.java ! agent/src/share/classes/com/sun/java/swing/action/FinishAction.java ! agent/src/share/classes/com/sun/java/swing/action/HelpAction.java ! agent/src/share/classes/com/sun/java/swing/action/HelpMenu.java ! agent/src/share/classes/com/sun/java/swing/action/NewAction.java ! agent/src/share/classes/com/sun/java/swing/action/NextAction.java ! agent/src/share/classes/com/sun/java/swing/action/OkAction.java ! agent/src/share/classes/com/sun/java/swing/action/OpenAction.java ! agent/src/share/classes/com/sun/java/swing/action/SaveAction.java ! agent/src/share/classes/com/sun/java/swing/action/SaveAsAction.java ! agent/src/share/classes/com/sun/java/swing/action/StateChangeAction.java ! agent/src/share/classes/com/sun/java/swing/action/ViewMenu.java ! agent/src/share/classes/com/sun/java/swing/ui/CommonMenuBar.java ! agent/src/share/classes/com/sun/java/swing/ui/CommonToolBar.java ! agent/src/share/classes/com/sun/java/swing/ui/CommonUI.java ! agent/src/share/classes/com/sun/java/swing/ui/OkCancelButtonPanel.java ! agent/src/share/classes/com/sun/java/swing/ui/OkCancelDialog.java ! agent/src/share/classes/com/sun/java/swing/ui/SplashScreen.java ! agent/src/share/classes/com/sun/java/swing/ui/StatusBar.java ! agent/src/share/classes/com/sun/java/swing/ui/TabsDlg.java ! agent/src/share/classes/com/sun/java/swing/ui/ToggleActionPropertyChangeListener.java ! agent/src/share/classes/com/sun/java/swing/ui/WizardDlg.java ! agent/src/share/classes/sun/jvm/hotspot/CLHSDB.java ! agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java ! agent/src/share/classes/sun/jvm/hotspot/DebugServer.java ! agent/src/share/classes/sun/jvm/hotspot/HSDB.java ! agent/src/share/classes/sun/jvm/hotspot/HelloWorld.java ! agent/src/share/classes/sun/jvm/hotspot/HotSpotAgent.java ! agent/src/share/classes/sun/jvm/hotspot/HotSpotSolarisVtblAccess.java ! agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java ! agent/src/share/classes/sun/jvm/hotspot/LinuxVtblAccess.java ! agent/src/share/classes/sun/jvm/hotspot/ObjectHistogram.java ! agent/src/share/classes/sun/jvm/hotspot/RMIHelper.java ! agent/src/share/classes/sun/jvm/hotspot/SALauncherLoader.java ! agent/src/share/classes/sun/jvm/hotspot/StackTrace.java ! agent/src/share/classes/sun/jvm/hotspot/TestDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/Win32VtblAccess.java ! agent/src/share/classes/sun/jvm/hotspot/asm/AbstractInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/Address.java ! agent/src/share/classes/sun/jvm/hotspot/asm/Arithmetic.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ArithmeticInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/BaseIndexScaleDispAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/BranchInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/CPUHelper.java ! agent/src/share/classes/sun/jvm/hotspot/asm/CallInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/DirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/Disassembler.java ! agent/src/share/classes/sun/jvm/hotspot/asm/DummySymbolFinder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/Immediate.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ImmediateOrRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/IndirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/Instruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/InstructionVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/asm/LoadInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/LogicInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/MemoryInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/MoveInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/Operand.java ! agent/src/share/classes/sun/jvm/hotspot/asm/PCRelativeAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/RTLDataTypes.java ! agent/src/share/classes/sun/jvm/hotspot/asm/RTLOperations.java ! agent/src/share/classes/sun/jvm/hotspot/asm/Register.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ReturnInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ShiftInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/StoreInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/SymbolFinder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64FloatRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64FloatRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64Helper.java ! agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64Register.java ! agent/src/share/classes/sun/jvm/hotspot/asm/amd64/AMD64Registers.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ia64/IA64FloatRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ia64/IA64FloatRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ia64/IA64Helper.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ia64/IA64Register.java ! agent/src/share/classes/sun/jvm/hotspot/asm/ia64/IA64Registers.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/AlternateSpaceLdstubDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/AlternateSpaceLoadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/AlternateSpaceStoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/AlternateSpaceSwapDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/ArithmeticDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/BranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/CallDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/CoprocessorBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/CoprocessorDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/FP2RegisterDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/FPArithmeticDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/FPMoveDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/FPopDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/FloatBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/FloatDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/FlushDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/Format3ADecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/IllegalInstructionDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/InstructionDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/IntegerBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/JmplDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/LdstubDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/LoadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/LogicDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/MemoryInstructionDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/ReadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/ReadWriteDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/RegisterDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/RestoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/RettDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCArgument.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCArithmeticInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCAtomicLoadStoreInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCBranchInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCCallInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCDisassembler.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCFP2RegisterInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCFPArithmeticInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCFPMoveInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCFloatRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCFloatRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCFlushInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCFormat3AInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCHelper.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCIllegalInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCIndirectCallInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCInstructionFactory.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCInstructionFactoryImpl.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCJmplInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCLdstubInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCLoadInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCLogicInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCMemoryInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCMoveInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCNoopInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCOpcodes.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCReadInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCRegisterIndirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCRegisterType.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCRestoreInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCRettInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCReturnInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCSaveInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCSethiInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCShiftInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCSpecialLoadInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCSpecialRegisterInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCSpecialRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCSpecialStoreInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCStbarInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCStoreInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCSwapInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCTrapInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCUnimpInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV8Disassembler.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9BranchInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9CasInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9ConditionFlags.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9Disassembler.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9DoneInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9FMOVccInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9FMOVrInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9FlushwInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9IlltrapInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9ImpdepInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9Instruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9InstructionFactory.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9InstructionFactoryImpl.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9MOVccInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9MOVrInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9MembarInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9Opcodes.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9PopcInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9PrefetchInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9PrivilegedRegisterInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9PrivilegedRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9RdprInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9ReadInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9RegisterBranchInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9RegisterIndirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9RestoredInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9RetryInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9ReturnInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9SavedInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9SirInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9SpecialRegisterInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9SpecialRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9WriteInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCV9WrprInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SPARCWriteInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SaveDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SethiDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/ShiftDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SpecialLoadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SpecialLoadStoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SpecialStoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/StoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/SwapDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/TrapDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/UnimpDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V8FPop1Decoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V8FPop2Decoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9AlternateSpaceDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9AlternateSpaceLdstubDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9AlternateSpaceLoadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9AlternateSpacePrefetchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9AlternateSpaceStoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9AlternateSpaceSwapDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9BranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9CCBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9CMoveDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9CasDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9DoneRetryDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9FMOVccDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9FMOVrDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9FPop1Decoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9FPop2Decoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9FloatBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9FlushwDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9InstructionDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9IntRegisterBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9IntegerBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9MOVccDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9MOVrDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9PopcDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9PrefetchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9PrivilegedReadWriteDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9RdprDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9ReadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9RegisterBranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9SavedRestoredDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9ShiftDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9SpecialLoadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9SpecialStoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9WriteDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/V9WrprDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/sparc/WriteDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/ArithmeticDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/BranchDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/CallDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/ConditionalJmpDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/FPArithmeticDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/FPInstructionDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/FPLoadDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/FPStoreDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/FloatDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/FloatGRPDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/GRPDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/InstructionDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/JmpDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/LogicalDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/MoveDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/RotateDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/SSEArithmeticDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/SSEInstructionDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/SSELogicalDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/SSEMoveDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/SSEShiftDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/ShiftDecoder.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86ArithmeticInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86BranchInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86CallInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86CondJmpInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86DirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86Disassembler.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86FPArithmeticInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86FPInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86FPLoadInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86FPStoreInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86FloatRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86FloatRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86GeneralInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86Helper.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86IllegalInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86Instruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86InstructionFactory.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86InstructionFactoryImpl.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86JmpInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86LogicInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86MMXRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86MMXRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86MemoryIndirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86MemoryInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86MoveInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86MoveLoadInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86MoveStoreInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86Opcodes.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86PCRelativeAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86Register.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86RegisterDirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86RegisterIndirectAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86RegisterPart.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86Registers.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86RotateInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86SegmentRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86SegmentRegisterAddress.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86SegmentRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86ShiftInstruction.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86XMMRegister.java ! agent/src/share/classes/sun/jvm/hotspot/asm/x86/X86XMMRegisters.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpot.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/BugSpotAgent.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/JavaLineNumberInfo.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/Main.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/PCFinder.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/PackageScanner.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/RegisterPanel.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTraceEntry.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/StackTracePanel.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/ThreadListPanel.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/VariablePanel.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/AddressTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/DoubleTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/EnumTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FieldTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/FloatTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/LongTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/bugspot/tree/ObjectTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/c1/Runtime1.java ! agent/src/share/classes/sun/jvm/hotspot/code/BufferBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/CodeBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/CodeCache.java ! agent/src/share/classes/sun/jvm/hotspot/code/CodeCacheVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/code/CompressedReadStream.java ! agent/src/share/classes/sun/jvm/hotspot/code/CompressedStream.java ! agent/src/share/classes/sun/jvm/hotspot/code/CompressedWriteStream.java ! agent/src/share/classes/sun/jvm/hotspot/code/ConstantDoubleValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/ConstantIntValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/ConstantLongValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/ConstantOopReadValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/DebugInfoReadStream.java ! agent/src/share/classes/sun/jvm/hotspot/code/DebugInformationRecorder.java ! agent/src/share/classes/sun/jvm/hotspot/code/DeoptimizationBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/ExceptionBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/Location.java ! agent/src/share/classes/sun/jvm/hotspot/code/LocationValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/MonitorValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java ! agent/src/share/classes/sun/jvm/hotspot/code/ObjectValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/PCDesc.java ! agent/src/share/classes/sun/jvm/hotspot/code/RuntimeStub.java ! agent/src/share/classes/sun/jvm/hotspot/code/SafepointBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/ScopeDesc.java ! agent/src/share/classes/sun/jvm/hotspot/code/ScopeValue.java ! agent/src/share/classes/sun/jvm/hotspot/code/SingletonBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/Stub.java ! agent/src/share/classes/sun/jvm/hotspot/code/StubQueue.java ! agent/src/share/classes/sun/jvm/hotspot/code/UncommonTrapBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/VMRegImpl.java ! agent/src/share/classes/sun/jvm/hotspot/compiler/OopMap.java ! agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapSet.java ! agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapStream.java ! agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapValue.java ! agent/src/share/classes/sun/jvm/hotspot/compiler/OopMapVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/Address.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/AddressException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/DataSource.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/Debugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerBase.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/DebuggerUtilities.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/InputLexer.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/JVMDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/LongHashMap.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescription.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionAMD64.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIA64.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionIntelX86.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC32Bit.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionSPARC64Bit.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MachineDescriptionTwosComplement.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/MappedByteBufferDataSource.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/NoSuchSymbolException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/NotInHeapException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/OopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/Page.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/PageCache.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/PageFetcher.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/ProcessInfo.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/RandomAccessFileDataSource.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/ReadResult.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/SymbolLookup.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/ThreadAccess.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/ThreadProxy.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/UnalignedAddressException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/UnmappedAddressException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/amd64/AMD64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/AccessControl.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/ArrayType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/BaseClass.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/BitType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/BlockSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CDebugInfoDataBase.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CVAttributes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/ClosestSymbol.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/CompoundType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/DebugEvent.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/DefaultObjectVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/DoubleType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/EnumType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/Field.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/FieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/FloatType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/FunctionSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/FunctionType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/GlobalSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/IndexableFieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/IntType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/LineNumberInfo.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/LineNumberVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/LoadObject.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/LoadObjectComparator.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/LocalSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/MemberFunctionType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/NamedFieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/ObjectVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/PointerType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/ProcessControl.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/RefType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/Sym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/TemplateType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/Type.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/TypeVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/VoidType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicArrayType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicBaseClass.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicBitType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicBlockSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicCDebugInfoDataBase.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicCFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicCompoundType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicDebugEvent.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicDoubleType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicEnumType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicField.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicFloatType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicFunctionSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicFunctionType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicGlobalSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicIndexableFieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicIntType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicLineNumberInfo.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicLineNumberMapping.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicLocalSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicMemberFunctionType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicNamedFieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicPointerType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicRefType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/BasicVoidType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/CompoundTypeKind.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/LazyBlockSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/LazyType.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/ResolveListener.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/amd64/AMD64CFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/cdbg/basic/x86/X86CFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxAddress.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxDebuggerLocal.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxOopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/DbxThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/sparc/DbxSPARCThread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/sparc/DbxSPARCThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/sparc/DbxSPARCThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/x86/DbxX86Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/x86/DbxX86ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dbx/x86/DbxX86ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyAddress.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/dummy/DummyOopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/ia64/IA64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxAddress.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxCDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxDebuggerLocal.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxOopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxThread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/LinuxThreadContextFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/SharedObject.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64CFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/amd64/LinuxAMD64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/ia64/LinuxIA64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCCFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/sparc/LinuxSPARCThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86CFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/linux/x86/LinuxX86ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/AddressDataSource.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/DSO.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFFile.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFFileParser.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFHashTable.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFHeader.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFProgramHeader.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFSectionHeader.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFStringTable.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/posix/elf/ELFSymbol.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcAddress.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcCFrame.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcDebuggerLocal.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcOopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/ProcThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/SharedObject.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/amd64/ProcAMD64Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/amd64/ProcAMD64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/amd64/ProcAMD64ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/sparc/ProcSPARCThread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/sparc/ProcSPARCThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/sparc/ProcSPARCThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/x86/ProcX86Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/x86/ProcX86ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/proc/x86/ProcX86ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteAddress.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerClient.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteDebuggerServer.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteOopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteThread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/RemoteThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/amd64/RemoteAMD64Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/amd64/RemoteAMD64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/amd64/RemoteAMD64ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/sparc/RemoteSPARCThread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/sparc/RemoteSPARCThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/sparc/RemoteSPARCThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/remote/x86/RemoteX86ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/sparc/SPARCThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/AddressDataSource.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/DLL.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/TestDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/TestHelloWorld.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Address.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32CDebugInfoBuilder.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32CDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Debugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32DebuggerLocal.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32LDTEntry.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32LDTEntryConstants.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32OopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/Win32ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/AuxBfEfRecord.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/AuxFileRecord.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/AuxFunctionDefinitionRecord.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/AuxSectionDefinitionsRecord.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/AuxSymbolRecord.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/AuxWeakExternalRecord.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFFile.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFFileParser.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFHeader.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFLineNumber.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFRelocation.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFSymbol.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COFFSymbolConstants.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/COMDATSelectionTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/Characteristics.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DLLCharacteristics.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DataDirectory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugDirectory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugDirectoryEntry.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50MemberAttributes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50ReservedTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSAlignSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSFileIndex.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSGlobalPub.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSGlobalSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSGlobalTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSLibraries.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSMPC.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSModule.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSOffsetMap16.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSOffsetMap32.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSPreComp.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSPublic.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSPublicSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSSegMap.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSSegName.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSSrcLnSeg.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSSrcModule.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSStaticSym.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSSymbolBase.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSSymbols.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SSTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SegDesc.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SegDescEnums.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SegInfo.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SrcModFileDesc.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SrcModLineNumberMap.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50Subsection.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SubsectionDirectory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SubsectionTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SymbolEnums.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SymbolIterator.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50SymbolTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50TypeEnums.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50TypeIterator.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50TypeLeafIndices.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50WrongNumericTypeException.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DebugVC50X86RegisterEnums.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/DumpExports.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/ExportDirectoryTable.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/MachineTypes.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/OptionalHeader.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/OptionalHeaderDataDirectories.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/OptionalHeaderStandardFields.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/OptionalHeaderWindowsSpecificFields.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/SectionFlags.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/SectionHeader.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/TestDebugInfo.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/TestParser.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/TypeIndicators.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/win32/coff/WindowsNTSubsystem.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/AddressDataSource.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/DLL.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgAddress.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgCDebugInfoBuilder.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgCDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebugger.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgOopHandle.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/amd64/WindbgAMD64Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/amd64/WindbgAMD64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/amd64/WindbgAMD64ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/ia64/WindbgIA64Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/ia64/WindbgIA64ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/ia64/WindbgIA64ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/x86/WindbgX86Thread.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/x86/WindbgX86ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/windbg/x86/WindbgX86ThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/debugger/x86/X86ThreadContext.java ! agent/src/share/classes/sun/jvm/hotspot/gc_implementation/parallelScavenge/PSOldGen.java ! agent/src/share/classes/sun/jvm/hotspot/gc_implementation/parallelScavenge/PSPermGen.java ! agent/src/share/classes/sun/jvm/hotspot/gc_implementation/parallelScavenge/PSYoungGen.java ! agent/src/share/classes/sun/jvm/hotspot/gc_implementation/parallelScavenge/ParallelScavengeHeap.java ! agent/src/share/classes/sun/jvm/hotspot/gc_implementation/shared/ImmutableSpace.java ! agent/src/share/classes/sun/jvm/hotspot/gc_implementation/shared/MutableSpace.java ! agent/src/share/classes/sun/jvm/hotspot/gc_interface/CollectedHeap.java ! agent/src/share/classes/sun/jvm/hotspot/gc_interface/CollectedHeapName.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/Bytecode.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeANewArray.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeBipush.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeCheckCast.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeDisassembler.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeFastAAccess0.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeFastIAccess0.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeGetField.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeGetPut.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeGetStatic.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeGoto.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeGotoW.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeIf.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeIinc.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeInstanceOf.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeInvoke.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeJmp.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeJsr.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeJsrW.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoad.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadConstant.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLoadStore.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeLookupswitch.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeMultiANewArray.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeNew.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeNewArray.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodePutField.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodePutStatic.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeRet.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeSipush.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeStore.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeStream.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeTableswitch.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWideable.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWithCPIndex.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/BytecodeWithKlass.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/Bytecodes.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/Interpreter.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/InterpreterCodelet.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/LookupswitchPair.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/MaskFillerForNative.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/OffsetClosure.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/OopMapCacheEntry.java ! agent/src/share/classes/sun/jvm/hotspot/interpreter/OopMapForCacheEntry.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ArrayReferenceImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ArrayTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/BaseLineInfo.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/BooleanTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/BooleanValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ByteTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ByteValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/CharTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/CharValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ClassLoaderReferenceImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ClassObjectReferenceImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ClassTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ConcreteMethodImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ConnectorImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/DoubleTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/DoubleValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/FieldImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/FloatTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/FloatValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/IntegerTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/IntegerValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/InterfaceTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/JNITypeParser.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/JVMTIThreadState.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/LineInfo.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/LocalVariableImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/LocationImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/LongTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/LongValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/MethodImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/MirrorImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/MonitorInfoImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/NonConcreteMethodImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ObjectReferenceImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/PrimitiveTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/PrimitiveValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ReferenceTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/SACoreAttachingConnector.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/SADebugServer.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/SADebugServerAttachingConnector.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/SAJDIClassLoader.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/SAPIDAttachingConnector.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/SDE.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ShortTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ShortValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/StackFrameImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/StratumLineInfo.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/StringReferenceImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ThreadGroupReferenceImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ThreadReferenceImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/TypeComponentImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/TypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/VMModifiers.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ValueContainer.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/ValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/VirtualMachineImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/VoidTypeImpl.java ! agent/src/share/classes/sun/jvm/hotspot/jdi/VoidValueImpl.java ! agent/src/share/classes/sun/jvm/hotspot/livejvm/BreakpointEvent.java ! agent/src/share/classes/sun/jvm/hotspot/livejvm/CIntegerAccessor.java ! agent/src/share/classes/sun/jvm/hotspot/livejvm/CStringAccessor.java ! agent/src/share/classes/sun/jvm/hotspot/livejvm/Event.java ! agent/src/share/classes/sun/jvm/hotspot/livejvm/ExceptionEvent.java ! agent/src/share/classes/sun/jvm/hotspot/livejvm/JNIHandleAccessor.java ! agent/src/share/classes/sun/jvm/hotspot/livejvm/ServiceabilityAgentJVMDIModule.java ! agent/src/share/classes/sun/jvm/hotspot/memory/BinaryTreeDictionary.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CMSBitMap.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CMSCollector.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CMSPermGen.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CMSPermGenGen.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CardGeneration.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CodeHeap.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleSpace.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CompactingPermGen.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CompactingPermGenGen.java ! agent/src/share/classes/sun/jvm/hotspot/memory/ConcurrentMarkSweepGeneration.java ! agent/src/share/classes/sun/jvm/hotspot/memory/ContigPermSpace.java ! agent/src/share/classes/sun/jvm/hotspot/memory/ContiguousSpace.java ! agent/src/share/classes/sun/jvm/hotspot/memory/DefNewGeneration.java ! agent/src/share/classes/sun/jvm/hotspot/memory/Dictionary.java ! agent/src/share/classes/sun/jvm/hotspot/memory/DictionaryEntry.java ! agent/src/share/classes/sun/jvm/hotspot/memory/EdenSpace.java ! agent/src/share/classes/sun/jvm/hotspot/memory/FreeChunk.java ! agent/src/share/classes/sun/jvm/hotspot/memory/FreeList.java ! agent/src/share/classes/sun/jvm/hotspot/memory/GenCollectedHeap.java ! agent/src/share/classes/sun/jvm/hotspot/memory/Generation.java ! agent/src/share/classes/sun/jvm/hotspot/memory/GenerationFactory.java ! agent/src/share/classes/sun/jvm/hotspot/memory/GenerationIsInClosure.java ! agent/src/share/classes/sun/jvm/hotspot/memory/GenerationSpec.java ! agent/src/share/classes/sun/jvm/hotspot/memory/HeapBlock.java ! agent/src/share/classes/sun/jvm/hotspot/memory/LinearAllocBlock.java ! agent/src/share/classes/sun/jvm/hotspot/memory/LoaderConstraintEntry.java ! agent/src/share/classes/sun/jvm/hotspot/memory/LoaderConstraintTable.java ! agent/src/share/classes/sun/jvm/hotspot/memory/MemRegion.java ! agent/src/share/classes/sun/jvm/hotspot/memory/OffsetTableContigSpace.java ! agent/src/share/classes/sun/jvm/hotspot/memory/OneContigSpaceCardGeneration.java ! agent/src/share/classes/sun/jvm/hotspot/memory/ParNewGeneration.java ! agent/src/share/classes/sun/jvm/hotspot/memory/PermGen.java ! agent/src/share/classes/sun/jvm/hotspot/memory/PlaceholderEntry.java ! agent/src/share/classes/sun/jvm/hotspot/memory/PlaceholderTable.java ! agent/src/share/classes/sun/jvm/hotspot/memory/ProtectionDomainEntry.java ! agent/src/share/classes/sun/jvm/hotspot/memory/SharedHeap.java ! agent/src/share/classes/sun/jvm/hotspot/memory/Space.java ! agent/src/share/classes/sun/jvm/hotspot/memory/SpaceClosure.java ! agent/src/share/classes/sun/jvm/hotspot/memory/StringTable.java ! agent/src/share/classes/sun/jvm/hotspot/memory/SymbolTable.java ! agent/src/share/classes/sun/jvm/hotspot/memory/SystemDictionary.java ! agent/src/share/classes/sun/jvm/hotspot/memory/TenuredGeneration.java ! agent/src/share/classes/sun/jvm/hotspot/memory/TenuredSpace.java ! agent/src/share/classes/sun/jvm/hotspot/memory/Universe.java ! agent/src/share/classes/sun/jvm/hotspot/oops/AccessFlags.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Array.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ArrayKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ArrayKlassKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/BooleanField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/BreakpointInfo.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ByteField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CIntField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CellTypeState.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CellTypeStateList.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CharField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CheckedExceptionElement.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CompiledICHolder.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CompiledICHolderKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/CompressedLineNumberReadStream.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethod.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ConstMethodKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPoolCache.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPoolCacheEntry.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPoolCacheKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPoolKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/DefaultHeapVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/oops/DefaultOopVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/oops/DoubleField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Field.java ! agent/src/share/classes/sun/jvm/hotspot/oops/FieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/oops/FieldType.java ! agent/src/share/classes/sun/jvm/hotspot/oops/FloatField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/GenerateOopMap.java ! agent/src/share/classes/sun/jvm/hotspot/oops/HeapPrinter.java ! agent/src/share/classes/sun/jvm/hotspot/oops/HeapVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/oops/IndexableFieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Instance.java ! agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/InstanceKlassKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/IntField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/JVMDIClassStatus.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Klass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/KlassKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/LineNumberTableElement.java ! agent/src/share/classes/sun/jvm/hotspot/oops/LocalVariableTableElement.java ! agent/src/share/classes/sun/jvm/hotspot/oops/LongField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Mark.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Method.java ! agent/src/share/classes/sun/jvm/hotspot/oops/MethodData.java ! agent/src/share/classes/sun/jvm/hotspot/oops/MethodDataKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/MethodKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/MutationException.java ! agent/src/share/classes/sun/jvm/hotspot/oops/NamedFieldIdentifier.java ! agent/src/share/classes/sun/jvm/hotspot/oops/NarrowOopField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ObjArray.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ObjArrayKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ObjArrayKlassKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHeap.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogram.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ObjectHistogramElement.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java ! agent/src/share/classes/sun/jvm/hotspot/oops/OopField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/OopPrinter.java ! agent/src/share/classes/sun/jvm/hotspot/oops/OopUtilities.java ! agent/src/share/classes/sun/jvm/hotspot/oops/OopVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/oops/RawHeapVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/oops/ShortField.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Symbol.java ! agent/src/share/classes/sun/jvm/hotspot/oops/SymbolKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/TypeArray.java ! agent/src/share/classes/sun/jvm/hotspot/oops/TypeArrayKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/TypeArrayKlassKlass.java ! agent/src/share/classes/sun/jvm/hotspot/oops/UnknownOopException.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/AddressVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ArgumentSizeComputer.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/Arguments.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/BasicLock.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/BasicObjectLock.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/BasicType.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/BasicTypeSize.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/Bytes.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ClassConstants.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/CompiledVFrame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/CompilerThread.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ConcurrentLocksPrinter.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ConstructionException.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/DeadlockDetector.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ExternalVFrame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/Frame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/InterpretedVFrame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JNIHandleBlock.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JNIHandles.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JNIid.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JavaCallWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThread.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThreadFactory.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JavaThreadState.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JavaVFrame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/JvmtiAgentThread.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/LowMemoryDetectorThread.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/MonitorInfo.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/NativeSignatureIterator.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/OSThread.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ObjectMonitor.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ObjectSynchronizer.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/PerfDataEntry.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/PerfDataPrologue.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/PerfMemory.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/RegisterMap.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ResultTypeFinder.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/SignatureConverter.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/SignatureInfo.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/SignatureIterator.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/StackFrameStream.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/StackValue.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/StackValueCollection.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/StubRoutines.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/Thread.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ThreadLocalAllocBuffer.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/Threads.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VFrame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VMObject.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VMObjectFactory.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VMReg.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VMVersionMismatchException.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VirtualConstructor.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VirtualSpace.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/WatcherThread.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64CurrentFrameGuess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64Frame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64JavaCallWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/amd64/AMD64RegisterMap.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ia64/IA64CurrentFrameGuess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ia64/IA64Frame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ia64/IA64JavaCallWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ia64/IA64RegisterMap.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/ia64/cInterpreter.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/linux/LinuxSignals.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/linux_amd64/LinuxAMD64JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/linux_ia64/LinuxIA64JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/linux_sparc/LinuxSPARCJavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxSignals.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/linux_x86/LinuxX86JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/posix/POSIXSignals.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_amd64/SolarisAMD64JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_sparc/SolarisSPARCJavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/solaris_x86/SolarisX86JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCFrame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/sparc/SPARCRegisterMap.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/win32_amd64/Win32AMD64JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/win32_ia64/Win32IA64JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/win32_x86/Win32X86JavaThreadPDAccess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86CurrentFrameGuess.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86Frame.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86JavaCallWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/x86/X86RegisterMap.java ! agent/src/share/classes/sun/jvm/hotspot/tools/FinalizerInfo.java ! agent/src/share/classes/sun/jvm/hotspot/tools/FlagDumper.java ! agent/src/share/classes/sun/jvm/hotspot/tools/HeapDumper.java ! agent/src/share/classes/sun/jvm/hotspot/tools/HeapSummary.java ! agent/src/share/classes/sun/jvm/hotspot/tools/JInfo.java ! agent/src/share/classes/sun/jvm/hotspot/tools/JMap.java ! agent/src/share/classes/sun/jvm/hotspot/tools/JSnap.java ! agent/src/share/classes/sun/jvm/hotspot/tools/JStack.java ! agent/src/share/classes/sun/jvm/hotspot/tools/ObjectHistogram.java ! agent/src/share/classes/sun/jvm/hotspot/tools/PMap.java ! agent/src/share/classes/sun/jvm/hotspot/tools/PStack.java ! agent/src/share/classes/sun/jvm/hotspot/tools/PermStat.java ! agent/src/share/classes/sun/jvm/hotspot/tools/StackTrace.java ! agent/src/share/classes/sun/jvm/hotspot/tools/SysPropsDumper.java ! agent/src/share/classes/sun/jvm/hotspot/tools/Tool.java ! agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ByteCodeRewriter.java ! agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassDump.java ! agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassFilter.java ! agent/src/share/classes/sun/jvm/hotspot/tools/jcore/ClassWriter.java ! agent/src/share/classes/sun/jvm/hotspot/tools/jcore/NameFilter.java ! agent/src/share/classes/sun/jvm/hotspot/tools/jcore/PackageNameFilter.java ! agent/src/share/classes/sun/jvm/hotspot/tools/soql/JSDB.java ! agent/src/share/classes/sun/jvm/hotspot/tools/soql/SOQL.java ! agent/src/share/classes/sun/jvm/hotspot/types/AddressField.java ! agent/src/share/classes/sun/jvm/hotspot/types/CIntegerField.java ! agent/src/share/classes/sun/jvm/hotspot/types/CIntegerType.java ! agent/src/share/classes/sun/jvm/hotspot/types/Field.java ! agent/src/share/classes/sun/jvm/hotspot/types/JBooleanField.java ! agent/src/share/classes/sun/jvm/hotspot/types/JByteField.java ! agent/src/share/classes/sun/jvm/hotspot/types/JCharField.java ! agent/src/share/classes/sun/jvm/hotspot/types/JDoubleField.java ! agent/src/share/classes/sun/jvm/hotspot/types/JFloatField.java ! agent/src/share/classes/sun/jvm/hotspot/types/JIntField.java ! agent/src/share/classes/sun/jvm/hotspot/types/JLongField.java ! agent/src/share/classes/sun/jvm/hotspot/types/JShortField.java ! agent/src/share/classes/sun/jvm/hotspot/types/NarrowOopField.java ! agent/src/share/classes/sun/jvm/hotspot/types/OopField.java ! agent/src/share/classes/sun/jvm/hotspot/types/PointerType.java ! agent/src/share/classes/sun/jvm/hotspot/types/Type.java ! agent/src/share/classes/sun/jvm/hotspot/types/TypeDataBase.java ! agent/src/share/classes/sun/jvm/hotspot/types/WrongTypeException.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicAddressFieldWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicCIntegerField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicCIntegerType.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicFieldWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJBooleanField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJByteField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJCharField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJDoubleField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJFloatField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJIntField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJLongField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicJShortField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicNarrowOopField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicOopField.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicPointerType.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicType.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicTypeDataBase.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/BasicVtblAccess.java ! agent/src/share/classes/sun/jvm/hotspot/types/basic/VtblAccess.java ! agent/src/share/classes/sun/jvm/hotspot/ui/AnnotatedMemoryPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/Annotation.java ! agent/src/share/classes/sun/jvm/hotspot/ui/CommandProcessorPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/DeadlockDetectionPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/DebuggerConsolePanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/EditableAtEndDocument.java ! agent/src/share/classes/sun/jvm/hotspot/ui/Editor.java ! agent/src/share/classes/sun/jvm/hotspot/ui/EditorCommands.java ! agent/src/share/classes/sun/jvm/hotspot/ui/EditorFactory.java ! agent/src/share/classes/sun/jvm/hotspot/ui/FindByQueryPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/FindInCodeCachePanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/FindInHeapPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/FindPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/FrameWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/ui/GraphicsUtilities.java ! agent/src/share/classes/sun/jvm/hotspot/ui/HeapParametersPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/HighPrecisionJScrollBar.java ! agent/src/share/classes/sun/jvm/hotspot/ui/HistoryComboBox.java ! agent/src/share/classes/sun/jvm/hotspot/ui/Inspector.java ! agent/src/share/classes/sun/jvm/hotspot/ui/JFrameWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/ui/JInternalFrameWrapper.java ! agent/src/share/classes/sun/jvm/hotspot/ui/JavaStackTracePanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/JavaThreadsPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/MemoryPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/MemoryViewer.java ! agent/src/share/classes/sun/jvm/hotspot/ui/MonitorCacheDumpPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/ObjectHistogramPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/ObjectListPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/ProcessListPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/ProgressBarPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/SAEditorPane.java ! agent/src/share/classes/sun/jvm/hotspot/ui/SAListener.java ! agent/src/share/classes/sun/jvm/hotspot/ui/SAPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/SourceCodePanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/StringTransferable.java ! agent/src/share/classes/sun/jvm/hotspot/ui/SysPropsPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/ThreadInfoPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/VMFlagsPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/VMVersionInfoPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/FindAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/FindClassesAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/FindCrashesAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/HSDBActionManager.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/InspectAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/JavaStackTraceAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/MemoryAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/ShowAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/action/ThreadInfoAction.java ! agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/ClassBrowserPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/CodeViewerPanel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/classbrowser/HTMLGenerator.java ! agent/src/share/classes/sun/jvm/hotspot/ui/table/LongCellRenderer.java ! agent/src/share/classes/sun/jvm/hotspot/ui/table/SortHeaderCellRenderer.java ! agent/src/share/classes/sun/jvm/hotspot/ui/table/SortHeaderMouseAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/table/SortableTableModel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/table/TableModelComparator.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/BadAddressTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/BadOopTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/BooleanTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/CStringTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/CTypeTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/CharTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/DoubleTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/FieldTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/FloatTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/LongTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/OopTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/RevPtrsTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/RootTreeNodeAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/SimpleTreeGroupNode.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/SimpleTreeModel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/tree/SimpleTreeNode.java ! agent/src/share/classes/sun/jvm/hotspot/ui/treetable/AbstractTreeTableModel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/treetable/JTreeTable.java ! agent/src/share/classes/sun/jvm/hotspot/ui/treetable/SimpleTreeTableModel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/treetable/TreeTableModel.java ! agent/src/share/classes/sun/jvm/hotspot/ui/treetable/TreeTableModelAdapter.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/AbstractHeapGraphWriter.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/AddressOps.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/Assert.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/AssertionFailure.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtable.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/BasicHashtableEntry.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/BitMap.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/BitMapClosure.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/Bits.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/CPPExpressions.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/CStringUtilities.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/ConstIterator.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/ConstantTag.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/FindObjectByType.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/Hashtable.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableBucket.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/HashtableEntry.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/HeapGXLWriter.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/HeapGraphWriter.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/HeapHprofBinWriter.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/HeapProgressThunk.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/IntegerEnum.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/Interval.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/IntervalNode.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/IntervalTree.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/LivenessAnalysis.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/LivenessPath.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/LivenessPathElement.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/LivenessPathList.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/MarkBits.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/MessageQueue.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/MessageQueueBackend.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/ObjectReader.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/PlatformInfo.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/PointerFinder.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/PointerLocation.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/ProcImageClassLoader.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/ProgressiveHeapVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/RBColor.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/RBNode.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/RBTree.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/ReversePtrs.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/ReversePtrsAnalysis.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/RobustOopDeterminator.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/StreamMonitor.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/SystemDictionaryHelper.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/TwoOopHashtable.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/UnsupportedPlatformException.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/WorkerThread.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedBoolean.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedByte.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedChar.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedDouble.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedFloat.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedInt.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedLong.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedObject.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/memo/MemoizedShort.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/Callable.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/DefaultScriptObject.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/InvocableCallable.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaArray.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaArrayKlass.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaClass.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFactory.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFactoryImpl.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaField.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaFrame.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaHeap.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaInstance.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaInstanceKlass.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaKlass.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaMethod.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaObjArray.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaObjArrayKlass.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaObject.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaScriptEngine.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaString.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaThread.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaTypeArray.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaTypeArrayKlass.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSJavaVM.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSList.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/JSMap.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/MapScriptObject.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/MethodCallable.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/ObjectVisitor.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/SOQLEngine.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/SOQLException.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/SOQLQuery.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/ScriptObject.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/soql/sa.js ! agent/src/share/native/jvmdi/sa.cpp ! agent/src/share/native/jvmdi/sa.hpp ! agent/test/jdi/SASanityChecker.java ! agent/test/jdi/TEST.ROOT ! agent/test/jdi/TargetAdapter.java ! agent/test/jdi/TargetListener.java ! agent/test/jdi/TestScaffold.java ! agent/test/jdi/VMConnection.java ! agent/test/jdi/jstack.sh ! agent/test/jdi/jstack64.sh ! agent/test/jdi/multivm.java ! agent/test/jdi/multivm.sh ! agent/test/jdi/runjdb.sh ! agent/test/jdi/runjpda.sh ! agent/test/jdi/runsa.sh ! agent/test/jdi/sagclient.java ! agent/test/jdi/sagdoit.java ! agent/test/jdi/sagtarg.java ! agent/test/jdi/sagtest.java ! agent/test/jdi/sasanity.sh ! agent/test/jdi/serialvm.java ! agent/test/jdi/serialvm.sh ! agent/test/libproc/LibprocClient.java ! agent/test/libproc/LibprocTest.java ! agent/test/libproc/Makefile ! agent/test/libproc/README ! agent/test/libproc/libproctest.sh ! agent/test/libproc/libproctest64.sh ! make/Makefile ! make/defs.make ! make/hotspot_distro ! make/hotspot_version ! make/jprt.gmk ! make/jprt.properties ! make/linux/Makefile ! make/linux/README ! make/linux/build.sh ! make/linux/makefiles/adjust-mflags.sh ! make/linux/makefiles/adlc.make ! make/linux/makefiles/amd64.make ! make/linux/makefiles/buildtree.make ! make/linux/makefiles/compiler1.make ! make/linux/makefiles/compiler2.make ! make/linux/makefiles/core.make ! make/linux/makefiles/cscope.make ! make/linux/makefiles/debug.make ! make/linux/makefiles/defs.make ! make/linux/makefiles/dtrace.make ! make/linux/makefiles/fastdebug.make ! make/linux/makefiles/gcc.make ! make/linux/makefiles/hp.make ! make/linux/makefiles/hp1.make ! make/linux/makefiles/i486.make ! make/linux/makefiles/ia64.make ! make/linux/makefiles/jsig.make ! make/linux/makefiles/jvmg.make ! make/linux/makefiles/jvmti.make ! make/linux/makefiles/launcher.make ! make/linux/makefiles/makedeps.make ! make/linux/makefiles/mapfile-vers-debug ! make/linux/makefiles/mapfile-vers-jsig ! make/linux/makefiles/mapfile-vers-product ! make/linux/makefiles/optimized.make ! make/linux/makefiles/product.make ! make/linux/makefiles/profiled.make ! make/linux/makefiles/rules.make ! make/linux/makefiles/sa.make ! make/linux/makefiles/saproc.make ! make/linux/makefiles/sparc.make ! make/linux/makefiles/sparcWorks.make ! make/linux/makefiles/sparcv9.make ! make/linux/makefiles/tiered.make ! make/linux/makefiles/top.make ! make/linux/makefiles/vm.make ! make/linux/makefiles/zero.make ! make/linux/makefiles/zeroshark.make ! make/openjdk_distro ! make/pic.make ! make/sa.files ! make/scm.make ! make/solaris/Makefile ! make/solaris/build.sh ! make/solaris/makefiles/adjust-mflags.sh ! make/solaris/makefiles/adlc.make ! make/solaris/makefiles/amd64.make ! make/solaris/makefiles/buildtree.make ! make/solaris/makefiles/compiler1.make ! make/solaris/makefiles/compiler2.make ! make/solaris/makefiles/core.make ! make/solaris/makefiles/cscope.make ! make/solaris/makefiles/debug.make ! make/solaris/makefiles/defs.make ! make/solaris/makefiles/dtrace.make ! make/solaris/makefiles/fastdebug.make ! make/solaris/makefiles/gcc.make ! make/solaris/makefiles/hp.make ! make/solaris/makefiles/hp1.make ! make/solaris/makefiles/i486.make ! make/solaris/makefiles/jsig.make ! make/solaris/makefiles/jvmg.make ! make/solaris/makefiles/jvmti.make ! make/solaris/makefiles/kernel.make ! make/solaris/makefiles/launcher.make ! make/solaris/makefiles/makedeps.make ! make/solaris/makefiles/mapfile-vers ! make/solaris/makefiles/mapfile-vers-COMPILER1 ! make/solaris/makefiles/mapfile-vers-COMPILER2 ! make/solaris/makefiles/mapfile-vers-CORE ! make/solaris/makefiles/mapfile-vers-TIERED ! make/solaris/makefiles/mapfile-vers-debug ! make/solaris/makefiles/mapfile-vers-jsig ! make/solaris/makefiles/mapfile-vers-jvm_db ! make/solaris/makefiles/mapfile-vers-jvm_dtrace ! make/solaris/makefiles/mapfile-vers-nonproduct ! make/solaris/makefiles/optimized.make ! make/solaris/makefiles/product.make ! make/solaris/makefiles/profiled.make ! make/solaris/makefiles/rules.make ! make/solaris/makefiles/sa.make ! make/solaris/makefiles/saproc.make ! make/solaris/makefiles/sparc.make ! make/solaris/makefiles/sparcWorks.make ! make/solaris/makefiles/sparcv9.make ! make/solaris/makefiles/tiered.make ! make/solaris/makefiles/top.make ! make/solaris/makefiles/vm.make ! make/solaris/reorder.sh ! make/templates/bsd-header ! make/templates/gpl-cp-header ! make/templates/gpl-header ! make/test/Queens.java ! make/windows/README ! make/windows/build.bat ! make/windows/build.make ! make/windows/build_vm_def.sh ! make/windows/create.bat ! make/windows/cross_build.bat ! make/windows/get_msc_ver.sh ! make/windows/makefiles/adlc.make ! make/windows/makefiles/compile.make ! make/windows/makefiles/debug.make ! make/windows/makefiles/defs.make ! make/windows/makefiles/fastdebug.make ! make/windows/makefiles/generated.make ! make/windows/makefiles/jvmti.make ! make/windows/makefiles/makedeps.make ! make/windows/makefiles/product.make ! make/windows/makefiles/rules.make ! make/windows/makefiles/sa.make ! make/windows/makefiles/sanity.make ! make/windows/makefiles/shared.make ! make/windows/makefiles/top.make ! make/windows/makefiles/vm.make ! make/windows/projectfiles/common/Makefile ! make/windows/projectfiles/compiler1/Makefile ! make/windows/projectfiles/compiler2/Makefile ! make/windows/projectfiles/core/Makefile ! make/windows/projectfiles/kernel/Makefile ! make/windows/projectfiles/tiered/Makefile ! src/cpu/sparc/vm/args.cc ! src/cpu/sparc/vm/assembler_sparc.cpp ! src/cpu/sparc/vm/assembler_sparc.hpp ! src/cpu/sparc/vm/assembler_sparc.inline.hpp ! src/cpu/sparc/vm/bytecodeInterpreter_sparc.cpp ! src/cpu/sparc/vm/bytecodeInterpreter_sparc.hpp ! src/cpu/sparc/vm/bytecodeInterpreter_sparc.inline.hpp ! src/cpu/sparc/vm/bytecodes_sparc.cpp ! src/cpu/sparc/vm/bytecodes_sparc.hpp ! src/cpu/sparc/vm/bytes_sparc.hpp ! src/cpu/sparc/vm/c1_CodeStubs_sparc.cpp ! src/cpu/sparc/vm/c1_Defs_sparc.hpp ! src/cpu/sparc/vm/c1_FpuStackSim_sparc.cpp ! src/cpu/sparc/vm/c1_FpuStackSim_sparc.hpp ! src/cpu/sparc/vm/c1_FrameMap_sparc.cpp ! src/cpu/sparc/vm/c1_FrameMap_sparc.hpp ! src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp ! src/cpu/sparc/vm/c1_LIRAssembler_sparc.hpp ! src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp ! src/cpu/sparc/vm/c1_LinearScan_sparc.cpp ! src/cpu/sparc/vm/c1_LinearScan_sparc.hpp ! src/cpu/sparc/vm/c1_MacroAssembler_sparc.cpp ! src/cpu/sparc/vm/c1_MacroAssembler_sparc.hpp ! src/cpu/sparc/vm/c1_Runtime1_sparc.cpp ! src/cpu/sparc/vm/c1_globals_sparc.hpp ! src/cpu/sparc/vm/c2_globals_sparc.hpp ! src/cpu/sparc/vm/c2_init_sparc.cpp ! src/cpu/sparc/vm/codeBuffer_sparc.hpp ! src/cpu/sparc/vm/copy_sparc.hpp ! src/cpu/sparc/vm/cppInterpreterGenerator_sparc.hpp ! src/cpu/sparc/vm/cppInterpreter_sparc.cpp ! src/cpu/sparc/vm/cppInterpreter_sparc.hpp ! src/cpu/sparc/vm/debug_sparc.cpp ! src/cpu/sparc/vm/depChecker_sparc.cpp ! src/cpu/sparc/vm/depChecker_sparc.hpp ! src/cpu/sparc/vm/disassembler_sparc.hpp ! src/cpu/sparc/vm/dump_sparc.cpp ! src/cpu/sparc/vm/frame_sparc.cpp ! src/cpu/sparc/vm/frame_sparc.hpp ! src/cpu/sparc/vm/frame_sparc.inline.hpp ! src/cpu/sparc/vm/globalDefinitions_sparc.hpp ! src/cpu/sparc/vm/globals_sparc.hpp ! src/cpu/sparc/vm/icBuffer_sparc.cpp ! src/cpu/sparc/vm/icache_sparc.cpp ! src/cpu/sparc/vm/icache_sparc.hpp ! src/cpu/sparc/vm/interp_masm_sparc.cpp ! src/cpu/sparc/vm/interp_masm_sparc.hpp ! src/cpu/sparc/vm/interpreterGenerator_sparc.hpp ! src/cpu/sparc/vm/interpreterRT_sparc.cpp ! src/cpu/sparc/vm/interpreterRT_sparc.hpp ! src/cpu/sparc/vm/interpreter_sparc.cpp ! src/cpu/sparc/vm/interpreter_sparc.hpp ! src/cpu/sparc/vm/javaFrameAnchor_sparc.hpp ! src/cpu/sparc/vm/jniFastGetField_sparc.cpp ! src/cpu/sparc/vm/jniTypes_sparc.hpp ! src/cpu/sparc/vm/jni_sparc.h ! src/cpu/sparc/vm/methodHandles_sparc.cpp ! src/cpu/sparc/vm/nativeInst_sparc.cpp ! src/cpu/sparc/vm/nativeInst_sparc.hpp ! src/cpu/sparc/vm/registerMap_sparc.hpp ! src/cpu/sparc/vm/register_definitions_sparc.cpp ! src/cpu/sparc/vm/register_sparc.cpp ! src/cpu/sparc/vm/register_sparc.hpp ! src/cpu/sparc/vm/relocInfo_sparc.cpp ! src/cpu/sparc/vm/relocInfo_sparc.hpp ! src/cpu/sparc/vm/runtime_sparc.cpp ! src/cpu/sparc/vm/sharedRuntime_sparc.cpp ! src/cpu/sparc/vm/sparc.ad ! src/cpu/sparc/vm/stubGenerator_sparc.cpp ! src/cpu/sparc/vm/stubRoutines_sparc.cpp ! src/cpu/sparc/vm/stubRoutines_sparc.hpp ! src/cpu/sparc/vm/templateInterpreterGenerator_sparc.hpp ! src/cpu/sparc/vm/templateInterpreter_sparc.cpp ! src/cpu/sparc/vm/templateInterpreter_sparc.hpp ! src/cpu/sparc/vm/templateTable_sparc.cpp ! src/cpu/sparc/vm/templateTable_sparc.hpp ! src/cpu/sparc/vm/vmStructs_sparc.hpp ! src/cpu/sparc/vm/vm_version_sparc.cpp ! src/cpu/sparc/vm/vm_version_sparc.hpp ! src/cpu/sparc/vm/vmreg_sparc.cpp ! src/cpu/sparc/vm/vmreg_sparc.hpp ! src/cpu/sparc/vm/vmreg_sparc.inline.hpp ! src/cpu/sparc/vm/vtableStubs_sparc.cpp ! src/cpu/x86/vm/assembler_x86.cpp ! src/cpu/x86/vm/assembler_x86.hpp ! src/cpu/x86/vm/assembler_x86.inline.hpp ! src/cpu/x86/vm/bytecodeInterpreter_x86.cpp ! src/cpu/x86/vm/bytecodeInterpreter_x86.hpp ! src/cpu/x86/vm/bytecodeInterpreter_x86.inline.hpp ! src/cpu/x86/vm/bytecodes_x86.cpp ! src/cpu/x86/vm/bytecodes_x86.hpp ! src/cpu/x86/vm/bytes_x86.hpp ! src/cpu/x86/vm/c1_CodeStubs_x86.cpp ! src/cpu/x86/vm/c1_Defs_x86.hpp ! src/cpu/x86/vm/c1_FpuStackSim_x86.cpp ! src/cpu/x86/vm/c1_FpuStackSim_x86.hpp ! src/cpu/x86/vm/c1_FrameMap_x86.cpp ! src/cpu/x86/vm/c1_FrameMap_x86.hpp ! src/cpu/x86/vm/c1_LIRAssembler_x86.cpp ! src/cpu/x86/vm/c1_LIRAssembler_x86.hpp ! src/cpu/x86/vm/c1_LIRGenerator_x86.cpp ! src/cpu/x86/vm/c1_LinearScan_x86.cpp ! src/cpu/x86/vm/c1_LinearScan_x86.hpp ! src/cpu/x86/vm/c1_MacroAssembler_x86.cpp ! src/cpu/x86/vm/c1_MacroAssembler_x86.hpp ! src/cpu/x86/vm/c1_Runtime1_x86.cpp ! src/cpu/x86/vm/c1_globals_x86.hpp ! src/cpu/x86/vm/c2_globals_x86.hpp ! src/cpu/x86/vm/c2_init_x86.cpp ! src/cpu/x86/vm/codeBuffer_x86.hpp ! src/cpu/x86/vm/copy_x86.hpp ! src/cpu/x86/vm/cppInterpreterGenerator_x86.hpp ! src/cpu/x86/vm/cppInterpreter_x86.cpp ! src/cpu/x86/vm/cppInterpreter_x86.hpp ! src/cpu/x86/vm/debug_x86.cpp ! src/cpu/x86/vm/depChecker_x86.cpp ! src/cpu/x86/vm/depChecker_x86.hpp ! src/cpu/x86/vm/disassembler_x86.hpp ! src/cpu/x86/vm/dump_x86_32.cpp ! src/cpu/x86/vm/dump_x86_64.cpp ! src/cpu/x86/vm/frame_x86.cpp ! src/cpu/x86/vm/frame_x86.hpp ! src/cpu/x86/vm/frame_x86.inline.hpp ! src/cpu/x86/vm/globalDefinitions_x86.hpp ! src/cpu/x86/vm/globals_x86.hpp ! src/cpu/x86/vm/icBuffer_x86.cpp ! src/cpu/x86/vm/icache_x86.cpp ! src/cpu/x86/vm/icache_x86.hpp ! src/cpu/x86/vm/interp_masm_x86_32.cpp ! src/cpu/x86/vm/interp_masm_x86_32.hpp ! src/cpu/x86/vm/interp_masm_x86_64.cpp ! src/cpu/x86/vm/interp_masm_x86_64.hpp ! src/cpu/x86/vm/interpreterGenerator_x86.hpp ! src/cpu/x86/vm/interpreterRT_x86.hpp ! src/cpu/x86/vm/interpreterRT_x86_32.cpp ! src/cpu/x86/vm/interpreterRT_x86_64.cpp ! src/cpu/x86/vm/interpreter_x86.hpp ! src/cpu/x86/vm/interpreter_x86_32.cpp ! src/cpu/x86/vm/interpreter_x86_64.cpp ! src/cpu/x86/vm/javaFrameAnchor_x86.hpp ! src/cpu/x86/vm/jniFastGetField_x86_32.cpp ! src/cpu/x86/vm/jniFastGetField_x86_64.cpp ! src/cpu/x86/vm/jniTypes_x86.hpp ! src/cpu/x86/vm/jni_x86.h ! src/cpu/x86/vm/methodHandles_x86.cpp ! src/cpu/x86/vm/nativeInst_x86.cpp ! src/cpu/x86/vm/nativeInst_x86.hpp ! src/cpu/x86/vm/registerMap_x86.hpp ! src/cpu/x86/vm/register_definitions_x86.cpp ! src/cpu/x86/vm/register_x86.cpp ! src/cpu/x86/vm/register_x86.hpp ! src/cpu/x86/vm/relocInfo_x86.cpp ! src/cpu/x86/vm/relocInfo_x86.hpp ! src/cpu/x86/vm/runtime_x86_32.cpp ! src/cpu/x86/vm/runtime_x86_64.cpp ! src/cpu/x86/vm/sharedRuntime_x86_32.cpp ! src/cpu/x86/vm/sharedRuntime_x86_64.cpp ! src/cpu/x86/vm/stubGenerator_x86_32.cpp ! src/cpu/x86/vm/stubGenerator_x86_64.cpp ! src/cpu/x86/vm/stubRoutines_x86_32.cpp ! src/cpu/x86/vm/stubRoutines_x86_32.hpp ! src/cpu/x86/vm/stubRoutines_x86_64.cpp ! src/cpu/x86/vm/stubRoutines_x86_64.hpp ! src/cpu/x86/vm/templateInterpreterGenerator_x86.hpp ! src/cpu/x86/vm/templateInterpreter_x86.hpp ! src/cpu/x86/vm/templateInterpreter_x86_32.cpp ! src/cpu/x86/vm/templateInterpreter_x86_64.cpp ! src/cpu/x86/vm/templateTable_x86_32.cpp ! src/cpu/x86/vm/templateTable_x86_32.hpp ! src/cpu/x86/vm/templateTable_x86_64.cpp ! src/cpu/x86/vm/templateTable_x86_64.hpp ! src/cpu/x86/vm/vmStructs_x86.hpp ! src/cpu/x86/vm/vm_version_x86.cpp ! src/cpu/x86/vm/vm_version_x86.hpp ! src/cpu/x86/vm/vmreg_x86.cpp ! src/cpu/x86/vm/vmreg_x86.hpp ! src/cpu/x86/vm/vmreg_x86.inline.hpp ! src/cpu/x86/vm/vtableStubs_x86_32.cpp ! src/cpu/x86/vm/vtableStubs_x86_64.cpp ! src/cpu/x86/vm/x86_32.ad ! src/cpu/x86/vm/x86_64.ad ! src/cpu/zero/vm/assembler_zero.cpp ! src/cpu/zero/vm/assembler_zero.hpp ! src/cpu/zero/vm/assembler_zero.inline.hpp ! src/cpu/zero/vm/bytecodeInterpreter_zero.cpp ! src/cpu/zero/vm/bytecodeInterpreter_zero.hpp ! src/cpu/zero/vm/bytecodeInterpreter_zero.inline.hpp ! src/cpu/zero/vm/bytecodes_zero.cpp ! src/cpu/zero/vm/bytecodes_zero.hpp ! src/cpu/zero/vm/bytes_zero.hpp ! src/cpu/zero/vm/codeBuffer_zero.hpp ! src/cpu/zero/vm/copy_zero.hpp ! src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp ! src/cpu/zero/vm/cppInterpreter_zero.cpp ! src/cpu/zero/vm/cppInterpreter_zero.hpp ! src/cpu/zero/vm/debug_zero.cpp ! src/cpu/zero/vm/depChecker_zero.cpp ! src/cpu/zero/vm/depChecker_zero.hpp ! src/cpu/zero/vm/disassembler_zero.cpp ! src/cpu/zero/vm/disassembler_zero.hpp ! src/cpu/zero/vm/dump_zero.cpp ! src/cpu/zero/vm/entryFrame_zero.hpp ! src/cpu/zero/vm/entry_zero.hpp ! src/cpu/zero/vm/fakeStubFrame_zero.hpp ! src/cpu/zero/vm/frame_zero.cpp ! src/cpu/zero/vm/frame_zero.hpp ! src/cpu/zero/vm/frame_zero.inline.hpp ! src/cpu/zero/vm/globalDefinitions_zero.hpp ! src/cpu/zero/vm/globals_zero.hpp ! src/cpu/zero/vm/icBuffer_zero.cpp ! src/cpu/zero/vm/icache_zero.cpp ! src/cpu/zero/vm/icache_zero.hpp ! src/cpu/zero/vm/interp_masm_zero.cpp ! src/cpu/zero/vm/interp_masm_zero.hpp ! src/cpu/zero/vm/interpreterFrame_zero.hpp ! src/cpu/zero/vm/interpreterGenerator_zero.hpp ! src/cpu/zero/vm/interpreterRT_zero.cpp ! src/cpu/zero/vm/interpreterRT_zero.hpp ! src/cpu/zero/vm/interpreter_zero.cpp ! src/cpu/zero/vm/interpreter_zero.hpp ! src/cpu/zero/vm/javaFrameAnchor_zero.hpp ! src/cpu/zero/vm/jniFastGetField_zero.cpp ! src/cpu/zero/vm/jniTypes_zero.hpp ! src/cpu/zero/vm/jni_zero.h ! src/cpu/zero/vm/methodHandles_zero.cpp ! src/cpu/zero/vm/nativeInst_zero.cpp ! src/cpu/zero/vm/nativeInst_zero.hpp ! src/cpu/zero/vm/registerMap_zero.hpp ! src/cpu/zero/vm/register_definitions_zero.cpp ! src/cpu/zero/vm/register_zero.cpp ! src/cpu/zero/vm/register_zero.hpp ! src/cpu/zero/vm/relocInfo_zero.cpp ! src/cpu/zero/vm/relocInfo_zero.hpp ! src/cpu/zero/vm/sharedRuntime_zero.cpp ! src/cpu/zero/vm/sharkFrame_zero.hpp ! src/cpu/zero/vm/stack_zero.cpp ! src/cpu/zero/vm/stack_zero.hpp ! src/cpu/zero/vm/stack_zero.inline.hpp ! src/cpu/zero/vm/stubGenerator_zero.cpp ! src/cpu/zero/vm/stubRoutines_zero.cpp ! src/cpu/zero/vm/stubRoutines_zero.hpp ! src/cpu/zero/vm/templateInterpreterGenerator_zero.hpp ! src/cpu/zero/vm/templateInterpreter_zero.cpp ! src/cpu/zero/vm/templateInterpreter_zero.hpp ! src/cpu/zero/vm/templateTable_zero.cpp ! src/cpu/zero/vm/templateTable_zero.hpp ! src/cpu/zero/vm/vmStructs_zero.hpp ! src/cpu/zero/vm/vm_version_zero.cpp ! src/cpu/zero/vm/vm_version_zero.hpp ! src/cpu/zero/vm/vmreg_zero.cpp ! src/cpu/zero/vm/vmreg_zero.hpp ! src/cpu/zero/vm/vmreg_zero.inline.hpp ! src/cpu/zero/vm/vtableStubs_zero.cpp ! src/os/linux/launcher/java.c ! src/os/linux/launcher/java.h ! src/os/linux/launcher/java_md.c ! src/os/linux/launcher/java_md.h ! src/os/linux/vm/attachListener_linux.cpp ! src/os/linux/vm/c1_globals_linux.hpp ! src/os/linux/vm/c2_globals_linux.hpp ! src/os/linux/vm/chaitin_linux.cpp ! src/os/linux/vm/dtraceJSDT_linux.cpp ! src/os/linux/vm/globals_linux.hpp ! src/os/linux/vm/hpi_linux.cpp ! src/os/linux/vm/hpi_linux.hpp ! src/os/linux/vm/interfaceSupport_linux.hpp ! src/os/linux/vm/jsig.c ! src/os/linux/vm/jvm_linux.cpp ! src/os/linux/vm/jvm_linux.h ! src/os/linux/vm/mutex_linux.cpp ! src/os/linux/vm/mutex_linux.inline.hpp ! src/os/linux/vm/objectMonitor_linux.cpp ! src/os/linux/vm/objectMonitor_linux.hpp ! src/os/linux/vm/objectMonitor_linux.inline.hpp ! src/os/linux/vm/osThread_linux.cpp ! src/os/linux/vm/osThread_linux.hpp ! src/os/linux/vm/os_linux.cpp ! src/os/linux/vm/os_linux.hpp ! src/os/linux/vm/os_linux.inline.hpp ! src/os/linux/vm/os_share_linux.hpp ! src/os/linux/vm/perfMemory_linux.cpp ! src/os/linux/vm/stubRoutines_linux.cpp ! src/os/linux/vm/threadCritical_linux.cpp ! src/os/linux/vm/thread_linux.inline.hpp ! src/os/linux/vm/vmError_linux.cpp ! src/os/linux/vm/vtune_linux.cpp ! src/os/solaris/dtrace/generateJvmOffsets.cpp ! src/os/solaris/dtrace/generateJvmOffsets.h ! src/os/solaris/dtrace/generateJvmOffsetsMain.c ! src/os/solaris/dtrace/hotspot.d ! src/os/solaris/dtrace/hotspot_jni.d ! src/os/solaris/dtrace/hs_private.d ! src/os/solaris/dtrace/jhelper.d ! src/os/solaris/dtrace/jvm_dtrace.c ! src/os/solaris/dtrace/jvm_dtrace.h ! src/os/solaris/dtrace/libjvm_db.c ! src/os/solaris/dtrace/libjvm_db.h ! src/os/solaris/launcher/java.c ! src/os/solaris/launcher/java.h ! src/os/solaris/launcher/java_md.c ! src/os/solaris/launcher/java_md.h ! src/os/solaris/vm/attachListener_solaris.cpp ! src/os/solaris/vm/c1_globals_solaris.hpp ! src/os/solaris/vm/c2_globals_solaris.hpp ! src/os/solaris/vm/chaitin_solaris.cpp ! src/os/solaris/vm/dtraceJSDT_solaris.cpp ! src/os/solaris/vm/globals_solaris.hpp ! src/os/solaris/vm/hpi_solaris.cpp ! src/os/solaris/vm/hpi_solaris.hpp ! src/os/solaris/vm/interfaceSupport_solaris.hpp ! src/os/solaris/vm/jsig.c ! src/os/solaris/vm/jvm_solaris.cpp ! src/os/solaris/vm/jvm_solaris.h ! src/os/solaris/vm/mutex_solaris.cpp ! src/os/solaris/vm/mutex_solaris.inline.hpp ! src/os/solaris/vm/objectMonitor_solaris.cpp ! src/os/solaris/vm/objectMonitor_solaris.hpp ! src/os/solaris/vm/objectMonitor_solaris.inline.hpp ! src/os/solaris/vm/osThread_solaris.cpp ! src/os/solaris/vm/osThread_solaris.hpp ! src/os/solaris/vm/os_share_solaris.hpp ! src/os/solaris/vm/os_solaris.cpp ! src/os/solaris/vm/os_solaris.hpp ! src/os/solaris/vm/os_solaris.inline.hpp ! src/os/solaris/vm/perfMemory_solaris.cpp ! src/os/solaris/vm/stubRoutines_solaris.cpp ! src/os/solaris/vm/threadCritical_solaris.cpp ! src/os/solaris/vm/thread_solaris.inline.hpp ! src/os/solaris/vm/vmError_solaris.cpp ! src/os/solaris/vm/vtune_solaris.cpp ! src/os/windows/vm/attachListener_windows.cpp ! src/os/windows/vm/c1_globals_windows.hpp ! src/os/windows/vm/c2_globals_windows.hpp ! src/os/windows/vm/chaitin_windows.cpp ! src/os/windows/vm/dtraceJSDT_windows.cpp ! src/os/windows/vm/globals_windows.hpp ! src/os/windows/vm/hpi_windows.cpp ! src/os/windows/vm/hpi_windows.hpp ! src/os/windows/vm/interfaceSupport_windows.hpp ! src/os/windows/vm/jvm_windows.cpp ! src/os/windows/vm/jvm_windows.h ! src/os/windows/vm/mutex_windows.cpp ! src/os/windows/vm/mutex_windows.inline.hpp ! src/os/windows/vm/objectMonitor_windows.cpp ! src/os/windows/vm/objectMonitor_windows.hpp ! src/os/windows/vm/objectMonitor_windows.inline.hpp ! src/os/windows/vm/osThread_windows.cpp ! src/os/windows/vm/osThread_windows.hpp ! src/os/windows/vm/os_share_windows.hpp ! src/os/windows/vm/os_windows.cpp ! src/os/windows/vm/os_windows.hpp ! src/os/windows/vm/os_windows.inline.hpp ! src/os/windows/vm/perfMemory_windows.cpp ! src/os/windows/vm/stubRoutines_windows.cpp ! src/os/windows/vm/threadCritical_windows.cpp ! src/os/windows/vm/thread_windows.inline.hpp ! src/os/windows/vm/version.rc ! src/os/windows/vm/vmError_windows.cpp ! src/os/windows/vm/vtune_windows.cpp ! src/os_cpu/linux_sparc/vm/assembler_linux_sparc.cpp ! src/os_cpu/linux_sparc/vm/atomic_linux_sparc.inline.hpp ! src/os_cpu/linux_sparc/vm/globals_linux_sparc.hpp ! src/os_cpu/linux_sparc/vm/linux_sparc.ad ! src/os_cpu/linux_sparc/vm/linux_sparc.s ! src/os_cpu/linux_sparc/vm/orderAccess_linux_sparc.inline.hpp ! src/os_cpu/linux_sparc/vm/os_linux_sparc.cpp ! src/os_cpu/linux_sparc/vm/os_linux_sparc.hpp ! src/os_cpu/linux_sparc/vm/prefetch_linux_sparc.inline.hpp ! src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.cpp ! src/os_cpu/linux_sparc/vm/threadLS_linux_sparc.hpp ! src/os_cpu/linux_sparc/vm/thread_linux_sparc.cpp ! src/os_cpu/linux_sparc/vm/thread_linux_sparc.hpp ! src/os_cpu/linux_sparc/vm/vmStructs_linux_sparc.hpp ! src/os_cpu/linux_sparc/vm/vm_version_linux_sparc.cpp ! src/os_cpu/linux_x86/vm/assembler_linux_x86.cpp ! src/os_cpu/linux_x86/vm/atomic_linux_x86.inline.hpp ! src/os_cpu/linux_x86/vm/bytes_linux_x86.inline.hpp ! src/os_cpu/linux_x86/vm/copy_linux_x86.inline.hpp ! src/os_cpu/linux_x86/vm/globals_linux_x86.hpp ! src/os_cpu/linux_x86/vm/linux_x86_32.ad ! src/os_cpu/linux_x86/vm/linux_x86_32.s ! src/os_cpu/linux_x86/vm/linux_x86_64.ad ! src/os_cpu/linux_x86/vm/linux_x86_64.s ! src/os_cpu/linux_x86/vm/orderAccess_linux_x86.inline.hpp ! src/os_cpu/linux_x86/vm/os_linux_x86.cpp ! src/os_cpu/linux_x86/vm/os_linux_x86.hpp ! src/os_cpu/linux_x86/vm/prefetch_linux_x86.inline.hpp ! src/os_cpu/linux_x86/vm/threadLS_linux_x86.cpp ! src/os_cpu/linux_x86/vm/threadLS_linux_x86.hpp ! src/os_cpu/linux_x86/vm/thread_linux_x86.cpp ! src/os_cpu/linux_x86/vm/thread_linux_x86.hpp ! src/os_cpu/linux_x86/vm/vmStructs_linux_x86.hpp ! src/os_cpu/linux_x86/vm/vm_version_linux_x86.cpp ! src/os_cpu/linux_zero/vm/assembler_linux_zero.cpp ! src/os_cpu/linux_zero/vm/atomic_linux_zero.inline.hpp ! src/os_cpu/linux_zero/vm/bytes_linux_zero.inline.hpp ! src/os_cpu/linux_zero/vm/globals_linux_zero.hpp ! src/os_cpu/linux_zero/vm/orderAccess_linux_zero.inline.hpp ! src/os_cpu/linux_zero/vm/os_linux_zero.cpp ! src/os_cpu/linux_zero/vm/os_linux_zero.hpp ! src/os_cpu/linux_zero/vm/prefetch_linux_zero.inline.hpp ! src/os_cpu/linux_zero/vm/threadLS_linux_zero.cpp ! src/os_cpu/linux_zero/vm/threadLS_linux_zero.hpp ! src/os_cpu/linux_zero/vm/thread_linux_zero.cpp ! src/os_cpu/linux_zero/vm/thread_linux_zero.hpp ! src/os_cpu/linux_zero/vm/vmStructs_linux_zero.hpp ! src/os_cpu/linux_zero/vm/vm_version_linux_zero.cpp ! src/os_cpu/solaris_sparc/vm/assembler_solaris_sparc.cpp ! src/os_cpu/solaris_sparc/vm/atomic_solaris_sparc.inline.hpp ! src/os_cpu/solaris_sparc/vm/globals_solaris_sparc.hpp ! src/os_cpu/solaris_sparc/vm/orderAccess_solaris_sparc.inline.hpp ! src/os_cpu/solaris_sparc/vm/os_solaris_sparc.cpp ! src/os_cpu/solaris_sparc/vm/os_solaris_sparc.hpp ! src/os_cpu/solaris_sparc/vm/prefetch_solaris_sparc.inline.hpp ! src/os_cpu/solaris_sparc/vm/solaris_sparc.ad ! src/os_cpu/solaris_sparc/vm/solaris_sparc.il ! src/os_cpu/solaris_sparc/vm/solaris_sparc.s ! src/os_cpu/solaris_sparc/vm/threadLS_solaris_sparc.cpp ! src/os_cpu/solaris_sparc/vm/threadLS_solaris_sparc.hpp ! src/os_cpu/solaris_sparc/vm/thread_solaris_sparc.cpp ! src/os_cpu/solaris_sparc/vm/thread_solaris_sparc.hpp ! src/os_cpu/solaris_sparc/vm/vmStructs_solaris_sparc.hpp ! src/os_cpu/solaris_sparc/vm/vm_version_solaris_sparc.cpp ! src/os_cpu/solaris_x86/vm/assembler_solaris_x86.cpp ! src/os_cpu/solaris_x86/vm/atomic_solaris_x86.inline.hpp ! src/os_cpu/solaris_x86/vm/bytes_solaris_x86.inline.hpp ! src/os_cpu/solaris_x86/vm/copy_solaris_x86.inline.hpp ! src/os_cpu/solaris_x86/vm/globals_solaris_x86.hpp ! src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp ! src/os_cpu/solaris_x86/vm/os_solaris_x86.cpp ! src/os_cpu/solaris_x86/vm/os_solaris_x86.hpp ! src/os_cpu/solaris_x86/vm/prefetch_solaris_x86.inline.hpp ! src/os_cpu/solaris_x86/vm/solaris_x86_32.ad ! src/os_cpu/solaris_x86/vm/solaris_x86_32.il ! src/os_cpu/solaris_x86/vm/solaris_x86_32.s ! src/os_cpu/solaris_x86/vm/solaris_x86_64.ad ! src/os_cpu/solaris_x86/vm/solaris_x86_64.il ! src/os_cpu/solaris_x86/vm/solaris_x86_64.s ! src/os_cpu/solaris_x86/vm/threadLS_solaris_x86.cpp ! src/os_cpu/solaris_x86/vm/threadLS_solaris_x86.hpp ! src/os_cpu/solaris_x86/vm/thread_solaris_x86.cpp ! src/os_cpu/solaris_x86/vm/thread_solaris_x86.hpp ! src/os_cpu/solaris_x86/vm/vmStructs_solaris_x86.hpp ! src/os_cpu/solaris_x86/vm/vm_version_solaris_x86.cpp ! src/os_cpu/windows_x86/vm/assembler_windows_x86.cpp ! src/os_cpu/windows_x86/vm/atomic_windows_x86.inline.hpp ! src/os_cpu/windows_x86/vm/bytes_windows_x86.inline.hpp ! src/os_cpu/windows_x86/vm/copy_windows_x86.inline.hpp ! src/os_cpu/windows_x86/vm/globals_windows_x86.hpp ! src/os_cpu/windows_x86/vm/orderAccess_windows_x86.inline.hpp ! src/os_cpu/windows_x86/vm/os_windows_x86.cpp ! src/os_cpu/windows_x86/vm/os_windows_x86.hpp ! src/os_cpu/windows_x86/vm/prefetch_windows_x86.inline.hpp ! src/os_cpu/windows_x86/vm/threadLS_windows_x86.cpp ! src/os_cpu/windows_x86/vm/threadLS_windows_x86.hpp ! src/os_cpu/windows_x86/vm/thread_windows_x86.cpp ! src/os_cpu/windows_x86/vm/thread_windows_x86.hpp ! src/os_cpu/windows_x86/vm/unwind_windows_x86.hpp ! src/os_cpu/windows_x86/vm/vmStructs_windows_x86.hpp ! src/os_cpu/windows_x86/vm/vm_version_windows_x86.cpp ! src/os_cpu/windows_x86/vm/windows_x86_32.ad ! src/os_cpu/windows_x86/vm/windows_x86_64.ad ! src/share/tools/IdealGraphVisualizer/BatikSVGProxy/src/com/sun/hotspot/igv/svg/BatikSVG.java ! src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeNode.java ! src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewAction.java ! src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/BytecodeViewTopComponent.java ! src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/MethodNode.java ! src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesAction.java ! src/share/tools/IdealGraphVisualizer/Bytecodes/src/com/sun/hotspot/igv/bytecodes/SelectBytecodesCookie.java ! src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockConnectionWidget.java ! src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/BlockWidget.java ! src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowAction.java ! src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowScene.java ! src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/ControlFlowTopComponent.java ! src/share/tools/IdealGraphVisualizer/ControlFlow/src/com/sun/hotspot/igv/controlflow/HierarchicalGraphLayout.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/FolderNode.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphCountGroupOrganizer.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/GraphNode.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/OutlineTopComponent.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/StandardGroupOrganizer.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphAction.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/DiffGraphCookie.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/ImportAction.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/OutlineAction.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAction.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveAllAction.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/RemoveCookie.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAllAction.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/SaveAsAction.java ! src/share/tools/IdealGraphVisualizer/Coordinator/src/com/sun/hotspot/igv/coordinator/actions/StructuredViewAction.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEvent.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedEventProvider.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/ChangedListener.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Event.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/GraphDocument.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Group.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlock.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBlockEdge.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputBytecode.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputEdge.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputGraph.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputMethod.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/InputNode.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Pair.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Properties.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/Property.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Parser.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/Printer.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLParser.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/serialization/XMLWriter.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GraphViewer.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupCallback.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupOrganizer.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/GroupReceiver.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/InputGraphProvider.java ! src/share/tools/IdealGraphVisualizer/Data/src/com/sun/hotspot/igv/data/services/Scheduler.java ! src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/AbstractFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ColorFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CombineFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ConnectionFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/CustomFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/EditFilterDialog.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/Filter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChain.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterChainProvider.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/FilterSetting.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/JavaSE6ScriptEngine.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/NullScriptEngine.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveInputsFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/RemoveSelfLoopsFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/ScriptEngineAbstraction.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/SplitFilter.java ! src/share/tools/IdealGraphVisualizer/Filter/src/com/sun/hotspot/igv/filter/helper.js ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckListView.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNode.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckNodeListModel.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/CheckRenderer.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterChainProviderImplementation.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterNode.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/FilterTopComponent.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/FilterAction.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterDownAction.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/MoveFilterUpAction.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/NewFilterAction.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterAction.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/RemoveFilterSettingsAction.java ! src/share/tools/IdealGraphVisualizer/FilterWindow/src/com/sun/hotspot/igv/filterwindow/actions/SaveFilterSettingsAction.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/AndSelector.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Block.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Connection.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Diagram.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Figure.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InputSlot.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/InvertSelector.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/MatcherSelector.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OrSelector.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/OutputSlot.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/PredecessorSelector.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Selector.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Slot.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/Source.java ! src/share/tools/IdealGraphVisualizer/Graph/src/com/sun/hotspot/igv/graph/SuccessorSelector.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterEdge.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterIngoingConnection.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterInputSlotNode.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterNode.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutgoingConnection.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/ClusterOutputSlotNode.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Edge.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Graph.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalClusterLayoutManager.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/HierarchicalLayoutManager.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/InterClusterConnection.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Node.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/OldHierarchicalLayoutManager.java ! src/share/tools/IdealGraphVisualizer/HierarchicalLayout/src/com/sun/hotspot/igv/hierarchicallayout/Timing.java ! src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Cluster.java ! src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutGraph.java ! src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/LayoutManager.java ! src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Link.java ! src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Port.java ! src/share/tools/IdealGraphVisualizer/Layout/src/com/sun/hotspot/igv/layout/Vertex.java ! src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Client.java ! src/share/tools/IdealGraphVisualizer/NetworkConnection/src/com/sun/hotspot/igv/connection/Server.java ! src/share/tools/IdealGraphVisualizer/RhinoScriptEngineProxy/src/com/sun/hotspot/igv/rhino/RhinoScriptEngine.java ! src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/JavaGroupOrganizer.java ! src/share/tools/IdealGraphVisualizer/ServerCompiler/src/com/sun/hotspot/igv/servercompiler/ServerCompilerScheduler.java ! src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/Settings.java ! src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsCategory.java ! src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewOptionsPanelController.java ! src/share/tools/IdealGraphVisualizer/Settings/src/com/sun/hotspot/igv/settings/ViewPanel.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/BoundedZoomAction.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ColorIcon.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ContextAction.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickAction.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/DoubleClickHandler.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSatelliteComponent.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/ExtendedSelectAction.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/PropertiesSheet.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSlider.java ! src/share/tools/IdealGraphVisualizer/Util/src/com/sun/hotspot/igv/util/RangeSliderModel.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/BoundedZoomAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ConnectionAnchor.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramScene.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/DiagramViewModel.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorInputGraphProvider.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/EditorTopComponent.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExportCookie.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedPanAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/ExtendedSatelliteComponent.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/FindPanel.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/GraphViewerImplementation.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/PreferenceConstants.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/SlotLayout.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/EnableBlockLayoutAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandPredecessorsAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExpandSuccessorsAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExportAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ExtractAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/HideAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/MouseOverAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NextDiagramAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/NodeFindAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/OverviewAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PredSuccAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/PrevDiagramAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ShowAllAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomInAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/actions/ZoomOutAction.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/BlockWidget.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/DiagramConnectionWidget.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/FigureWidget.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/InputSlotWidget.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/LineWidget.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/MultiConnectionWidget.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/OutputSlotWidget.java ! src/share/tools/IdealGraphVisualizer/View/src/com/sun/hotspot/igv/view/widgets/SlotWidget.java ! src/share/tools/LogCompilation/Makefile ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/BasicLogEvent.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/CallSite.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Compilation.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Constants.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCleanupReader.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogCompilation.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogEvent.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/LogParser.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/MakeNotEntrantEvent.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Method.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/NMethod.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/Phase.java ! src/share/tools/LogCompilation/src/com/sun/hotspot/tools/compiler/UncommonTrapEvent.java ! src/share/tools/MakeDeps/ArgsParser.java ! src/share/tools/MakeDeps/BuildConfig.java ! src/share/tools/MakeDeps/Database.java ! src/share/tools/MakeDeps/DirectoryTree.java ! src/share/tools/MakeDeps/DirectoryTreeNode.java ! src/share/tools/MakeDeps/FileFormatException.java ! src/share/tools/MakeDeps/FileList.java ! src/share/tools/MakeDeps/FileName.java ! src/share/tools/MakeDeps/Macro.java ! src/share/tools/MakeDeps/MacroDefinitions.java ! src/share/tools/MakeDeps/MakeDeps.java ! src/share/tools/MakeDeps/MetroWerksMacPlatform.java ! src/share/tools/MakeDeps/Platform.java ! src/share/tools/MakeDeps/UnixPlatform.java ! src/share/tools/MakeDeps/Util.java ! src/share/tools/MakeDeps/WinGammaPlatform.java ! src/share/tools/MakeDeps/WinGammaPlatformVC6.java ! src/share/tools/MakeDeps/WinGammaPlatformVC7.java ! src/share/tools/MakeDeps/WinGammaPlatformVC8.java ! src/share/tools/MakeDeps/WinGammaPlatformVC9.java ! src/share/tools/hsdis/Makefile ! src/share/tools/hsdis/README ! src/share/tools/hsdis/hsdis-demo.c ! src/share/tools/hsdis/hsdis.c ! src/share/tools/hsdis/hsdis.h ! src/share/vm/adlc/Doc/Syntax.doc ! src/share/vm/adlc/adlc.hpp ! src/share/vm/adlc/adlparse.cpp ! src/share/vm/adlc/adlparse.hpp ! src/share/vm/adlc/archDesc.cpp ! src/share/vm/adlc/archDesc.hpp ! src/share/vm/adlc/arena.cpp ! src/share/vm/adlc/arena.hpp ! src/share/vm/adlc/dfa.cpp ! src/share/vm/adlc/dict2.cpp ! src/share/vm/adlc/dict2.hpp ! src/share/vm/adlc/filebuff.cpp ! src/share/vm/adlc/filebuff.hpp ! src/share/vm/adlc/forms.cpp ! src/share/vm/adlc/forms.hpp ! src/share/vm/adlc/formsopt.cpp ! src/share/vm/adlc/formsopt.hpp ! src/share/vm/adlc/formssel.cpp ! src/share/vm/adlc/formssel.hpp ! src/share/vm/adlc/main.cpp ! src/share/vm/adlc/output_c.cpp ! src/share/vm/adlc/output_h.cpp ! src/share/vm/asm/assembler.cpp ! src/share/vm/asm/assembler.hpp ! src/share/vm/asm/assembler.inline.hpp ! src/share/vm/asm/codeBuffer.cpp ! src/share/vm/asm/codeBuffer.hpp ! src/share/vm/asm/register.cpp ! src/share/vm/asm/register.hpp ! src/share/vm/c1/c1_CFGPrinter.cpp ! src/share/vm/c1/c1_CFGPrinter.hpp ! src/share/vm/c1/c1_Canonicalizer.cpp ! src/share/vm/c1/c1_Canonicalizer.hpp ! src/share/vm/c1/c1_CodeStubs.hpp ! src/share/vm/c1/c1_Compilation.cpp ! src/share/vm/c1/c1_Compilation.hpp ! src/share/vm/c1/c1_Compiler.cpp ! src/share/vm/c1/c1_Compiler.hpp ! src/share/vm/c1/c1_Defs.cpp ! src/share/vm/c1/c1_Defs.hpp ! src/share/vm/c1/c1_FpuStackSim.hpp ! src/share/vm/c1/c1_FrameMap.cpp ! src/share/vm/c1/c1_FrameMap.hpp ! src/share/vm/c1/c1_GraphBuilder.cpp ! src/share/vm/c1/c1_GraphBuilder.hpp ! src/share/vm/c1/c1_IR.cpp ! src/share/vm/c1/c1_IR.hpp ! src/share/vm/c1/c1_Instruction.cpp ! src/share/vm/c1/c1_Instruction.hpp ! src/share/vm/c1/c1_InstructionPrinter.cpp ! src/share/vm/c1/c1_InstructionPrinter.hpp ! src/share/vm/c1/c1_LIR.cpp ! src/share/vm/c1/c1_LIR.hpp ! src/share/vm/c1/c1_LIRAssembler.cpp ! src/share/vm/c1/c1_LIRAssembler.hpp ! src/share/vm/c1/c1_LIRGenerator.cpp ! src/share/vm/c1/c1_LIRGenerator.hpp ! src/share/vm/c1/c1_LinearScan.cpp ! src/share/vm/c1/c1_LinearScan.hpp ! src/share/vm/c1/c1_MacroAssembler.hpp ! src/share/vm/c1/c1_Optimizer.cpp ! src/share/vm/c1/c1_Optimizer.hpp ! src/share/vm/c1/c1_Runtime1.cpp ! src/share/vm/c1/c1_Runtime1.hpp ! src/share/vm/c1/c1_ValueMap.cpp ! src/share/vm/c1/c1_ValueMap.hpp ! src/share/vm/c1/c1_ValueSet.cpp ! src/share/vm/c1/c1_ValueSet.hpp ! src/share/vm/c1/c1_ValueStack.cpp ! src/share/vm/c1/c1_ValueStack.hpp ! src/share/vm/c1/c1_ValueType.cpp ! src/share/vm/c1/c1_ValueType.hpp ! src/share/vm/c1/c1_globals.cpp ! src/share/vm/c1/c1_globals.hpp ! src/share/vm/ci/bcEscapeAnalyzer.cpp ! src/share/vm/ci/bcEscapeAnalyzer.hpp ! src/share/vm/ci/ciArray.cpp ! src/share/vm/ci/ciArray.hpp ! src/share/vm/ci/ciArrayKlass.cpp ! src/share/vm/ci/ciArrayKlass.hpp ! src/share/vm/ci/ciArrayKlassKlass.hpp ! src/share/vm/ci/ciCPCache.cpp ! src/share/vm/ci/ciCPCache.hpp ! src/share/vm/ci/ciCallProfile.hpp ! src/share/vm/ci/ciCallSite.cpp ! src/share/vm/ci/ciCallSite.hpp ! src/share/vm/ci/ciClassList.hpp ! src/share/vm/ci/ciConstant.cpp ! src/share/vm/ci/ciConstant.hpp ! src/share/vm/ci/ciConstantPoolCache.cpp ! src/share/vm/ci/ciConstantPoolCache.hpp ! src/share/vm/ci/ciEnv.cpp ! src/share/vm/ci/ciEnv.hpp ! src/share/vm/ci/ciExceptionHandler.cpp ! src/share/vm/ci/ciExceptionHandler.hpp ! src/share/vm/ci/ciField.cpp ! src/share/vm/ci/ciField.hpp ! src/share/vm/ci/ciFlags.cpp ! src/share/vm/ci/ciFlags.hpp ! src/share/vm/ci/ciInstance.cpp ! src/share/vm/ci/ciInstance.hpp ! src/share/vm/ci/ciInstanceKlass.cpp ! src/share/vm/ci/ciInstanceKlass.hpp ! src/share/vm/ci/ciInstanceKlassKlass.cpp ! src/share/vm/ci/ciInstanceKlassKlass.hpp ! src/share/vm/ci/ciKlass.cpp ! src/share/vm/ci/ciKlass.hpp ! src/share/vm/ci/ciKlassKlass.cpp ! src/share/vm/ci/ciKlassKlass.hpp ! src/share/vm/ci/ciMethod.cpp ! src/share/vm/ci/ciMethod.hpp ! src/share/vm/ci/ciMethodBlocks.cpp ! src/share/vm/ci/ciMethodBlocks.hpp ! src/share/vm/ci/ciMethodData.cpp ! src/share/vm/ci/ciMethodData.hpp ! src/share/vm/ci/ciMethodHandle.cpp ! src/share/vm/ci/ciMethodHandle.hpp ! src/share/vm/ci/ciMethodKlass.cpp ! src/share/vm/ci/ciMethodKlass.hpp ! src/share/vm/ci/ciNullObject.cpp ! src/share/vm/ci/ciNullObject.hpp ! src/share/vm/ci/ciObjArray.cpp ! src/share/vm/ci/ciObjArray.hpp ! src/share/vm/ci/ciObjArrayKlass.cpp ! src/share/vm/ci/ciObjArrayKlass.hpp ! src/share/vm/ci/ciObjArrayKlassKlass.cpp ! src/share/vm/ci/ciObjArrayKlassKlass.hpp ! src/share/vm/ci/ciObject.cpp ! src/share/vm/ci/ciObject.hpp ! src/share/vm/ci/ciObjectFactory.cpp ! src/share/vm/ci/ciObjectFactory.hpp ! src/share/vm/ci/ciSignature.cpp ! src/share/vm/ci/ciSignature.hpp ! src/share/vm/ci/ciStreams.cpp ! src/share/vm/ci/ciStreams.hpp ! src/share/vm/ci/ciSymbol.cpp ! src/share/vm/ci/ciSymbol.hpp ! src/share/vm/ci/ciSymbolKlass.cpp ! src/share/vm/ci/ciSymbolKlass.hpp ! src/share/vm/ci/ciType.cpp ! src/share/vm/ci/ciType.hpp ! src/share/vm/ci/ciTypeArray.cpp ! src/share/vm/ci/ciTypeArray.hpp ! src/share/vm/ci/ciTypeArrayKlass.cpp ! src/share/vm/ci/ciTypeArrayKlass.hpp ! src/share/vm/ci/ciTypeArrayKlassKlass.cpp ! src/share/vm/ci/ciTypeArrayKlassKlass.hpp ! src/share/vm/ci/ciTypeFlow.cpp ! src/share/vm/ci/ciTypeFlow.hpp ! src/share/vm/ci/ciUtilities.cpp ! src/share/vm/ci/ciUtilities.hpp ! src/share/vm/ci/compilerInterface.hpp ! src/share/vm/classfile/classFileError.cpp ! src/share/vm/classfile/classFileParser.cpp ! src/share/vm/classfile/classFileParser.hpp ! src/share/vm/classfile/classFileStream.cpp ! src/share/vm/classfile/classFileStream.hpp ! src/share/vm/classfile/classLoader.cpp ! src/share/vm/classfile/classLoader.hpp ! src/share/vm/classfile/dictionary.cpp ! src/share/vm/classfile/dictionary.hpp ! src/share/vm/classfile/javaAssertions.cpp ! src/share/vm/classfile/javaAssertions.hpp ! src/share/vm/classfile/javaClasses.cpp ! src/share/vm/classfile/javaClasses.hpp ! src/share/vm/classfile/loaderConstraints.cpp ! src/share/vm/classfile/loaderConstraints.hpp ! src/share/vm/classfile/placeholders.cpp ! src/share/vm/classfile/placeholders.hpp ! src/share/vm/classfile/resolutionErrors.cpp ! src/share/vm/classfile/resolutionErrors.hpp ! src/share/vm/classfile/stackMapFrame.cpp ! src/share/vm/classfile/stackMapFrame.hpp ! src/share/vm/classfile/stackMapTable.cpp ! src/share/vm/classfile/stackMapTable.hpp ! src/share/vm/classfile/symbolTable.cpp ! src/share/vm/classfile/symbolTable.hpp ! src/share/vm/classfile/systemDictionary.cpp ! src/share/vm/classfile/systemDictionary.hpp ! src/share/vm/classfile/verificationType.cpp ! src/share/vm/classfile/verificationType.hpp ! src/share/vm/classfile/verifier.cpp ! src/share/vm/classfile/verifier.hpp ! src/share/vm/classfile/vmSymbols.cpp ! src/share/vm/classfile/vmSymbols.hpp ! src/share/vm/code/codeBlob.cpp ! src/share/vm/code/codeBlob.hpp ! src/share/vm/code/codeCache.cpp ! src/share/vm/code/codeCache.hpp ! src/share/vm/code/compiledIC.cpp ! src/share/vm/code/compiledIC.hpp ! src/share/vm/code/compressedStream.cpp ! src/share/vm/code/compressedStream.hpp ! src/share/vm/code/debugInfo.cpp ! src/share/vm/code/debugInfo.hpp ! src/share/vm/code/debugInfoRec.cpp ! src/share/vm/code/debugInfoRec.hpp ! src/share/vm/code/dependencies.cpp ! src/share/vm/code/dependencies.hpp ! src/share/vm/code/exceptionHandlerTable.cpp ! src/share/vm/code/exceptionHandlerTable.hpp ! src/share/vm/code/icBuffer.cpp ! src/share/vm/code/icBuffer.hpp ! src/share/vm/code/jvmticmlr.h ! src/share/vm/code/location.cpp ! src/share/vm/code/location.hpp ! src/share/vm/code/nmethod.cpp ! src/share/vm/code/nmethod.hpp ! src/share/vm/code/oopRecorder.cpp ! src/share/vm/code/oopRecorder.hpp ! src/share/vm/code/pcDesc.cpp ! src/share/vm/code/pcDesc.hpp ! src/share/vm/code/relocInfo.cpp ! src/share/vm/code/relocInfo.hpp ! src/share/vm/code/scopeDesc.cpp ! src/share/vm/code/scopeDesc.hpp ! src/share/vm/code/stubs.cpp ! src/share/vm/code/stubs.hpp ! src/share/vm/code/vmreg.cpp ! src/share/vm/code/vmreg.hpp ! src/share/vm/code/vtableStubs.cpp ! src/share/vm/code/vtableStubs.hpp ! src/share/vm/compiler/abstractCompiler.cpp ! src/share/vm/compiler/abstractCompiler.hpp ! src/share/vm/compiler/compileBroker.cpp ! src/share/vm/compiler/compileBroker.hpp ! src/share/vm/compiler/compileLog.cpp ! src/share/vm/compiler/compileLog.hpp ! src/share/vm/compiler/compilerOracle.cpp ! src/share/vm/compiler/compilerOracle.hpp ! src/share/vm/compiler/disassembler.cpp ! src/share/vm/compiler/disassembler.hpp ! src/share/vm/compiler/methodLiveness.cpp ! src/share/vm/compiler/methodLiveness.hpp ! src/share/vm/compiler/oopMap.cpp ! src/share/vm/compiler/oopMap.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/binaryTreeDictionary.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsAdaptiveSizePolicy.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsCollectorPolicy.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsGCAdaptivePolicyCounters.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsLockVerifier.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsLockVerifier.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsOopClosures.inline.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsPermGen.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/cmsPermGen.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepThread.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeBlockDictionary.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeList.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeList.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/promotionInfo.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/vmCMSOperations.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp ! src/share/vm/gc_implementation/g1/bufferingOopClosure.hpp ! src/share/vm/gc_implementation/g1/collectionSetChooser.cpp ! src/share/vm/gc_implementation/g1/collectionSetChooser.hpp ! src/share/vm/gc_implementation/g1/concurrentG1Refine.cpp ! src/share/vm/gc_implementation/g1/concurrentG1Refine.hpp ! src/share/vm/gc_implementation/g1/concurrentG1RefineThread.cpp ! src/share/vm/gc_implementation/g1/concurrentG1RefineThread.hpp ! src/share/vm/gc_implementation/g1/concurrentMark.cpp ! src/share/vm/gc_implementation/g1/concurrentMark.hpp ! src/share/vm/gc_implementation/g1/concurrentMarkThread.cpp ! src/share/vm/gc_implementation/g1/concurrentMarkThread.hpp ! src/share/vm/gc_implementation/g1/concurrentMarkThread.inline.hpp ! src/share/vm/gc_implementation/g1/concurrentZFThread.cpp ! src/share/vm/gc_implementation/g1/concurrentZFThread.hpp ! src/share/vm/gc_implementation/g1/dirtyCardQueue.cpp ! src/share/vm/gc_implementation/g1/dirtyCardQueue.hpp ! src/share/vm/gc_implementation/g1/g1BlockOffsetTable.cpp ! src/share/vm/gc_implementation/g1/g1BlockOffsetTable.hpp ! src/share/vm/gc_implementation/g1/g1BlockOffsetTable.inline.hpp ! src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp ! src/share/vm/gc_implementation/g1/g1CollectedHeap.hpp ! src/share/vm/gc_implementation/g1/g1CollectedHeap.inline.hpp ! src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp ! src/share/vm/gc_implementation/g1/g1CollectorPolicy.hpp ! src/share/vm/gc_implementation/g1/g1MMUTracker.cpp ! src/share/vm/gc_implementation/g1/g1MMUTracker.hpp ! src/share/vm/gc_implementation/g1/g1MarkSweep.cpp ! src/share/vm/gc_implementation/g1/g1MarkSweep.hpp ! src/share/vm/gc_implementation/g1/g1OopClosures.hpp ! src/share/vm/gc_implementation/g1/g1OopClosures.inline.hpp ! src/share/vm/gc_implementation/g1/g1RemSet.cpp ! src/share/vm/gc_implementation/g1/g1RemSet.hpp ! src/share/vm/gc_implementation/g1/g1RemSet.inline.hpp ! src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.cpp ! src/share/vm/gc_implementation/g1/g1SATBCardTableModRefBS.hpp ! src/share/vm/gc_implementation/g1/g1_globals.cpp ! src/share/vm/gc_implementation/g1/g1_globals.hpp ! src/share/vm/gc_implementation/g1/g1_specialized_oop_closures.hpp ! src/share/vm/gc_implementation/g1/heapRegion.cpp ! src/share/vm/gc_implementation/g1/heapRegion.hpp ! src/share/vm/gc_implementation/g1/heapRegion.inline.hpp ! src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp ! src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp ! src/share/vm/gc_implementation/g1/heapRegionSeq.cpp ! src/share/vm/gc_implementation/g1/heapRegionSeq.hpp ! src/share/vm/gc_implementation/g1/heapRegionSeq.inline.hpp ! src/share/vm/gc_implementation/g1/ptrQueue.cpp ! src/share/vm/gc_implementation/g1/ptrQueue.hpp ! src/share/vm/gc_implementation/g1/satbQueue.cpp ! src/share/vm/gc_implementation/g1/satbQueue.hpp ! src/share/vm/gc_implementation/g1/sparsePRT.cpp ! src/share/vm/gc_implementation/g1/sparsePRT.hpp ! src/share/vm/gc_implementation/g1/survRateGroup.cpp ! src/share/vm/gc_implementation/g1/survRateGroup.hpp ! src/share/vm/gc_implementation/g1/vm_operations_g1.cpp ! src/share/vm/gc_implementation/g1/vm_operations_g1.hpp ! src/share/vm/gc_implementation/includeDB_gc_concurrentMarkSweep ! src/share/vm/gc_implementation/includeDB_gc_g1 ! src/share/vm/gc_implementation/includeDB_gc_parNew ! src/share/vm/gc_implementation/includeDB_gc_parallelScavenge ! src/share/vm/gc_implementation/includeDB_gc_serial ! src/share/vm/gc_implementation/includeDB_gc_shared ! src/share/vm/gc_implementation/parNew/asParNewGeneration.cpp ! src/share/vm/gc_implementation/parNew/asParNewGeneration.hpp ! src/share/vm/gc_implementation/parNew/parCardTableModRefBS.cpp ! src/share/vm/gc_implementation/parNew/parGCAllocBuffer.cpp ! src/share/vm/gc_implementation/parNew/parGCAllocBuffer.hpp ! src/share/vm/gc_implementation/parNew/parNewGeneration.cpp ! src/share/vm/gc_implementation/parNew/parNewGeneration.hpp ! src/share/vm/gc_implementation/parNew/parOopClosures.hpp ! src/share/vm/gc_implementation/parNew/parOopClosures.inline.hpp ! src/share/vm/gc_implementation/parNew/vmStructs_parNew.hpp ! src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.cpp ! src/share/vm/gc_implementation/parallelScavenge/adjoiningGenerations.hpp ! src/share/vm/gc_implementation/parallelScavenge/adjoiningVirtualSpaces.cpp ! src/share/vm/gc_implementation/parallelScavenge/adjoiningVirtualSpaces.hpp ! src/share/vm/gc_implementation/parallelScavenge/asPSOldGen.cpp ! src/share/vm/gc_implementation/parallelScavenge/asPSOldGen.hpp ! src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.cpp ! src/share/vm/gc_implementation/parallelScavenge/asPSYoungGen.hpp ! src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.cpp ! src/share/vm/gc_implementation/parallelScavenge/cardTableExtension.hpp ! src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.cpp ! src/share/vm/gc_implementation/parallelScavenge/gcTaskManager.hpp ! src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.cpp ! src/share/vm/gc_implementation/parallelScavenge/gcTaskThread.hpp ! src/share/vm/gc_implementation/parallelScavenge/generationSizer.hpp ! src/share/vm/gc_implementation/parallelScavenge/objectStartArray.cpp ! src/share/vm/gc_implementation/parallelScavenge/objectStartArray.hpp ! src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.cpp ! src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.hpp ! src/share/vm/gc_implementation/parallelScavenge/parMarkBitMap.inline.hpp ! src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.cpp ! src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.hpp ! src/share/vm/gc_implementation/parallelScavenge/parallelScavengeHeap.inline.hpp ! src/share/vm/gc_implementation/parallelScavenge/pcTasks.cpp ! src/share/vm/gc_implementation/parallelScavenge/pcTasks.hpp ! src/share/vm/gc_implementation/parallelScavenge/prefetchQueue.hpp ! src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.cpp ! src/share/vm/gc_implementation/parallelScavenge/psAdaptiveSizePolicy.hpp ! src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.cpp ! src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp ! src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.inline.hpp ! src/share/vm/gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.cpp ! src/share/vm/gc_implementation/parallelScavenge/psGCAdaptivePolicyCounters.hpp ! src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.cpp ! src/share/vm/gc_implementation/parallelScavenge/psGenerationCounters.hpp ! src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.cpp ! src/share/vm/gc_implementation/parallelScavenge/psMarkSweep.hpp ! src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.cpp ! src/share/vm/gc_implementation/parallelScavenge/psMarkSweepDecorator.hpp ! src/share/vm/gc_implementation/parallelScavenge/psOldGen.cpp ! src/share/vm/gc_implementation/parallelScavenge/psOldGen.hpp ! src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp ! src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp ! src/share/vm/gc_implementation/parallelScavenge/psPermGen.cpp ! src/share/vm/gc_implementation/parallelScavenge/psPermGen.hpp ! src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.cpp ! src/share/vm/gc_implementation/parallelScavenge/psPromotionLAB.hpp ! src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.cpp ! src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.hpp ! src/share/vm/gc_implementation/parallelScavenge/psPromotionManager.inline.hpp ! src/share/vm/gc_implementation/parallelScavenge/psScavenge.cpp ! src/share/vm/gc_implementation/parallelScavenge/psScavenge.hpp ! src/share/vm/gc_implementation/parallelScavenge/psScavenge.inline.hpp ! src/share/vm/gc_implementation/parallelScavenge/psTasks.cpp ! src/share/vm/gc_implementation/parallelScavenge/psTasks.hpp ! src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.cpp ! src/share/vm/gc_implementation/parallelScavenge/psVirtualspace.hpp ! src/share/vm/gc_implementation/parallelScavenge/psYoungGen.cpp ! src/share/vm/gc_implementation/parallelScavenge/psYoungGen.hpp ! src/share/vm/gc_implementation/parallelScavenge/vmPSOperations.cpp ! src/share/vm/gc_implementation/parallelScavenge/vmPSOperations.hpp ! src/share/vm/gc_implementation/parallelScavenge/vmStructs_parallelgc.hpp ! src/share/vm/gc_implementation/shared/adaptiveSizePolicy.cpp ! src/share/vm/gc_implementation/shared/adaptiveSizePolicy.hpp ! src/share/vm/gc_implementation/shared/ageTable.cpp ! src/share/vm/gc_implementation/shared/ageTable.hpp ! src/share/vm/gc_implementation/shared/allocationStats.cpp ! src/share/vm/gc_implementation/shared/allocationStats.hpp ! src/share/vm/gc_implementation/shared/cSpaceCounters.cpp ! src/share/vm/gc_implementation/shared/cSpaceCounters.hpp ! src/share/vm/gc_implementation/shared/collectorCounters.cpp ! src/share/vm/gc_implementation/shared/collectorCounters.hpp ! src/share/vm/gc_implementation/shared/concurrentGCThread.cpp ! src/share/vm/gc_implementation/shared/concurrentGCThread.hpp ! src/share/vm/gc_implementation/shared/gSpaceCounters.cpp ! src/share/vm/gc_implementation/shared/gSpaceCounters.hpp ! src/share/vm/gc_implementation/shared/gcAdaptivePolicyCounters.cpp ! src/share/vm/gc_implementation/shared/gcAdaptivePolicyCounters.hpp ! src/share/vm/gc_implementation/shared/gcPolicyCounters.cpp ! src/share/vm/gc_implementation/shared/gcPolicyCounters.hpp ! src/share/vm/gc_implementation/shared/gcStats.cpp ! src/share/vm/gc_implementation/shared/gcStats.hpp ! src/share/vm/gc_implementation/shared/gcUtil.cpp ! src/share/vm/gc_implementation/shared/gcUtil.hpp ! src/share/vm/gc_implementation/shared/generationCounters.cpp ! src/share/vm/gc_implementation/shared/generationCounters.hpp ! src/share/vm/gc_implementation/shared/immutableSpace.cpp ! src/share/vm/gc_implementation/shared/immutableSpace.hpp ! src/share/vm/gc_implementation/shared/isGCActiveMark.hpp ! src/share/vm/gc_implementation/shared/liveRange.hpp ! src/share/vm/gc_implementation/shared/markSweep.cpp ! src/share/vm/gc_implementation/shared/markSweep.hpp ! src/share/vm/gc_implementation/shared/markSweep.inline.hpp ! src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp ! src/share/vm/gc_implementation/shared/mutableNUMASpace.hpp ! src/share/vm/gc_implementation/shared/mutableSpace.cpp ! src/share/vm/gc_implementation/shared/mutableSpace.hpp ! src/share/vm/gc_implementation/shared/spaceCounters.cpp ! src/share/vm/gc_implementation/shared/spaceCounters.hpp ! src/share/vm/gc_implementation/shared/spaceDecorator.cpp ! src/share/vm/gc_implementation/shared/spaceDecorator.hpp ! src/share/vm/gc_implementation/shared/vmGCOperations.cpp ! src/share/vm/gc_implementation/shared/vmGCOperations.hpp ! src/share/vm/gc_interface/collectedHeap.cpp ! src/share/vm/gc_interface/collectedHeap.hpp ! src/share/vm/gc_interface/collectedHeap.inline.hpp ! src/share/vm/gc_interface/gcCause.cpp ! src/share/vm/gc_interface/gcCause.hpp ! src/share/vm/includeDB_compiler1 ! src/share/vm/includeDB_compiler2 ! src/share/vm/includeDB_core ! src/share/vm/includeDB_features ! src/share/vm/includeDB_gc ! src/share/vm/includeDB_gc_parallel ! src/share/vm/includeDB_jvmti ! src/share/vm/includeDB_zero ! src/share/vm/interpreter/abstractInterpreter.hpp ! src/share/vm/interpreter/bytecode.cpp ! src/share/vm/interpreter/bytecode.hpp ! src/share/vm/interpreter/bytecodeHistogram.cpp ! src/share/vm/interpreter/bytecodeHistogram.hpp ! src/share/vm/interpreter/bytecodeInterpreter.cpp ! src/share/vm/interpreter/bytecodeInterpreter.hpp ! src/share/vm/interpreter/bytecodeInterpreter.inline.hpp ! src/share/vm/interpreter/bytecodeInterpreterWithChecks.xml ! src/share/vm/interpreter/bytecodeInterpreterWithChecks.xsl ! src/share/vm/interpreter/bytecodeStream.cpp ! src/share/vm/interpreter/bytecodeStream.hpp ! src/share/vm/interpreter/bytecodeTracer.cpp ! src/share/vm/interpreter/bytecodeTracer.hpp ! src/share/vm/interpreter/bytecodes.cpp ! src/share/vm/interpreter/bytecodes.hpp ! src/share/vm/interpreter/cppInterpreter.cpp ! src/share/vm/interpreter/cppInterpreter.hpp ! src/share/vm/interpreter/cppInterpreterGenerator.hpp ! src/share/vm/interpreter/interpreter.cpp ! src/share/vm/interpreter/interpreter.hpp ! src/share/vm/interpreter/interpreterGenerator.hpp ! src/share/vm/interpreter/interpreterRuntime.cpp ! src/share/vm/interpreter/interpreterRuntime.hpp ! src/share/vm/interpreter/invocationCounter.cpp ! src/share/vm/interpreter/invocationCounter.hpp ! src/share/vm/interpreter/linkResolver.cpp ! src/share/vm/interpreter/linkResolver.hpp ! src/share/vm/interpreter/oopMapCache.cpp ! src/share/vm/interpreter/oopMapCache.hpp ! src/share/vm/interpreter/rewriter.cpp ! src/share/vm/interpreter/rewriter.hpp ! src/share/vm/interpreter/templateInterpreter.cpp ! src/share/vm/interpreter/templateInterpreter.hpp ! src/share/vm/interpreter/templateInterpreterGenerator.hpp ! src/share/vm/interpreter/templateTable.cpp ! src/share/vm/interpreter/templateTable.hpp ! src/share/vm/libadt/dict.cpp ! src/share/vm/libadt/dict.hpp ! src/share/vm/libadt/port.cpp ! src/share/vm/libadt/port.hpp ! src/share/vm/libadt/set.cpp ! src/share/vm/libadt/set.hpp ! src/share/vm/libadt/vectset.cpp ! src/share/vm/libadt/vectset.hpp ! src/share/vm/memory/allocation.cpp ! src/share/vm/memory/allocation.hpp ! src/share/vm/memory/allocation.inline.hpp ! src/share/vm/memory/barrierSet.cpp ! src/share/vm/memory/barrierSet.hpp ! src/share/vm/memory/barrierSet.inline.hpp ! src/share/vm/memory/blockOffsetTable.cpp ! src/share/vm/memory/blockOffsetTable.hpp ! src/share/vm/memory/blockOffsetTable.inline.hpp ! src/share/vm/memory/cardTableModRefBS.cpp ! src/share/vm/memory/cardTableModRefBS.hpp ! src/share/vm/memory/cardTableRS.cpp ! src/share/vm/memory/cardTableRS.hpp ! src/share/vm/memory/classify.cpp ! src/share/vm/memory/classify.hpp ! src/share/vm/memory/collectorPolicy.cpp ! src/share/vm/memory/collectorPolicy.hpp ! src/share/vm/memory/compactPermGen.hpp ! src/share/vm/memory/compactingPermGenGen.cpp ! src/share/vm/memory/compactingPermGenGen.hpp ! src/share/vm/memory/defNewGeneration.cpp ! src/share/vm/memory/defNewGeneration.hpp ! src/share/vm/memory/defNewGeneration.inline.hpp ! src/share/vm/memory/dump.cpp ! src/share/vm/memory/filemap.cpp ! src/share/vm/memory/filemap.hpp ! src/share/vm/memory/gcLocker.cpp ! src/share/vm/memory/gcLocker.hpp ! src/share/vm/memory/gcLocker.inline.hpp ! src/share/vm/memory/genCollectedHeap.cpp ! src/share/vm/memory/genCollectedHeap.hpp ! src/share/vm/memory/genMarkSweep.cpp ! src/share/vm/memory/genMarkSweep.hpp ! src/share/vm/memory/genOopClosures.hpp ! src/share/vm/memory/genOopClosures.inline.hpp ! src/share/vm/memory/genRemSet.cpp ! src/share/vm/memory/genRemSet.hpp ! src/share/vm/memory/genRemSet.inline.hpp ! src/share/vm/memory/generation.cpp ! src/share/vm/memory/generation.hpp ! src/share/vm/memory/generation.inline.hpp ! src/share/vm/memory/generationSpec.cpp ! src/share/vm/memory/generationSpec.hpp ! src/share/vm/memory/heap.cpp ! src/share/vm/memory/heap.hpp ! src/share/vm/memory/heapInspection.cpp ! src/share/vm/memory/heapInspection.hpp ! src/share/vm/memory/iterator.cpp ! src/share/vm/memory/iterator.hpp ! src/share/vm/memory/memRegion.cpp ! src/share/vm/memory/memRegion.hpp ! src/share/vm/memory/modRefBarrierSet.hpp ! src/share/vm/memory/oopFactory.cpp ! src/share/vm/memory/oopFactory.hpp ! src/share/vm/memory/permGen.cpp ! src/share/vm/memory/permGen.hpp ! src/share/vm/memory/referencePolicy.cpp ! src/share/vm/memory/referencePolicy.hpp ! src/share/vm/memory/referenceProcessor.cpp ! src/share/vm/memory/referenceProcessor.hpp ! src/share/vm/memory/resourceArea.cpp ! src/share/vm/memory/resourceArea.hpp ! src/share/vm/memory/restore.cpp ! src/share/vm/memory/serialize.cpp ! src/share/vm/memory/sharedHeap.cpp ! src/share/vm/memory/sharedHeap.hpp ! src/share/vm/memory/space.cpp ! src/share/vm/memory/space.hpp ! src/share/vm/memory/space.inline.hpp ! src/share/vm/memory/specialized_oop_closures.cpp ! src/share/vm/memory/specialized_oop_closures.hpp ! src/share/vm/memory/tenuredGeneration.cpp ! src/share/vm/memory/tenuredGeneration.hpp ! src/share/vm/memory/threadLocalAllocBuffer.cpp ! src/share/vm/memory/threadLocalAllocBuffer.hpp ! src/share/vm/memory/threadLocalAllocBuffer.inline.hpp ! src/share/vm/memory/universe.cpp ! src/share/vm/memory/universe.hpp ! src/share/vm/memory/universe.inline.hpp ! src/share/vm/memory/watermark.hpp ! src/share/vm/oops/arrayKlass.cpp ! src/share/vm/oops/arrayKlass.hpp ! src/share/vm/oops/arrayKlassKlass.cpp ! src/share/vm/oops/arrayKlassKlass.hpp ! src/share/vm/oops/arrayOop.cpp ! src/share/vm/oops/arrayOop.hpp ! src/share/vm/oops/compiledICHolderKlass.cpp ! src/share/vm/oops/compiledICHolderKlass.hpp ! src/share/vm/oops/compiledICHolderOop.cpp ! src/share/vm/oops/compiledICHolderOop.hpp ! src/share/vm/oops/constMethodKlass.cpp ! src/share/vm/oops/constMethodKlass.hpp ! src/share/vm/oops/constMethodOop.cpp ! src/share/vm/oops/constMethodOop.hpp ! src/share/vm/oops/constantPoolKlass.cpp ! src/share/vm/oops/constantPoolKlass.hpp ! src/share/vm/oops/constantPoolOop.cpp ! src/share/vm/oops/constantPoolOop.hpp ! src/share/vm/oops/cpCacheKlass.cpp ! src/share/vm/oops/cpCacheKlass.hpp ! src/share/vm/oops/cpCacheOop.cpp ! src/share/vm/oops/cpCacheOop.hpp ! src/share/vm/oops/generateOopMap.cpp ! src/share/vm/oops/generateOopMap.hpp ! src/share/vm/oops/instanceKlass.cpp ! src/share/vm/oops/instanceKlass.hpp ! src/share/vm/oops/instanceKlassKlass.cpp ! src/share/vm/oops/instanceKlassKlass.hpp ! src/share/vm/oops/instanceOop.cpp ! src/share/vm/oops/instanceOop.hpp ! src/share/vm/oops/instanceRefKlass.cpp ! src/share/vm/oops/instanceRefKlass.hpp ! src/share/vm/oops/klass.cpp ! src/share/vm/oops/klass.hpp ! src/share/vm/oops/klass.inline.hpp ! src/share/vm/oops/klassKlass.cpp ! src/share/vm/oops/klassKlass.hpp ! src/share/vm/oops/klassOop.cpp ! src/share/vm/oops/klassOop.hpp ! src/share/vm/oops/klassPS.hpp ! src/share/vm/oops/klassVtable.cpp ! src/share/vm/oops/klassVtable.hpp ! src/share/vm/oops/markOop.cpp ! src/share/vm/oops/markOop.hpp ! src/share/vm/oops/markOop.inline.hpp ! src/share/vm/oops/methodDataKlass.cpp ! src/share/vm/oops/methodDataKlass.hpp ! src/share/vm/oops/methodDataOop.cpp ! src/share/vm/oops/methodDataOop.hpp ! src/share/vm/oops/methodKlass.cpp ! src/share/vm/oops/methodKlass.hpp ! src/share/vm/oops/methodOop.cpp ! src/share/vm/oops/methodOop.hpp ! src/share/vm/oops/objArrayKlass.cpp ! src/share/vm/oops/objArrayKlass.hpp ! src/share/vm/oops/objArrayKlass.inline.hpp ! src/share/vm/oops/objArrayKlassKlass.cpp ! src/share/vm/oops/objArrayKlassKlass.hpp ! src/share/vm/oops/objArrayOop.cpp ! src/share/vm/oops/objArrayOop.hpp ! src/share/vm/oops/oop.cpp ! src/share/vm/oops/oop.hpp ! src/share/vm/oops/oop.inline.hpp ! src/share/vm/oops/oop.inline2.hpp ! src/share/vm/oops/oop.pcgc.inline.hpp ! src/share/vm/oops/oop.psgc.inline.hpp ! src/share/vm/oops/oopsHierarchy.cpp ! src/share/vm/oops/oopsHierarchy.hpp ! src/share/vm/oops/symbolKlass.cpp ! src/share/vm/oops/symbolKlass.hpp ! src/share/vm/oops/symbolOop.cpp ! src/share/vm/oops/symbolOop.hpp ! src/share/vm/oops/typeArrayKlass.cpp ! src/share/vm/oops/typeArrayKlass.hpp ! src/share/vm/oops/typeArrayKlassKlass.cpp ! src/share/vm/oops/typeArrayKlassKlass.hpp ! src/share/vm/oops/typeArrayOop.cpp ! src/share/vm/oops/typeArrayOop.hpp ! src/share/vm/opto/addnode.cpp ! src/share/vm/opto/addnode.hpp ! src/share/vm/opto/adlcVMDeps.hpp ! src/share/vm/opto/block.cpp ! src/share/vm/opto/block.hpp ! src/share/vm/opto/buildOopMap.cpp ! src/share/vm/opto/bytecodeInfo.cpp ! src/share/vm/opto/c2_globals.cpp ! src/share/vm/opto/c2_globals.hpp ! src/share/vm/opto/c2compiler.cpp ! src/share/vm/opto/c2compiler.hpp ! src/share/vm/opto/callGenerator.cpp ! src/share/vm/opto/callGenerator.hpp ! src/share/vm/opto/callnode.cpp ! src/share/vm/opto/callnode.hpp ! src/share/vm/opto/cfgnode.cpp ! src/share/vm/opto/cfgnode.hpp ! src/share/vm/opto/chaitin.cpp ! src/share/vm/opto/chaitin.hpp ! src/share/vm/opto/classes.cpp ! src/share/vm/opto/classes.hpp ! src/share/vm/opto/coalesce.cpp ! src/share/vm/opto/coalesce.hpp ! src/share/vm/opto/compile.cpp ! src/share/vm/opto/compile.hpp ! src/share/vm/opto/connode.cpp ! src/share/vm/opto/connode.hpp ! src/share/vm/opto/divnode.cpp ! src/share/vm/opto/divnode.hpp ! src/share/vm/opto/doCall.cpp ! src/share/vm/opto/domgraph.cpp ! src/share/vm/opto/escape.cpp ! src/share/vm/opto/escape.hpp ! src/share/vm/opto/gcm.cpp ! src/share/vm/opto/generateOptoStub.cpp ! src/share/vm/opto/graphKit.cpp ! src/share/vm/opto/graphKit.hpp ! src/share/vm/opto/idealGraphPrinter.cpp ! src/share/vm/opto/idealGraphPrinter.hpp ! src/share/vm/opto/idealKit.cpp ! src/share/vm/opto/idealKit.hpp ! src/share/vm/opto/ifg.cpp ! src/share/vm/opto/ifnode.cpp ! src/share/vm/opto/indexSet.cpp ! src/share/vm/opto/indexSet.hpp ! src/share/vm/opto/lcm.cpp ! src/share/vm/opto/library_call.cpp ! src/share/vm/opto/live.cpp ! src/share/vm/opto/live.hpp ! src/share/vm/opto/locknode.cpp ! src/share/vm/opto/locknode.hpp ! src/share/vm/opto/loopTransform.cpp ! src/share/vm/opto/loopUnswitch.cpp ! src/share/vm/opto/loopnode.cpp ! src/share/vm/opto/loopnode.hpp ! src/share/vm/opto/loopopts.cpp ! src/share/vm/opto/machnode.cpp ! src/share/vm/opto/machnode.hpp ! src/share/vm/opto/macro.cpp ! src/share/vm/opto/macro.hpp ! src/share/vm/opto/matcher.cpp ! src/share/vm/opto/matcher.hpp ! src/share/vm/opto/memnode.cpp ! src/share/vm/opto/memnode.hpp ! src/share/vm/opto/mulnode.cpp ! src/share/vm/opto/mulnode.hpp ! src/share/vm/opto/multnode.cpp ! src/share/vm/opto/multnode.hpp ! src/share/vm/opto/node.cpp ! src/share/vm/opto/node.hpp ! src/share/vm/opto/opcodes.cpp ! src/share/vm/opto/opcodes.hpp ! src/share/vm/opto/optoreg.hpp ! src/share/vm/opto/output.cpp ! src/share/vm/opto/output.hpp ! src/share/vm/opto/parse.hpp ! src/share/vm/opto/parse1.cpp ! src/share/vm/opto/parse2.cpp ! src/share/vm/opto/parse3.cpp ! src/share/vm/opto/parseHelper.cpp ! src/share/vm/opto/phase.cpp ! src/share/vm/opto/phase.hpp ! src/share/vm/opto/phaseX.cpp ! src/share/vm/opto/phaseX.hpp ! src/share/vm/opto/postaloc.cpp ! src/share/vm/opto/reg_split.cpp ! src/share/vm/opto/regalloc.cpp ! src/share/vm/opto/regalloc.hpp ! src/share/vm/opto/regmask.cpp ! src/share/vm/opto/regmask.hpp ! src/share/vm/opto/rootnode.cpp ! src/share/vm/opto/rootnode.hpp ! src/share/vm/opto/runtime.cpp ! src/share/vm/opto/runtime.hpp ! src/share/vm/opto/split_if.cpp ! src/share/vm/opto/stringopts.cpp ! src/share/vm/opto/stringopts.hpp ! src/share/vm/opto/subnode.cpp ! src/share/vm/opto/subnode.hpp ! src/share/vm/opto/superword.cpp ! src/share/vm/opto/superword.hpp ! src/share/vm/opto/type.cpp ! src/share/vm/opto/type.hpp ! src/share/vm/opto/vectornode.cpp ! src/share/vm/opto/vectornode.hpp ! src/share/vm/prims/evmCompat.cpp ! src/share/vm/prims/forte.cpp ! src/share/vm/prims/forte.hpp ! src/share/vm/prims/hpi_imported.h ! src/share/vm/prims/jni.cpp ! src/share/vm/prims/jni.h ! src/share/vm/prims/jniCheck.cpp ! src/share/vm/prims/jniCheck.hpp ! src/share/vm/prims/jniFastGetField.cpp ! src/share/vm/prims/jniFastGetField.hpp ! src/share/vm/prims/jni_md.h ! src/share/vm/prims/jvm.cpp ! src/share/vm/prims/jvm.h ! src/share/vm/prims/jvm_misc.hpp ! src/share/vm/prims/jvmti.xml ! src/share/vm/prims/jvmti.xsl ! src/share/vm/prims/jvmtiAgentThread.hpp ! src/share/vm/prims/jvmtiClassFileReconstituter.cpp ! src/share/vm/prims/jvmtiClassFileReconstituter.hpp ! src/share/vm/prims/jvmtiCodeBlobEvents.cpp ! src/share/vm/prims/jvmtiCodeBlobEvents.hpp ! src/share/vm/prims/jvmtiEnter.hpp ! src/share/vm/prims/jvmtiEnter.xsl ! src/share/vm/prims/jvmtiEnv.cpp ! src/share/vm/prims/jvmtiEnv.xsl ! src/share/vm/prims/jvmtiEnvBase.cpp ! src/share/vm/prims/jvmtiEnvBase.hpp ! src/share/vm/prims/jvmtiEnvFill.java ! src/share/vm/prims/jvmtiEnvThreadState.cpp ! src/share/vm/prims/jvmtiEnvThreadState.hpp ! src/share/vm/prims/jvmtiEventController.cpp ! src/share/vm/prims/jvmtiEventController.hpp ! src/share/vm/prims/jvmtiEventController.inline.hpp ! src/share/vm/prims/jvmtiExport.cpp ! src/share/vm/prims/jvmtiExport.hpp ! src/share/vm/prims/jvmtiExtensions.cpp ! src/share/vm/prims/jvmtiExtensions.hpp ! src/share/vm/prims/jvmtiGen.java ! src/share/vm/prims/jvmtiGetLoadedClasses.cpp ! src/share/vm/prims/jvmtiGetLoadedClasses.hpp ! src/share/vm/prims/jvmtiH.xsl ! src/share/vm/prims/jvmtiHpp.xsl ! src/share/vm/prims/jvmtiImpl.cpp ! src/share/vm/prims/jvmtiImpl.hpp ! src/share/vm/prims/jvmtiLib.xsl ! src/share/vm/prims/jvmtiManageCapabilities.cpp ! src/share/vm/prims/jvmtiManageCapabilities.hpp ! src/share/vm/prims/jvmtiRedefineClasses.cpp ! src/share/vm/prims/jvmtiRedefineClasses.hpp ! src/share/vm/prims/jvmtiRedefineClassesTrace.hpp ! src/share/vm/prims/jvmtiTagMap.cpp ! src/share/vm/prims/jvmtiTagMap.hpp ! src/share/vm/prims/jvmtiThreadState.cpp ! src/share/vm/prims/jvmtiThreadState.hpp ! src/share/vm/prims/jvmtiThreadState.inline.hpp ! src/share/vm/prims/jvmtiTrace.cpp ! src/share/vm/prims/jvmtiTrace.hpp ! src/share/vm/prims/jvmtiUtil.cpp ! src/share/vm/prims/jvmtiUtil.hpp ! src/share/vm/prims/methodComparator.cpp ! src/share/vm/prims/methodComparator.hpp ! src/share/vm/prims/methodHandleWalk.cpp ! src/share/vm/prims/methodHandleWalk.hpp ! src/share/vm/prims/methodHandles.cpp ! src/share/vm/prims/methodHandles.hpp ! src/share/vm/prims/nativeLookup.cpp ! src/share/vm/prims/nativeLookup.hpp ! src/share/vm/prims/perf.cpp ! src/share/vm/prims/privilegedStack.cpp ! src/share/vm/prims/privilegedStack.hpp ! src/share/vm/prims/unsafe.cpp ! src/share/vm/runtime/aprofiler.cpp ! src/share/vm/runtime/aprofiler.hpp ! src/share/vm/runtime/arguments.cpp ! src/share/vm/runtime/arguments.hpp ! src/share/vm/runtime/atomic.cpp ! src/share/vm/runtime/atomic.hpp ! src/share/vm/runtime/biasedLocking.cpp ! src/share/vm/runtime/biasedLocking.hpp ! src/share/vm/runtime/compilationPolicy.cpp ! src/share/vm/runtime/compilationPolicy.hpp ! src/share/vm/runtime/deoptimization.cpp ! src/share/vm/runtime/deoptimization.hpp ! src/share/vm/runtime/dtraceJSDT.cpp ! src/share/vm/runtime/dtraceJSDT.hpp ! src/share/vm/runtime/extendedPC.hpp ! src/share/vm/runtime/fieldDescriptor.cpp ! src/share/vm/runtime/fieldDescriptor.hpp ! src/share/vm/runtime/fieldType.cpp ! src/share/vm/runtime/fieldType.hpp ! src/share/vm/runtime/fprofiler.cpp ! src/share/vm/runtime/fprofiler.hpp ! src/share/vm/runtime/frame.cpp ! src/share/vm/runtime/frame.hpp ! src/share/vm/runtime/frame.inline.hpp ! src/share/vm/runtime/globals.cpp ! src/share/vm/runtime/globals.hpp ! src/share/vm/runtime/globals_extension.hpp ! src/share/vm/runtime/handles.cpp ! src/share/vm/runtime/handles.hpp ! src/share/vm/runtime/handles.inline.hpp ! src/share/vm/runtime/hpi.cpp ! src/share/vm/runtime/hpi.hpp ! src/share/vm/runtime/icache.cpp ! src/share/vm/runtime/icache.hpp ! src/share/vm/runtime/init.cpp ! src/share/vm/runtime/init.hpp ! src/share/vm/runtime/interfaceSupport.cpp ! src/share/vm/runtime/interfaceSupport.hpp ! src/share/vm/runtime/java.cpp ! src/share/vm/runtime/java.hpp ! src/share/vm/runtime/javaCalls.cpp ! src/share/vm/runtime/javaCalls.hpp ! src/share/vm/runtime/javaFrameAnchor.hpp ! src/share/vm/runtime/jfieldIDWorkaround.hpp ! src/share/vm/runtime/jniHandles.cpp ! src/share/vm/runtime/jniHandles.hpp ! src/share/vm/runtime/jniPeriodicChecker.cpp ! src/share/vm/runtime/jniPeriodicChecker.hpp ! src/share/vm/runtime/memprofiler.cpp ! src/share/vm/runtime/memprofiler.hpp ! src/share/vm/runtime/monitorChunk.cpp ! src/share/vm/runtime/monitorChunk.hpp ! src/share/vm/runtime/mutex.cpp ! src/share/vm/runtime/mutex.hpp ! src/share/vm/runtime/mutexLocker.cpp ! src/share/vm/runtime/mutexLocker.hpp ! src/share/vm/runtime/objectMonitor.hpp ! src/share/vm/runtime/objectMonitor.inline.hpp ! src/share/vm/runtime/orderAccess.cpp ! src/share/vm/runtime/orderAccess.hpp ! src/share/vm/runtime/os.cpp ! src/share/vm/runtime/os.hpp ! src/share/vm/runtime/osThread.cpp ! src/share/vm/runtime/osThread.hpp ! src/share/vm/runtime/perfData.cpp ! src/share/vm/runtime/perfData.hpp ! src/share/vm/runtime/perfMemory.cpp ! src/share/vm/runtime/perfMemory.hpp ! src/share/vm/runtime/prefetch.hpp ! src/share/vm/runtime/reflection.cpp ! src/share/vm/runtime/reflection.hpp ! src/share/vm/runtime/reflectionCompat.hpp ! src/share/vm/runtime/reflectionUtils.cpp ! src/share/vm/runtime/reflectionUtils.hpp ! src/share/vm/runtime/registerMap.hpp ! src/share/vm/runtime/relocator.cpp ! src/share/vm/runtime/relocator.hpp ! src/share/vm/runtime/rframe.cpp ! src/share/vm/runtime/rframe.hpp ! src/share/vm/runtime/safepoint.cpp ! src/share/vm/runtime/safepoint.hpp ! src/share/vm/runtime/sharedRuntime.cpp ! src/share/vm/runtime/sharedRuntime.hpp ! src/share/vm/runtime/sharedRuntimeTrans.cpp ! src/share/vm/runtime/sharedRuntimeTrig.cpp ! src/share/vm/runtime/signature.cpp ! src/share/vm/runtime/signature.hpp ! src/share/vm/runtime/stackValue.cpp ! src/share/vm/runtime/stackValue.hpp ! src/share/vm/runtime/stackValueCollection.cpp ! src/share/vm/runtime/stackValueCollection.hpp ! src/share/vm/runtime/statSampler.cpp ! src/share/vm/runtime/statSampler.hpp ! src/share/vm/runtime/stubCodeGenerator.cpp ! src/share/vm/runtime/stubCodeGenerator.hpp ! src/share/vm/runtime/stubRoutines.cpp ! src/share/vm/runtime/stubRoutines.hpp ! src/share/vm/runtime/sweeper.cpp ! src/share/vm/runtime/sweeper.hpp ! src/share/vm/runtime/synchronizer.cpp ! src/share/vm/runtime/synchronizer.hpp ! src/share/vm/runtime/task.cpp ! src/share/vm/runtime/task.hpp ! src/share/vm/runtime/thread.cpp ! src/share/vm/runtime/thread.hpp ! src/share/vm/runtime/threadCritical.hpp ! src/share/vm/runtime/threadLocalStorage.cpp ! src/share/vm/runtime/threadLocalStorage.hpp ! src/share/vm/runtime/timer.cpp ! src/share/vm/runtime/timer.hpp ! src/share/vm/runtime/unhandledOops.cpp ! src/share/vm/runtime/unhandledOops.hpp ! src/share/vm/runtime/vframe.cpp ! src/share/vm/runtime/vframe.hpp ! src/share/vm/runtime/vframeArray.cpp ! src/share/vm/runtime/vframeArray.hpp ! src/share/vm/runtime/vframe_hp.cpp ! src/share/vm/runtime/vframe_hp.hpp ! src/share/vm/runtime/virtualspace.cpp ! src/share/vm/runtime/virtualspace.hpp ! src/share/vm/runtime/vmStructs.cpp ! src/share/vm/runtime/vmStructs.hpp ! src/share/vm/runtime/vmThread.cpp ! src/share/vm/runtime/vmThread.hpp ! src/share/vm/runtime/vm_operations.cpp ! src/share/vm/runtime/vm_operations.hpp ! src/share/vm/runtime/vm_version.cpp ! src/share/vm/runtime/vm_version.hpp ! src/share/vm/runtime/vtune.hpp ! src/share/vm/services/attachListener.cpp ! src/share/vm/services/attachListener.hpp ! src/share/vm/services/classLoadingService.cpp ! src/share/vm/services/classLoadingService.hpp ! src/share/vm/services/dtraceAttacher.cpp ! src/share/vm/services/dtraceAttacher.hpp ! src/share/vm/services/g1MemoryPool.cpp ! src/share/vm/services/g1MemoryPool.hpp ! src/share/vm/services/heapDumper.cpp ! src/share/vm/services/heapDumper.hpp ! src/share/vm/services/jmm.h ! src/share/vm/services/lowMemoryDetector.cpp ! src/share/vm/services/lowMemoryDetector.hpp ! src/share/vm/services/management.cpp ! src/share/vm/services/management.hpp ! src/share/vm/services/memoryManager.cpp ! src/share/vm/services/memoryManager.hpp ! src/share/vm/services/memoryPool.cpp ! src/share/vm/services/memoryPool.hpp ! src/share/vm/services/memoryService.cpp ! src/share/vm/services/memoryService.hpp ! src/share/vm/services/memoryUsage.hpp ! src/share/vm/services/psMemoryPool.cpp ! src/share/vm/services/psMemoryPool.hpp ! src/share/vm/services/runtimeService.cpp ! src/share/vm/services/runtimeService.hpp ! src/share/vm/services/serviceUtil.hpp ! src/share/vm/services/threadService.cpp ! src/share/vm/services/threadService.hpp ! src/share/vm/utilities/accessFlags.cpp ! src/share/vm/utilities/accessFlags.hpp ! src/share/vm/utilities/array.cpp ! src/share/vm/utilities/array.hpp ! src/share/vm/utilities/bitMap.cpp ! src/share/vm/utilities/bitMap.hpp ! src/share/vm/utilities/bitMap.inline.hpp ! src/share/vm/utilities/constantTag.cpp ! src/share/vm/utilities/constantTag.hpp ! src/share/vm/utilities/copy.cpp ! src/share/vm/utilities/copy.hpp ! src/share/vm/utilities/debug.cpp ! src/share/vm/utilities/debug.hpp ! src/share/vm/utilities/defaultStream.hpp ! src/share/vm/utilities/dtrace.hpp ! src/share/vm/utilities/events.cpp ! src/share/vm/utilities/events.hpp ! src/share/vm/utilities/exceptions.cpp ! src/share/vm/utilities/exceptions.hpp ! src/share/vm/utilities/globalDefinitions.cpp ! src/share/vm/utilities/globalDefinitions.hpp ! src/share/vm/utilities/globalDefinitions_gcc.hpp ! src/share/vm/utilities/globalDefinitions_sparcWorks.hpp ! src/share/vm/utilities/globalDefinitions_visCPP.hpp ! src/share/vm/utilities/growableArray.cpp ! src/share/vm/utilities/growableArray.hpp ! src/share/vm/utilities/hashtable.cpp ! src/share/vm/utilities/hashtable.hpp ! src/share/vm/utilities/hashtable.inline.hpp ! src/share/vm/utilities/histogram.cpp ! src/share/vm/utilities/histogram.hpp ! src/share/vm/utilities/intHisto.cpp ! src/share/vm/utilities/intHisto.hpp ! src/share/vm/utilities/macros.hpp ! src/share/vm/utilities/numberSeq.cpp ! src/share/vm/utilities/numberSeq.hpp ! src/share/vm/utilities/ostream.cpp ! src/share/vm/utilities/ostream.hpp ! src/share/vm/utilities/preserveException.cpp ! src/share/vm/utilities/preserveException.hpp ! src/share/vm/utilities/sizes.cpp ! src/share/vm/utilities/sizes.hpp ! src/share/vm/utilities/taskqueue.cpp ! src/share/vm/utilities/taskqueue.hpp ! src/share/vm/utilities/top.hpp ! src/share/vm/utilities/utf8.cpp ! src/share/vm/utilities/utf8.hpp ! src/share/vm/utilities/vmError.cpp ! src/share/vm/utilities/vmError.hpp ! src/share/vm/utilities/workgroup.cpp ! src/share/vm/utilities/workgroup.hpp ! src/share/vm/utilities/xmlstream.cpp ! src/share/vm/utilities/xmlstream.hpp ! src/share/vm/utilities/yieldingWorkgroup.cpp ! src/share/vm/utilities/yieldingWorkgroup.hpp ! test/Makefile ! test/TEST.ROOT ! test/compiler/5057225/Test5057225.java ! test/compiler/6378821/Test6378821.java ! test/compiler/6431242/Test.java ! test/compiler/6539464/Test.java ! test/compiler/6589834/Test_ia32.java ! test/compiler/6603011/Test.java ! test/compiler/6636138/Test1.java ! test/compiler/6636138/Test2.java ! test/compiler/6646019/Test.java ! test/compiler/6646020/Tester.java ! test/compiler/6659207/Test.java ! test/compiler/6661247/Test.java ! test/compiler/6663621/IVTest.java ! test/compiler/6663848/Tester.java ! test/compiler/6663854/Test6663854.java ! test/compiler/6689060/Test.java ! test/compiler/6695810/Test.java ! test/compiler/6700047/Test6700047.java ! test/compiler/6711100/Test.java ! test/compiler/6711117/Test.java ! test/compiler/6712835/Test6712835.java ! test/compiler/6714694/Tester.java ! test/compiler/6716441/Tester.java ! test/compiler/6724218/Test.java ! test/compiler/6726999/Test.java ! test/compiler/6741738/Tester.java ! test/compiler/6756768/Test6756768.java ! test/compiler/6756768/Test6756768_2.java ! test/compiler/6757316/Test6757316.java ! test/compiler/6758234/Test6758234.java ! test/compiler/6769124/TestArrayCopy6769124.java ! test/compiler/6769124/TestDeoptInt6769124.java ! test/compiler/6769124/TestUnalignedLoad6769124.java ! test/compiler/6772683/InterruptedTest.java ! test/compiler/6775880/Test.java ! test/compiler/6778657/Test.java ! test/compiler/6792161/Test6792161.java ! test/compiler/6795161/Test.java ! test/compiler/6795362/Test6795362.java ! test/compiler/6795465/Test6795465.java ! test/compiler/6797305/Test6797305.java ! test/compiler/6799693/Test.java ! test/compiler/6800154/Test6800154.java ! test/compiler/6805724/Test6805724.java ! test/compiler/6814842/Test6814842.java ! test/compiler/6823354/Test6823354.java ! test/compiler/6823453/Test.java ! test/compiler/6826736/Test.java ! test/compiler/6832293/Test.java ! test/compiler/6833129/Test.java ! test/compiler/6837011/Test6837011.java ! test/compiler/6837094/Test.java ! test/compiler/6843752/Test.java ! test/compiler/6849574/Test.java ! test/compiler/6851282/Test.java ! test/compiler/6852078/Test6852078.java ! test/compiler/6855164/Test.java ! test/compiler/6855215/Test6855215.java ! test/compiler/6857159/Test6857159.java ! test/compiler/6857159/Test6857159.sh ! test/compiler/6859338/Test6859338.java ! test/compiler/6860469/Test.java ! test/compiler/6863155/Test6863155.java ! test/compiler/6863420/Test.java ! test/compiler/6865031/Test.java ! test/compiler/6866651/Test.java ! test/compiler/6875866/Test.java ! test/compiler/6877254/Test.java ! test/compiler/6879902/Test6879902.java ! test/compiler/6880034/Test6880034.java ! test/compiler/6885584/Test6885584.java ! test/compiler/6891750/Test6891750.java ! test/compiler/6892265/Test.java ! test/compiler/6895383/Test.java ! test/compiler/6896727/Test.java ! test/compiler/6901572/Test.java ! test/compiler/6909839/Test6909839.java ! test/compiler/6910484/Test.java ! test/compiler/6910605/Test.java ! test/compiler/6910618/Test.java ! test/compiler/6912517/Test.java ! test/compiler/6916644/Test6916644.java ! test/compiler/6921969/TestMultiplyLongHiZero.java ! test/compiler/6930043/Test6930043.java ! test/compiler/6932496/Test6932496.java ! test/compiler/6935535/Test.java ! test/compiler/6946040/TestCharShortByteSwap.java ! test/jprt.config ! test/runtime/6819213/TestBootNativeLibraryPath.java ! test/runtime/6925573/SortMethodsTest.java Changeset: 573e8ea5fd68 Author: trims Date: 2010-06-01 11:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/573e8ea5fd68 Merge Changeset: 49242b3df6cd Author: mikejwre Date: 2010-06-03 13:30 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/49242b3df6cd Added tag jdk7-b96 for changeset 573e8ea5fd68 ! .hgtags Changeset: 5f42499e57ad Author: trims Date: 2010-06-04 11:43 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/5f42499e57ad Added tag hs19-b02 for changeset 573e8ea5fd68 ! .hgtags Changeset: b0e7cd862748 Author: mikejwre Date: 2010-06-10 13:58 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/b0e7cd862748 Added tag jdk7-b97 for changeset 5f42499e57ad ! .hgtags From lana.steuck at oracle.com Wed Jun 16 23:03:52 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Wed, 16 Jun 2010 23:03:52 +0000 Subject: hg: jdk7/tl/jaxp: 2 new changesets Message-ID: <20100616230352.47A3A472E1@hg.openjdk.java.net> Changeset: ca01ec32561f Author: mikejwre Date: 2010-06-03 13:30 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/ca01ec32561f Added tag jdk7-b96 for changeset 9510ed0e1c7a ! .hgtags Changeset: d4adf4f2d14c Author: mikejwre Date: 2010-06-10 13:59 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/d4adf4f2d14c Added tag jdk7-b97 for changeset ca01ec32561f ! .hgtags From lana.steuck at oracle.com Wed Jun 16 23:03:56 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Wed, 16 Jun 2010 23:03:56 +0000 Subject: hg: jdk7/tl/jaxws: 2 new changesets Message-ID: <20100616230356.3A4F2472E2@hg.openjdk.java.net> Changeset: dac23846092a Author: mikejwre Date: 2010-06-03 13:30 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxws/rev/dac23846092a Added tag jdk7-b96 for changeset 208fd4451232 ! .hgtags Changeset: 457109807109 Author: mikejwre Date: 2010-06-10 13:59 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxws/rev/457109807109 Added tag jdk7-b97 for changeset dac23846092a ! .hgtags From lana.steuck at oracle.com Wed Jun 16 23:08:29 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Wed, 16 Jun 2010 23:08:29 +0000 Subject: hg: jdk7/tl/jdk: 33 new changesets Message-ID: <20100616231519.03659472E6@hg.openjdk.java.net> Changeset: 4c234c13f66a Author: ohair Date: 2010-05-26 20:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/4c234c13f66a 6956202: Fix a few missed rebranding issues, please contact lines etc. Reviewed-by: jjg, darcy, weijun ! make/common/Subdirs.gmk ! src/share/classes/com/sun/jarsigner/package.html ! src/share/classes/com/sun/java/util/jar/pack/package.html ! src/share/classes/com/sun/jdi/connect/package.html ! src/share/classes/com/sun/jdi/connect/spi/package.html ! src/share/classes/com/sun/jdi/event/package.html ! src/share/classes/com/sun/jdi/package.html ! src/share/classes/com/sun/jdi/request/package.html ! src/share/classes/com/sun/jmx/defaults/package.html ! src/share/classes/com/sun/jmx/interceptor/package.html ! src/share/classes/com/sun/jmx/mbeanserver/package.html ! src/share/classes/com/sun/jmx/remote/internal/package.html ! src/share/classes/com/sun/jmx/snmp/IPAcl/package.html ! src/share/classes/com/sun/jmx/snmp/agent/package.html ! src/share/classes/com/sun/jmx/snmp/daemon/package.html ! src/share/classes/com/sun/jmx/snmp/defaults/package.html ! src/share/classes/com/sun/jmx/snmp/internal/package.html ! src/share/classes/com/sun/jmx/snmp/mpm/package.html ! src/share/classes/com/sun/jmx/snmp/package.html ! src/share/classes/com/sun/jmx/snmp/tasks/package.html ! src/share/classes/com/sun/management/mgmt-overview.html ! src/share/classes/com/sun/management/package.html ! src/share/classes/com/sun/net/ssl/package.html ! src/share/classes/com/sun/rowset/providers/package.html ! src/share/classes/com/sun/servicetag/package.html ! src/share/classes/com/sun/servicetag/resources/register.html ! src/share/classes/com/sun/servicetag/resources/register_ja.html ! src/share/classes/com/sun/servicetag/resources/register_zh_CN.html ! src/share/classes/com/sun/tools/hat/resources/oqlhelp.html ! src/share/classes/java/security/acl/package.html ! src/share/classes/java/security/package.html ! src/share/classes/java/security/spec/package.html ! src/share/classes/java/sql/package.html ! src/share/classes/java/text/package.html ! src/share/classes/java/text/spi/package.html ! src/share/classes/java/util/jar/package.html ! src/share/classes/java/util/logging/package.html ! src/share/classes/java/util/package.html ! src/share/classes/java/util/prefs/package.html ! src/share/classes/java/util/regex/package.html ! src/share/classes/java/util/spi/package.html ! src/share/classes/java/util/zip/package.html ! src/share/classes/javax/accessibility/package.html ! src/share/classes/javax/crypto/interfaces/package.html ! src/share/classes/javax/crypto/package.html ! src/share/classes/javax/crypto/spec/package.html ! src/share/classes/javax/imageio/event/package.html ! src/share/classes/javax/imageio/metadata/doc-files/bmp_metadata.html ! src/share/classes/javax/imageio/metadata/doc-files/gif_metadata.html ! src/share/classes/javax/imageio/metadata/doc-files/jpeg_metadata.html ! src/share/classes/javax/imageio/metadata/doc-files/png_metadata.html ! src/share/classes/javax/imageio/metadata/doc-files/standard_metadata.html ! src/share/classes/javax/imageio/metadata/doc-files/wbmp_metadata.html ! src/share/classes/javax/imageio/metadata/package.html ! src/share/classes/javax/imageio/package.html ! src/share/classes/javax/imageio/plugins/bmp/package.html ! src/share/classes/javax/imageio/plugins/jpeg/package.html ! src/share/classes/javax/imageio/spi/package.html ! src/share/classes/javax/imageio/stream/package.html ! src/share/classes/javax/management/build.xml ! src/share/classes/javax/management/loading/package.html ! src/share/classes/javax/management/modelmbean/package.html ! src/share/classes/javax/management/monitor/package.html ! src/share/classes/javax/management/openmbean/package.html ! src/share/classes/javax/management/package.html ! src/share/classes/javax/management/relation/package.html ! src/share/classes/javax/management/remote/package.html ! src/share/classes/javax/management/remote/rmi/package.html ! src/share/classes/javax/management/timer/package.html ! src/share/classes/javax/naming/directory/package.html ! src/share/classes/javax/naming/event/package.html ! src/share/classes/javax/naming/ldap/package.html ! src/share/classes/javax/naming/package.html ! src/share/classes/javax/naming/spi/package.html ! src/share/classes/javax/net/package.html ! src/share/classes/javax/net/ssl/package.html ! src/share/classes/javax/print/attribute/package.html ! src/share/classes/javax/print/attribute/standard/package.html ! src/share/classes/javax/print/event/package.html ! src/share/classes/javax/print/package.html ! src/share/classes/javax/rmi/ssl/package.html ! src/share/classes/javax/script/package.html ! src/share/classes/javax/security/auth/callback/package.html ! src/share/classes/javax/security/auth/kerberos/package.html ! src/share/classes/javax/security/auth/login/package.html ! src/share/classes/javax/security/auth/package.html ! src/share/classes/javax/security/auth/spi/package.html ! src/share/classes/javax/security/auth/x500/package.html ! src/share/classes/javax/security/cert/package.html ! src/share/classes/javax/security/sasl/package.html ! src/share/classes/javax/sound/midi/package.html ! src/share/classes/javax/sound/midi/spi/package.html ! src/share/classes/javax/sound/sampled/package.html ! src/share/classes/javax/sound/sampled/spi/package.html ! src/share/classes/javax/sql/package.html ! src/share/classes/javax/sql/rowset/package.html ! src/share/classes/javax/sql/rowset/serial/package.html ! src/share/classes/javax/sql/rowset/spi/package.html ! src/share/classes/javax/swing/border/package.html ! src/share/classes/javax/swing/colorchooser/package.html ! src/share/classes/javax/swing/event/package.html ! src/share/classes/javax/swing/filechooser/package.html ! src/share/classes/javax/swing/package.html ! src/share/classes/javax/swing/plaf/basic/package.html ! src/share/classes/javax/swing/plaf/metal/package.html ! src/share/classes/javax/swing/plaf/multi/package.html ! src/share/classes/javax/swing/plaf/nimbus/package.html ! src/share/classes/javax/swing/plaf/package.html ! src/share/classes/javax/swing/plaf/synth/doc-files/componentProperties.html ! src/share/classes/javax/swing/plaf/synth/package.html ! src/share/classes/javax/swing/table/package.html ! src/share/classes/javax/swing/text/html/package.html ! src/share/classes/javax/swing/text/html/parser/package.html ! src/share/classes/javax/swing/text/package.html ! src/share/classes/javax/swing/text/rtf/package.html ! src/share/classes/javax/swing/tree/package.html ! src/share/classes/javax/swing/undo/package.html ! src/share/classes/javax/xml/crypto/dom/package.html ! src/share/classes/javax/xml/crypto/dsig/dom/package.html ! src/share/classes/javax/xml/crypto/dsig/keyinfo/package.html ! src/share/classes/javax/xml/crypto/dsig/package.html ! src/share/classes/javax/xml/crypto/dsig/spec/package.html ! src/share/classes/javax/xml/crypto/package.html ! src/share/classes/org/ietf/jgss/package.html ! src/share/classes/overview-core.html ! src/solaris/classes/sun/awt/X11/keysym2ucs.h ! test/java/awt/font/LineBreakMeasurer/FRCTest.java ! test/java/awt/image/ConvolveOp/EdgeNoOpCrash.java ! test/java/beans/XMLEncoder/java_awt_Component.java ! test/java/lang/ClassLoader/getdotresource.sh ! test/java/lang/Runtime/exec/setcwd.sh ! test/java/util/ResourceBundle/Bug4083270Test.properties ! test/java/util/ResourceBundle/Bug4168625Test.java ! test/javax/sound/midi/Gervill/SoftLanczosResampler/Interpolate.java ! test/javax/sound/midi/Gervill/SoftLinearResampler/Interpolate.java ! test/javax/sound/midi/Gervill/SoftLinearResampler2/Interpolate.java ! test/javax/sound/midi/Gervill/SoftPointResampler/Interpolate.java ! test/javax/sound/midi/Gervill/SoftReceiver/GetMidiDevice.java ! test/javax/sound/midi/Gervill/SoftSincResampler/Interpolate.java ! test/javax/swing/JTable/Test6888156.java ! test/sun/net/www/protocol/jar/getcontenttype.sh Changeset: a6276fa6643a Author: ohair Date: 2010-05-28 11:09 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/a6276fa6643a 6955707: Correct addNotices.sh logic in Makefiles 6949590: exes(java.exe, javaws.exe) show Copyright Year as 2004, COMPANY as Sun Reviewed-by: weijun, alanb ! make/common/Release.gmk ! make/common/shared/Defs.gmk ! make/java/nio/Makefile ! make/java/nio/addNotices.sh ! make/java/nio/genCharsetProvider.sh ! make/tools/manifest.mf ! src/share/classes/java/nio/channels/exceptions ! src/share/classes/java/nio/charset/exceptions ! src/share/classes/java/nio/exceptions ! src/share/classes/sun/nio/cs/standard-charsets Changeset: 51b9e5dbc2da Author: mikejwre Date: 2010-06-02 15:39 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/51b9e5dbc2da Merge Changeset: 050f05044e24 Author: mikejwre Date: 2010-06-03 13:30 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/050f05044e24 Added tag jdk7-b96 for changeset 51b9e5dbc2da ! .hgtags Changeset: ee157d437aa8 Author: prr Date: 2010-05-27 08:53 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/ee157d437aa8 6954424: Support OpenType/CFF fonts in JDK 7 Reviewed-by: bae, igor ! src/share/classes/java/awt/Font.java ! src/share/classes/sun/font/SunFontManager.java Changeset: 5294c7067018 Author: ceisserer Date: 2010-05-28 11:37 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/5294c7067018 6307603: [X11] Use RENDER extension for complex operations done in software Reviewed-by: bae, igor, prr ! make/common/Defs-solaris.gmk ! make/sun/awt/mapfile-mawt-vers ! make/sun/awt/mapfile-vers-linux ! make/sun/headless/mapfile-vers ! make/sun/jawt/Makefile ! make/sun/xawt/FILES_c_unix.gmk ! make/sun/xawt/Makefile ! make/sun/xawt/mapfile-vers + src/share/classes/sun/font/GlyphDisposedListener.java ! src/share/classes/sun/font/StrikeCache.java ! src/share/classes/sun/java2d/pipe/BufferedPaints.java ! src/share/classes/sun/java2d/pipe/RenderBuffer.java ! src/share/classes/sun/java2d/pisces/META-INF/services/sun.java2d.pipe.RenderingEngine ! src/share/native/sun/font/AccelGlyphCache.c ! src/share/native/sun/font/fontscalerdefs.h ! src/share/native/sun/font/freetypeScaler.c ! src/share/native/sun/font/sunFont.c ! src/share/native/sun/java2d/opengl/OGLTextRenderer.c ! src/solaris/classes/sun/awt/X11GraphicsDevice.java ! src/solaris/classes/sun/awt/X11GraphicsEnvironment.java + src/solaris/classes/sun/font/XRGlyphCache.java + src/solaris/classes/sun/font/XRGlyphCacheEntry.java + src/solaris/classes/sun/font/XRTextRenderer.java ! src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java + src/solaris/classes/sun/java2d/jules/IdleTileCache.java + src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java + src/solaris/classes/sun/java2d/jules/JulesPathBuf.java + src/solaris/classes/sun/java2d/jules/JulesRenderingEngine.java + src/solaris/classes/sun/java2d/jules/JulesShapePipe.java + src/solaris/classes/sun/java2d/jules/JulesTile.java + src/solaris/classes/sun/java2d/jules/TileWorker.java + src/solaris/classes/sun/java2d/jules/TrapezoidList.java ! src/solaris/classes/sun/java2d/x11/X11SurfaceData.java + src/solaris/classes/sun/java2d/x11/XSurfaceData.java + src/solaris/classes/sun/java2d/xr/DirtyRegion.java + src/solaris/classes/sun/java2d/xr/GrowableByteArray.java + src/solaris/classes/sun/java2d/xr/GrowableEltArray.java + src/solaris/classes/sun/java2d/xr/GrowableIntArray.java + src/solaris/classes/sun/java2d/xr/GrowablePointArray.java + src/solaris/classes/sun/java2d/xr/GrowableRectArray.java + src/solaris/classes/sun/java2d/xr/MaskTile.java + src/solaris/classes/sun/java2d/xr/MaskTileManager.java + src/solaris/classes/sun/java2d/xr/MutableInteger.java + src/solaris/classes/sun/java2d/xr/XIDGenerator.java + src/solaris/classes/sun/java2d/xr/XRBackend.java + src/solaris/classes/sun/java2d/xr/XRBackendNative.java + src/solaris/classes/sun/java2d/xr/XRColor.java + src/solaris/classes/sun/java2d/xr/XRCompositeManager.java + src/solaris/classes/sun/java2d/xr/XRDrawImage.java + src/solaris/classes/sun/java2d/xr/XRGraphicsConfig.java + src/solaris/classes/sun/java2d/xr/XRMaskBlit.java + src/solaris/classes/sun/java2d/xr/XRMaskFill.java + src/solaris/classes/sun/java2d/xr/XRMaskImage.java + src/solaris/classes/sun/java2d/xr/XRPMBlitLoops.java + src/solaris/classes/sun/java2d/xr/XRPaints.java + src/solaris/classes/sun/java2d/xr/XRRenderer.java + src/solaris/classes/sun/java2d/xr/XRSurfaceData.java + src/solaris/classes/sun/java2d/xr/XRSurfaceDataProxy.java + src/solaris/classes/sun/java2d/xr/XRUtils.java + src/solaris/classes/sun/java2d/xr/XRVolatileSurfaceManager.java + src/solaris/classes/sun/java2d/xr/XcbRequestCounter.java ! src/solaris/native/sun/java2d/x11/X11SurfaceData.c ! src/solaris/native/sun/java2d/x11/X11SurfaceData.h + src/solaris/native/sun/java2d/x11/XRBackendNative.c + src/solaris/native/sun/java2d/x11/XRSurfaceData.c Changeset: be6f14f83ea7 Author: lana Date: 2010-05-29 23:26 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/be6f14f83ea7 Merge ! make/common/Defs-solaris.gmk ! make/sun/awt/mapfile-mawt-vers ! make/sun/awt/mapfile-vers-linux ! make/sun/headless/mapfile-vers ! make/sun/jawt/Makefile ! make/sun/xawt/FILES_c_unix.gmk ! make/sun/xawt/Makefile ! make/sun/xawt/mapfile-vers ! src/share/classes/java/awt/Font.java ! src/share/classes/sun/font/StrikeCache.java ! src/share/classes/sun/font/SunFontManager.java ! src/share/classes/sun/java2d/pipe/BufferedPaints.java ! src/share/classes/sun/java2d/pipe/RenderBuffer.java ! src/share/native/sun/font/AccelGlyphCache.c ! src/share/native/sun/font/fontscalerdefs.h ! src/share/native/sun/font/freetypeScaler.c ! src/share/native/sun/font/sunFont.c ! src/share/native/sun/java2d/opengl/OGLTextRenderer.c ! src/solaris/classes/sun/awt/X11GraphicsDevice.java ! src/solaris/classes/sun/awt/X11GraphicsEnvironment.java ! src/solaris/classes/sun/java2d/UnixSurfaceManagerFactory.java ! src/solaris/classes/sun/java2d/x11/X11SurfaceData.java ! src/solaris/native/sun/java2d/x11/X11SurfaceData.c ! src/solaris/native/sun/java2d/x11/X11SurfaceData.h Changeset: 3b909e2e2131 Author: rupashka Date: 2010-05-17 17:23 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3b909e2e2131 6938481: 4906607 is not fixed for NIMBUS L&F Reviewed-by: alexp ! src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java Changeset: 57d7b80faad8 Author: peytoia Date: 2010-05-18 16:40 +0900 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/57d7b80faad8 6953294: Fix for 6909002 was incorrectly merged Reviewed-by: okutsu ! make/com/sun/Makefile - make/com/sun/inputmethods/Makefile - make/com/sun/inputmethods/indicim/Makefile - make/com/sun/inputmethods/thaiim/Makefile - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java - src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties Changeset: a71c27e3ec4a Author: malenkov Date: 2010-05-20 18:44 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/a71c27e3ec4a 6479191: LTP: XMLEncoder does not update initialized property of GridBagConstraints type Reviewed-by: rupashka ! src/share/classes/java/beans/DefaultPersistenceDelegate.java ! src/share/classes/java/beans/MetaData.java ! src/share/classes/java/beans/XMLEncoder.java ! test/java/beans/XMLEncoder/java_awt_GridBagConstraints.java Changeset: bbd5a5a4e64f Author: malenkov Date: 2010-05-20 20:42 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/bbd5a5a4e64f 6910490: MatteBorder JScrollpane interaction Reviewed-by: alexp ! src/share/classes/javax/swing/border/MatteBorder.java + test/javax/swing/border/Test6910490.html + test/javax/swing/border/Test6910490.java Changeset: 3a19541d8119 Author: alexp Date: 2010-05-21 22:04 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3a19541d8119 6953396: javax.swing.plaf.basic.BasicViewportUI.uninstallDefaults() is not called when UI is uninstalled Reviewed-by: rupashka ! src/share/classes/javax/swing/plaf/basic/BasicViewportUI.java + test/javax/swing/JViewport/6953396/bug6953396.java Changeset: a0c6dae0f173 Author: lana Date: 2010-05-21 17:49 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/a0c6dae0f173 Merge Changeset: 3de717f6ddab Author: alexp Date: 2010-05-25 20:22 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3de717f6ddab 6786238: api/javax_swing/DefaultDesktopManager/descriptions.html#xxxFrame Fails with NPE since 6u12 b02 Reviewed-by: rupashka ! src/share/classes/javax/swing/DefaultDesktopManager.java Changeset: 1297a41dbb47 Author: alexp Date: 2010-05-25 20:30 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/1297a41dbb47 6937798: Nimbus: Issues with JTable grid Reviewed-by: rupashka ! src/share/classes/javax/swing/plaf/synth/SynthTableUI.java + test/javax/swing/JTable/6937798/bug6937798.java Changeset: 8d59b361635f Author: alexp Date: 2010-05-25 20:39 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/8d59b361635f 6768387: REGRESSION: JTable no longer serializable Reviewed-by: rupashka ! src/share/classes/sun/swing/table/DefaultTableCellHeaderRenderer.java + test/javax/swing/JTable/6768387/bug6768387.java Changeset: d540eeccf73a Author: alexp Date: 2010-05-25 20:54 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/d540eeccf73a 6884066: JTableHeader listens mouse in disabled state and doesn't work when not attached to a table Reviewed-by: rupashka ! src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java ! src/share/classes/javax/swing/JTable.java ! src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java ! src/share/classes/sun/swing/SwingUtilities2.java + test/javax/swing/JTableHeader/6884066/bug6884066.java Changeset: fc1ac6ea933c Author: peterz Date: 2010-05-26 20:22 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/fc1ac6ea933c 6632959: swing html parser doesn't know € or › Reviewed-by: alexp ! make/javax/swing/FILES.gmk ! make/javax/swing/Makefile - src/share/classes/javax/swing/text/html/parser/html32.bdtd Changeset: e821a3568b0a Author: rupashka Date: 2010-05-26 22:02 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/e821a3568b0a 6925473: REGRESSION: JOptionPane in dialog is full-screen height Reviewed-by: peterz ! src/share/classes/javax/swing/text/WrappedPlainView.java + test/javax/swing/JTextArea/6925473/bug6925473.java + test/javax/swing/JTextArea/6940863/bug6940863.java ! test/javax/swing/JTextArea/Test6593649.java Changeset: 824b0f8b68f6 Author: peterz Date: 2010-05-28 13:31 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/824b0f8b68f6 6929507: Build error on file swing.plaf.synth.SynthUI Reviewed-by: rupashka ! make/common/Release.gmk ! make/tools/sharing/classlist.linux ! make/tools/sharing/classlist.solaris Changeset: e2b1bab101d2 Author: peterz Date: 2010-05-28 13:32 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/e2b1bab101d2 6954231: SynthTextPaneUI.installUI() doesn't set component to opaque even if prop was not set by client progr Reviewed-by: alexp ! src/share/classes/javax/swing/plaf/basic/BasicTextUI.java ! src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java Changeset: 9b247a6290a4 Author: alexp Date: 2010-05-28 19:46 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/9b247a6290a4 6889007: No resize cursor during hovering mouse over JTable Reviewed-by: rupashka ! src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java + test/javax/swing/JTableHeader/6889007/bug6889007.java Changeset: 82524b068f77 Author: alexp Date: 2010-05-28 19:55 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/82524b068f77 6670274: Incorrect tab titles for JTabbedPane if using HTML (BasicTabbedPanelUI problem) Reviewed-by: rupashka ! src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java + test/javax/swing/JTabbedPane/6670274/bug6670274.java Changeset: be03f9a285f0 Author: lana Date: 2010-06-01 14:17 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/be03f9a285f0 Merge ! make/com/sun/Makefile ! make/common/Release.gmk ! make/javax/swing/FILES.gmk ! make/javax/swing/Makefile ! src/share/classes/com/sun/java/swing/plaf/windows/WindowsTableHeaderUI.java ! src/share/classes/java/beans/DefaultPersistenceDelegate.java ! src/share/classes/java/beans/MetaData.java ! src/share/classes/java/beans/XMLEncoder.java ! src/share/classes/javax/swing/DefaultDesktopManager.java ! src/share/classes/javax/swing/JTable.java ! src/share/classes/javax/swing/border/MatteBorder.java ! src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java ! src/share/classes/javax/swing/plaf/basic/BasicTableHeaderUI.java ! src/share/classes/javax/swing/plaf/basic/BasicTextUI.java ! src/share/classes/javax/swing/plaf/basic/BasicViewportUI.java ! src/share/classes/javax/swing/plaf/synth/SynthTableUI.java ! src/share/classes/javax/swing/plaf/synth/SynthTextPaneUI.java ! src/share/classes/javax/swing/text/WrappedPlainView.java ! src/share/classes/sun/swing/SwingUtilities2.java ! src/share/classes/sun/swing/plaf/synth/SynthFileChooserUIImpl.java ! src/share/classes/sun/swing/table/DefaultTableCellHeaderRenderer.java ! test/java/beans/XMLEncoder/java_awt_GridBagConstraints.java ! test/javax/swing/JTextArea/Test6593649.java Changeset: 18ee3c1b9143 Author: lana Date: 2010-06-01 21:25 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/18ee3c1b9143 Merge - make/com/sun/inputmethods/Makefile - make/com/sun/inputmethods/indicim/Makefile - make/com/sun/inputmethods/thaiim/Makefile - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java - src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties - src/share/classes/javax/swing/text/html/parser/html32.bdtd Changeset: 31a7a323a604 Author: lana Date: 2010-06-01 21:36 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/31a7a323a604 Merge - src/share/classes/sun/security/tools/PolicyTool.java Changeset: 962608ee8cdb Author: lana Date: 2010-06-07 15:35 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/962608ee8cdb 6888130: SwingSet2: Demo is not launching and throwing NPE. Reviewed-by: prr ! src/share/classes/javax/swing/plaf/basic/BasicTabbedPaneUI.java Changeset: 7140b5759b63 Author: lana Date: 2010-06-07 17:08 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/7140b5759b63 Merge - make/com/sun/inputmethods/Makefile - make/com/sun/inputmethods/indicim/Makefile - make/com/sun/inputmethods/thaiim/Makefile ! make/common/Release.gmk - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java - src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties ! src/share/classes/java/util/zip/package.html - src/share/classes/javax/swing/text/html/parser/html32.bdtd - src/share/classes/sun/security/tools/PolicyTool.java Changeset: fb56f86642d6 Author: andrew Date: 2010-06-03 18:49 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/fb56f86642d6 6958257: Add support for alpha Summary: Allow the Zero port to be built on alpha architectures Reviewed-by: ohair ! make/common/Defs-linux.gmk Changeset: be0d055db574 Author: ohair Date: 2010-06-07 12:22 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/be0d055db574 6959116: Fix regression in make/jdk_generic_profile.sh (PROCESSOR_IDENTIFIER) Reviewed-by: alanb ! make/jdk_generic_profile.sh Changeset: b1903d7528d3 Author: mikejwre Date: 2010-06-09 18:56 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/b1903d7528d3 Merge Changeset: 6568c84116bb Author: mikejwre Date: 2010-06-10 13:59 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/6568c84116bb Added tag jdk7-b97 for changeset b1903d7528d3 ! .hgtags Changeset: 94404fea2067 Author: lana Date: 2010-06-16 14:07 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/94404fea2067 Merge - make/com/sun/inputmethods/Makefile - make/com/sun/inputmethods/indicim/Makefile - make/com/sun/inputmethods/thaiim/Makefile ! make/common/Defs-linux.gmk ! make/common/Defs-solaris.gmk ! make/common/Release.gmk - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/indicim/DevanagariTables.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethod.java - src/share/classes/com/sun/inputmethods/internal/indicim/IndicInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/indicim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_de.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_es.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_fr.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_it.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ja.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_ko.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_sv.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_CN.properties - src/share/classes/com/sun/inputmethods/internal/indicim/resources/DisplayNames_zh_TW.properties - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethod.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodDescriptor.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiInputMethodImpl.java - src/share/classes/com/sun/inputmethods/internal/thaiim/ThaiRules.java - src/share/classes/com/sun/inputmethods/internal/thaiim/java.awt.im.spi.InputMethodDescriptor - src/share/classes/com/sun/inputmethods/internal/thaiim/resources/DisplayNames.properties ! src/share/classes/com/sun/servicetag/resources/register.html ! src/share/classes/com/sun/servicetag/resources/register_ja.html ! src/share/classes/com/sun/servicetag/resources/register_zh_CN.html - src/share/classes/javax/swing/text/html/parser/html32.bdtd ! test/java/util/ResourceBundle/Bug4168625Test.java From jonathan.gibbons at oracle.com Wed Jun 16 23:24:32 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Wed, 16 Jun 2010 23:24:32 +0000 Subject: hg: jdk7/tl/langtools: 6956638: JavacTask.generate does not generate all required files Message-ID: <20100616232435.B5066472EA@hg.openjdk.java.net> Changeset: 0840dd65b9e2 Author: jjg Date: 2010-06-16 16:23 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/0840dd65b9e2 6956638: JavacTask.generate does not generate all required files Reviewed-by: darcy Contributed-by: joshuamaurice at gmail.com + test/tools/javac/T6956638.java From mandy.chung at oracle.com Thu Jun 17 00:41:57 2010 From: mandy.chung at oracle.com (Mandy Chung) Date: Wed, 16 Jun 2010 17:41:57 -0700 Subject: Review request: test/java/util/logging/ParentLoggersTest.java fails in samevm mode In-Reply-To: <4C196CAB.8020700@oracle.com> References: <4C17B6D9.8070800@oracle.com> <4C196CAB.8020700@oracle.com> Message-ID: <4C196F55.9000406@oracle.com> Daniel D. Daugherty wrote: > Mandy, > > What happens when the test is run twice in samevm mode? The test only needs to support running once in samevm mode. Are you thinking of some kind of stress testing? In any case, I don't think we need to fix the test to support running more than once in the same vm. Mandy > > I suspect that the expected Logger names will be in the > initialLoggerNames list at the beginning of the second run > and thus won't be added to returnedLoggerNames on line 104. > > There isn't a way to delete a Logger so if you want this > test to work when run twice, you'll need to filter the > expected Loggers out of the initial list. So instead of > the defaultLogger filter on lines 48-54, you'll need to > filter out the expected Loggers instead. > > Dan > > > > On 6/15/2010 11:22 AM, Mandy Chung wrote: >> Fixed 6961408: test/java/util/logging/ParentLoggersTest.java fails in >> samevm mode >> >> Webrev at: >> http://cr.openjdk.java.net/~mchung/6961408/webrev.00/ >> >> This fix updates the test to check the list of loggers before and >> after the test run and also takes out all logging tests from the >> ProblemList.txt. >> >> Thanks >> Mandy From lana.steuck at oracle.com Thu Jun 17 01:11:24 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Thu, 17 Jun 2010 01:11:24 +0000 Subject: hg: jdk7/tl/langtools: 7 new changesets Message-ID: <20100617011138.6FC8D472F4@hg.openjdk.java.net> Changeset: 9c2d50e46e31 Author: ohair Date: 2010-05-26 20:22 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/9c2d50e46e31 6956202: Fix a few missed rebranding issues, please contact lines etc. Reviewed-by: darcy, jjg, weijun ! src/share/classes/com/sun/javadoc/package.html ! src/share/classes/com/sun/mirror/overview.html ! src/share/classes/com/sun/source/tree/DisjointTypeTree.java ! src/share/classes/javax/lang/model/overview.html ! test/tools/apt/mirror/declaration/pkg1/pkg2/package.html Changeset: 89cd267c2167 Author: mikejwre Date: 2010-06-02 15:40 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/89cd267c2167 Merge Changeset: aecce211bc6f Author: mikejwre Date: 2010-06-03 13:30 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/aecce211bc6f Added tag jdk7-b96 for changeset 89cd267c2167 ! .hgtags Changeset: c0a41294297e Author: lana Date: 2010-06-07 17:09 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/c0a41294297e Merge Changeset: 3b38f3aa3dc3 Author: mikejwre Date: 2010-06-10 13:59 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/3b38f3aa3dc3 Added tag jdk7-b97 for changeset c0a41294297e ! .hgtags Changeset: 93e1975eea7a Author: lana Date: 2010-06-16 14:09 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/93e1975eea7a Merge ! test/tools/apt/mirror/declaration/pkg1/pkg2/package.html Changeset: e2b845fdc437 Author: lana Date: 2010-06-16 17:52 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/e2b845fdc437 Merge From weijun.wang at sun.com Thu Jun 17 05:47:36 2010 From: weijun.wang at sun.com (weijun.wang at sun.com) Date: Thu, 17 Jun 2010 05:47:36 +0000 Subject: hg: jdk7/tl/jdk: 6959292: regression: cannot login if session key and preauth does not use the same etype Message-ID: <20100617054747.6409A472FF@hg.openjdk.java.net> Changeset: 3df25d0680f3 Author: weijun Date: 2010-06-17 13:46 +0800 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3df25d0680f3 6959292: regression: cannot login if session key and preauth does not use the same etype Reviewed-by: xuelei, valeriep ! src/share/classes/sun/security/krb5/Credentials.java ! src/share/classes/sun/security/krb5/EncryptionKey.java ! src/share/classes/sun/security/krb5/KrbAsReq.java ! src/share/classes/sun/security/krb5/internal/KRBError.java ! src/windows/classes/sun/security/krb5/internal/tools/Kinit.java ! test/sun/security/krb5/auto/KDC.java ! test/sun/security/krb5/auto/W83.java From mandy.chung at oracle.com Thu Jun 17 06:22:59 2010 From: mandy.chung at oracle.com (Mandy Chung) Date: Wed, 16 Jun 2010 23:22:59 -0700 Subject: Review request for 6961894: TEST_BUG: jdk_lang tests fail in samevm mode Message-ID: <4C19BF43.3060607@oracle.com> Another patch of test fixes - with these fixes, there are now 5 remaining tests in ProblemList.txt excluded for jdk_lang test target. 6961894: TEST_BUG: jdk_lang tests fail in samevm mode Webrev at: http://cr.openjdk.java.net/~mchung/6961894/webrev.00/ - Some tests are marked to run in othervm mode - Some java/lang/management tests are cleaned up to restore the state before it finishes. - java/lang/reflect/Proxy and a few tests have its custom classloader. Fix them to use the proper parent class loader. Thanks Mandy From mandy.chung at oracle.com Thu Jun 17 06:28:14 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Thu, 17 Jun 2010 06:28:14 +0000 Subject: hg: jdk7/tl/jdk: 6961408: test/java/util/logging/ParentLoggersTest.java fails in samevm mode Message-ID: <20100617062835.0F52C47303@hg.openjdk.java.net> Changeset: c995607e7719 Author: mchung Date: 2010-06-16 23:27 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/c995607e7719 6961408: test/java/util/logging/ParentLoggersTest.java fails in samevm mode Summary: Check against the list of loggers added since the test begins to run Reviewed-by: dcubed ! test/ProblemList.txt ! test/java/util/logging/ParentLoggersTest.java From Alan.Bateman at oracle.com Thu Jun 17 08:34:31 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Thu, 17 Jun 2010 09:34:31 +0100 Subject: Review request for 6961894: TEST_BUG: jdk_lang tests fail in samevm mode In-Reply-To: <4C19BF43.3060607@oracle.com> References: <4C19BF43.3060607@oracle.com> Message-ID: <4C19DE17.50703@oracle.com> Mandy Chung wrote: > Another patch of test fixes - with these fixes, there are now 5 > remaining tests in ProblemList.txt excluded for jdk_lang test target. > > 6961894: TEST_BUG: jdk_lang tests fail in samevm mode > > Webrev at: > http://cr.openjdk.java.net/~mchung/6961894/webrev.00/ > > - Some tests are marked to run in othervm mode > - Some java/lang/management tests are cleaned up to restore the state > before it finishes. > - java/lang/reflect/Proxy and a few tests have its custom > classloader. Fix them to use the proper parent class loader. > > Thanks > Mandy This mostly look good to me. One comment on the M&M tests that still run in samevm mode, is that it might be nicer to restore the settings in a finally block. That will ensure they are restored in the event that the test fails. That could work in test/java/lang/management/ThreadMXBean/{Enable,Disable}Test.java for example. Also in test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java. Thanks for removing sun/management/jmxremote/bootstrap/JvmstatCountersTest.java from the list - I didn't realize it was the problem list when fixing 6950927. I notice you've also removed a few java/util/ResourceBundle and java/util/Locale tests from the problem - is this list problem list maintenance? -Alan. From Alan.Bateman at oracle.com Thu Jun 17 15:07:16 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Thu, 17 Jun 2010 16:07:16 +0100 Subject: 6962045: TEST_BUG: Tests in test/java/io/Serializable leave files open Message-ID: <4C1A3A24.10001@oracle.com> Many of the serialization tests leave files open and this causes problems, particularly on Windows, when running these tests in jtreg samevm mode. One failure can cascade and cause all subsequent tests to fail. I've taken a pass over these tests so that all 115 now pass in this mode. The changes are trivial and are mostly just the addition of a finally block to close the streams. I've kept the changes to a minimum and more work could be done if anyone has cycles. In particular there are several tests that close their files but only when the test passes. One idea is to take a pass over these tests once ARM blocks are in and stable. I've changed one test to run in othervm mode as it requires a security manager (and I'm assuming we're not all at jtreg 4.1 yet). There are two tests that assumed the test is loaded by the system class loader. Otherwise all the changes are trivial. I've put the webrev here: http://cr.openjdk.java.net/~alanb/6962045/webrev/ -Alan. From xueming.shen at oracle.com Thu Jun 17 15:31:54 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Thu, 17 Jun 2010 08:31:54 -0700 Subject: TEST_BUG: Tests in java/util/zip/ZipFile leave file open Message-ID: <4C1A3FEA.9000302@oracle.com> These tests leave either ZipFile or io stream open after testing, fail in samevm mode, so are not in ProblemList.txt now. With the change they now all pass. http://cr.openjdk.java.net/~sherman/6962067/webrev Thanks, -Sherman From mandy.chung at ORACLE.COM Thu Jun 17 16:06:32 2010 From: mandy.chung at ORACLE.COM (Mandy Chung) Date: Thu, 17 Jun 2010 09:06:32 -0700 Subject: Review request for 6961894: TEST_BUG: jdk_lang tests fail in samevm mode In-Reply-To: <4C19DE17.50703@oracle.com> References: <4C19BF43.3060607@oracle.com> <4C19DE17.50703@oracle.com> Message-ID: <4C1A4808.6080601@oracle.com> Alan Bateman wrote: > Mandy Chung wrote: >> Another patch of test fixes - with these fixes, there are now 5 >> remaining tests in ProblemList.txt excluded for jdk_lang test target. >> >> 6961894: TEST_BUG: jdk_lang tests fail in samevm mode >> >> Webrev at: >> http://cr.openjdk.java.net/~mchung/6961894/webrev.00/ >> >> - Some tests are marked to run in othervm mode >> - Some java/lang/management tests are cleaned up to restore the state >> before it finishes. >> - java/lang/reflect/Proxy and a few tests have its custom >> classloader. Fix them to use the proper parent class loader. >> >> Thanks >> Mandy > This mostly look good to me. > > One comment on the M&M tests that still run in samevm mode, is that it > might be nicer to restore the settings in a finally block. That will > ensure they are restored in the event that the test fails. Good suggestion. I'll make the change. > That could work in > test/java/lang/management/ThreadMXBean/{Enable,Disable}Test.java for > example. Also in > test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java. > > Thanks for removing > sun/management/jmxremote/bootstrap/JvmstatCountersTest.java from the > list - I didn't realize it was the problem list when fixing 6950927. I > notice you've also removed a few java/util/ResourceBundle and > java/util/Locale tests from the problem - is this list problem list > maintenance? Yes, some tests were fixed but the problem list was not updated. Thanks Mandy From alan.bateman at oracle.com Thu Jun 17 17:08:07 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Thu, 17 Jun 2010 17:08:07 +0000 Subject: hg: jdk7/tl/jdk: 6395224: (so) SocketChannel writer blocked on large buffer is not preempted by close method (vista) Message-ID: <20100617170853.4364B4731E@hg.openjdk.java.net> Changeset: 1281181df71b Author: alanb Date: 2010-06-17 17:49 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/1281181df71b 6395224: (so) SocketChannel writer blocked on large buffer is not preempted by close method (vista) Reviewed-by: chegar ! src/windows/native/sun/nio/ch/SocketDispatcher.c ! src/windows/native/sun/nio/ch/nio_util.h ! test/ProblemList.txt ! test/java/nio/channels/AsyncCloseAndInterrupt.java From Alan.Bateman at oracle.com Thu Jun 17 18:34:09 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Thu, 17 Jun 2010 19:34:09 +0100 Subject: TEST_BUG: Tests in java/util/zip/ZipFile leave file open In-Reply-To: <4C1A3FEA.9000302@oracle.com> References: <4C1A3FEA.9000302@oracle.com> Message-ID: <4C1A6AA1.5080403@oracle.com> Xueming Shen wrote: > These tests leave either ZipFile or io stream open after testing, fail > in samevm mode, so are not in > ProblemList.txt now. With the change they now all pass. > > http://cr.openjdk.java.net/~sherman/6962067/webrev > > Thanks, > -Sherman Good to see more tests coming off the "problem list". In test/java/util/zip/Info.java would it be nicer to put a try/finally around the usage of the ZipInputStream so that it closes even when the test fails. Same thing in test/java/util/zip/Comment.java. In ManyEntries.java it would also be nice to put a try/finally about the usage of zos. I notice you've changed the copyright date in 3 of the tests. I think the deal is that we are supposed convert it to a range and keep the original year (look at other files for examples). I think Kelly mentioned he's going to cook up a script that will occasionally fix up the second year, and save us needing to touch it. -Alan. From forax at univ-mlv.fr Thu Jun 17 18:37:11 2010 From: forax at univ-mlv.fr (=?ISO-8859-1?Q?R=E9mi_Forax?=) Date: Thu, 17 Jun 2010 20:37:11 +0200 Subject: TEST_BUG: Tests in java/util/zip/ZipFile leave file open In-Reply-To: <4C1A3FEA.9000302@oracle.com> References: <4C1A3FEA.9000302@oracle.com> Message-ID: <4C1A6B57.20705@univ-mlv.fr> Le 17/06/2010 17:31, Xueming Shen a ?crit : > These tests leave either ZipFile or io stream open after testing, fail > in samevm mode, so are not in > ProblemList.txt now. With the change they now all pass. > > http://cr.openjdk.java.net/~sherman/6962067/webrev > > Thanks, > -Sherman Looks good to me. R?mi From xueming.shen at oracle.com Thu Jun 17 19:15:06 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Thu, 17 Jun 2010 12:15:06 -0700 Subject: TEST_BUG: Tests in java/util/zip/ZipFile leave file open In-Reply-To: <4C1A6AA1.5080403@oracle.com> References: <4C1A3FEA.9000302@oracle.com> <4C1A6AA1.5080403@oracle.com> Message-ID: <4C1A743A.6070206@oracle.com> Thanks for the review. InfoZip fails gracefully (increase the "failed" number) when test fails, and if there is an unexpected IO failure/exception the test fails anyway. So I did not add the try/finally/close pattern. But, it does not hurt to do that, so I added suggested anyway. Same thing goes to the zos, the only bad thing could happen is the unexpected IO failure/exception, in which the test case fails anyway with an exception. Yes, I updated the webrev to use the suggested try/finally. Copyright date has been updated accordingly as well. -Sherman Alan Bateman wrote: > Xueming Shen wrote: >> These tests leave either ZipFile or io stream open after testing, >> fail in samevm mode, so are not in >> ProblemList.txt now. With the change they now all pass. >> >> http://cr.openjdk.java.net/~sherman/6962067/webrev >> >> Thanks, >> -Sherman > Good to see more tests coming off the "problem list". > > In test/java/util/zip/Info.java would it be nicer to put a try/finally > around the usage of the ZipInputStream so that it closes even when the > test fails. Same thing in test/java/util/zip/Comment.java. In > ManyEntries.java it would also be nice to put a try/finally about the > usage of zos. > > I notice you've changed the copyright date in 3 of the tests. I think > the deal is that we are supposed convert it to a range and keep the > original year (look at other files for examples). I think Kelly > mentioned he's going to cook up a script that will occasionally fix up > the second year, and save us needing to touch it. > > -Alan. From Alan.Bateman at oracle.com Thu Jun 17 19:53:43 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Thu, 17 Jun 2010 20:53:43 +0100 Subject: TEST_BUG: Tests in java/util/zip/ZipFile leave file open In-Reply-To: <4C1A743A.6070206@oracle.com> References: <4C1A3FEA.9000302@oracle.com> <4C1A6AA1.5080403@oracle.com> <4C1A743A.6070206@oracle.com> Message-ID: <4C1A7D47.50504@oracle.com> Xueming Shen wrote: > Thanks for the review. > > InfoZip fails gracefully (increase the "failed" number) when test > fails, and if there is an unexpected > IO failure/exception the test fails anyway. So I did not add the > try/finally/close pattern. But, it > does not hurt to do that, so I added suggested anyway. > > Same thing goes to the zos, the only bad thing could happen is the > unexpected IO failure/exception, > in which the test case fails anyway with an exception. Yes, I updated > the webrev to use the suggested > try/finally. > > Copyright date has been updated accordingly as well. > > -Sherman Thanks. The updated webrev looks fine. One minor comment is that the try/finally blocks could be a bit neater, eg: ZipFile zf = new ZipFile(f); try { ... } finally { zf.close(); } That would avoid initializing zf to null and then checking if is null. Up to you if you want to change them. -Alan. From xueming.shen at oracle.com Thu Jun 17 20:15:59 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Thu, 17 Jun 2010 13:15:59 -0700 Subject: TEST_BUG: Tests in java/util/zip/ZipFile leave file open In-Reply-To: <4C1A7D47.50504@oracle.com> References: <4C1A3FEA.9000302@oracle.com> <4C1A6AA1.5080403@oracle.com> <4C1A743A.6070206@oracle.com> <4C1A7D47.50504@oracle.com> Message-ID: <4C1A827F.7080203@oracle.com> It looks much better/neater:-) Thanks, Sherman Alan Bateman wrote: > Xueming Shen wrote: >> Thanks for the review. >> >> InfoZip fails gracefully (increase the "failed" number) when test >> fails, and if there is an unexpected >> IO failure/exception the test fails anyway. So I did not add the >> try/finally/close pattern. But, it >> does not hurt to do that, so I added suggested anyway. >> >> Same thing goes to the zos, the only bad thing could happen is the >> unexpected IO failure/exception, >> in which the test case fails anyway with an exception. Yes, I updated >> the webrev to use the suggested >> try/finally. >> >> Copyright date has been updated accordingly as well. >> >> -Sherman > Thanks. The updated webrev looks fine. One minor comment is that the > try/finally blocks could be a bit neater, eg: > > ZipFile zf = new ZipFile(f); > try { > ... > } finally { > zf.close(); > } > > That would avoid initializing zf to null and then checking if is null. > Up to you if you want to change them. > > -Alan. > > From xueming.shen at oracle.com Thu Jun 17 20:26:57 2010 From: xueming.shen at oracle.com (xueming.shen at oracle.com) Date: Thu, 17 Jun 2010 20:26:57 +0000 Subject: hg: jdk7/tl/jdk: 6962067: TEST_BUG: Tests in java/util/zip/ZipFile leave file open Message-ID: <20100617202716.8EF1647326@hg.openjdk.java.net> Changeset: 5e4547833379 Author: sherman Date: 2010-06-17 13:21 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/5e4547833379 6962067: TEST_BUG: Tests in java/util/zip/ZipFile leave file open Summary: Close zipfile and io stream when done Reviewed-by: alanb ! test/ProblemList.txt ! test/java/util/zip/InfoZip.java ! test/java/util/zip/ZipFile/Comment.java ! test/java/util/zip/ZipFile/CorruptedZipFiles.java ! test/java/util/zip/ZipFile/ManyEntries.java From kelly.ohair at oracle.com Fri Jun 18 02:07:11 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Fri, 18 Jun 2010 02:07:11 +0000 Subject: hg: jdk7/tl/jdk: 6869741: Integrate JAX-WS 2.2 and JAXB 2.2 in JDK 7 Message-ID: <20100618020730.5A21647334@hg.openjdk.java.net> Changeset: 006e852b692e Author: ohair Date: 2010-06-17 14:42 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/006e852b692e 6869741: Integrate JAX-WS 2.2 and JAXB 2.2 in JDK 7 Reviewed-by: ramap ! make/docs/CORE_PKGS.gmk From kelly.ohair at oracle.com Fri Jun 18 02:07:51 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Fri, 18 Jun 2010 02:07:51 +0000 Subject: hg: jdk7/tl/jaxws: 2 new changesets Message-ID: <20100618020751.3412947335@hg.openjdk.java.net> Changeset: 38fd32b8e990 Author: ohair Date: 2010-06-17 17:18 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxws/rev/38fd32b8e990 6869741: Integrate JAX-WS 2.2 and JAXB 2.2 in JDK 7 Reviewed-by: darcy, ramap ! jaxws.properties Changeset: 48872561d4b1 Author: ohair Date: 2010-06-17 17:19 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxws/rev/48872561d4b1 6955292: Workaround ant 1.7.1 package-info.java issue in ant scripts 6940241: Change jaxp/jaxws so that the http downloads are not done by default 6960333: Add make level ALLOW_DOWNLOADS=true option Reviewed-by: darcy, ramap ! build-defs.xml ! build-drop-template.xml ! build.properties ! build.xml ! make/Makefile From kelly.ohair at oracle.com Fri Jun 18 02:15:35 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Fri, 18 Jun 2010 02:15:35 +0000 Subject: hg: jdk7/tl/jaxp: 2 new changesets Message-ID: <20100618021535.9EFB547336@hg.openjdk.java.net> Changeset: 214f47923c24 Author: ohair Date: 2010-06-17 10:43 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/214f47923c24 6955301: Update names and references to rebranded drop bundles (jaxp, jaxws, jaf) Reviewed-by: darcy ! jaxp.properties Changeset: 961ad5ff3b19 Author: ohair Date: 2010-06-17 10:50 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/961ad5ff3b19 6955292: Workaround ant 1.7.1 package-info.java issue in ant scripts 6960333: Add make level ALLOW_DOWNLOADS=true option 6940241: Change jaxp/jaxws so that the http downloads are not done by default Reviewed-by: darcy ! build-defs.xml ! build-drop-template.xml ! build.properties ! build.xml ! make/Makefile From iaroslavski at mail.ru Fri Jun 18 13:07:43 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Fri, 18 Jun 2010 17:07:43 +0400 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: Message-ID: <4C1B6F9F.4050302@mail.ru> Hello, Here is next piece of improvements, see attached class. It is surprise but code a[less++] = ak; works slower (client VM) than a[less] = ak; less++; In general, we save about about 1% on Bentley's test suite. Also I eliminate additional check of indexes k and less: if (k != less) { // swap a[k] and a[less] } For long type it gives additional one percent and works the same for other types. If you don't have any comments/suggestions, I'm going to integrate the code into JDK repository on the next week. Thanks, Vladimir Vladimir Iaroslavski wrote: > Hello, > > Here is the latest version of Dual-Pivot Quicksort with minor javadoc changes. > > Does anybody have comments/suggestions/improvements? > > Thank you, > Vladimir -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: DualPivotQuicksort.java URL: From Alan.Bateman at oracle.com Fri Jun 18 14:55:06 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Fri, 18 Jun 2010 15:55:06 +0100 Subject: 6962419: TEST_BUG: java_io tests fails in samevm mode Message-ID: <4C1B88CA.1030901@oracle.com> This is another batch of updates to the regression tests to allow them be run in jtreg samevm mode. This batch covers the java.io tests. As expected, most of the issues are simply tests leaving files open, causing problems for subsequent tests running in the same VM. There are also several other random issues such as tests assuming the working directory, one test assuming it will be defined by the system class loader, and an issue cleaning up after a test that leaves a hidden file. The webrev with the changes is here: http://cr.openjdk.java.net/~alanb/6962419/webrev/ With these changes (plus yesterday's batch to fix the serialization tests) then all 305 java.io tests pass, for me, in both samevm and othervm modes on all platforms. Alan. From alan.bateman at oracle.com Fri Jun 18 15:17:52 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Fri, 18 Jun 2010 15:17:52 +0000 Subject: hg: jdk7/tl/jdk: 4981129: (dc) DatagramSocket created by DatagramChannel does not provide sender info Message-ID: <20100618151802.8D00647380@hg.openjdk.java.net> Changeset: 6c188df7bfef Author: alanb Date: 2010-06-18 16:16 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/6c188df7bfef 4981129: (dc) DatagramSocket created by DatagramChannel does not provide sender info Reviewed-by: chegar ! src/share/classes/sun/nio/ch/DatagramSocketAdaptor.java ! test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java From kelly.ohair at oracle.com Fri Jun 18 15:23:30 2010 From: kelly.ohair at oracle.com (Kelly O'Hair) Date: Fri, 18 Jun 2010 08:23:30 -0700 Subject: 6962419: TEST_BUG: java_io tests fails in samevm mode In-Reply-To: <4C1B88CA.1030901@oracle.com> References: <4C1B88CA.1030901@oracle.com> Message-ID: Looks great to me. Thanks to everyone for fixing tests like this. People should keep in mind that some of the test batches in the jdk/ test/Makefile do NOT run in samevm mode at all, e.g. jdk_awt, jdk_beans2, jdk_beans3, jdk_management1, jdk_management2, jdk_nio2, jdk_nio3, jdk_rmi, jdk_security2, jdk_security3, jdk_swing, and jdk_tools2. When I tried to run them in samevm mode, there were too many problems, so I gave up on the entire batch. Although some of the batches may make sense to be entirely othervm tests, like jdk_tools2. But eventually, I think it's a good idea to mark tests that need a dedicated VM "othervm", making it explicit. If you look at the jdk/test/Makefile, you will see uses of "RunOthervmBatch", and my goal was to run everything "RunSamevmBatch", someday. (FYI... the jdk_awt, jdk_rmi, and jdk_swing tests really need a dedicated X11 display and are not run on a regular basis yet). --- Just an aside comment. I really hate import wildcards, seems so... inexact. I noticed that there are GPL utilities out there that could clean these up for us, making the import list exact. One I found at http://www.javafaq.nu/java-article914.html, and I know NetBeans and IDEs have 'Fix Imports' options, I use them all the time. But if this could be easily batched... seems like something to think about. Maybe that would be a good summer intern job of figuring out how to make the imports explicit, and also a scheme to maintain it? What do you think? Is it worth it? Maybe create a database too so people could run all the tests using a specific class or method? Just ideas... -kto On Jun 18, 2010, at 7:55 AM, Alan Bateman wrote: > > This is another batch of updates to the regression tests to allow > them be run in jtreg samevm mode. This batch covers the java.io > tests. As expected, most of the issues are simply tests leaving > files open, causing problems for subsequent tests running in the > same VM. There are also several other random issues such as tests > assuming the working directory, one test assuming it will be defined > by the system class loader, and an issue cleaning up after a test > that leaves a hidden file. > > The webrev with the changes is here: > http://cr.openjdk.java.net/~alanb/6962419/webrev/ > > With these changes (plus yesterday's batch to fix the serialization > tests) then all 305 java.io tests pass, for me, in both samevm and > othervm modes on all platforms. > > Alan. From opinali at gmail.com Fri Jun 18 16:03:50 2010 From: opinali at gmail.com (Osvaldo Doederlein) Date: Fri, 18 Jun 2010 13:03:50 -0300 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4C1B6F9F.4050302@mail.ru> References: <4C1B6F9F.4050302@mail.ru> Message-ID: Hi, 2010/6/18 Vladimir Iaroslavski > Hello, > > Here is next piece of improvements, see attached class. > It is surprise but code > > a[less++] = ak; > > works slower (client VM) than > > a[less] = ak; > less++; > This is really surprising, even if it's C1 only - and bad, considering that "p[i++] = y" is a very popular Java idiom for sequential mutation of arrays (th equivalent of C's "*p++ = y"). I wonder if this reveals some simple bug/weakness of C1 that should be investigated. Even a un-mighty, client-side JIT should have no problem with such minor code-ordering issue. I'm all in favor of micro optimization for critical stuff like DPQS (or most of the core actually), but the kind of change above borders gratuitous code churn... perhaps if the problem is simple to fix at the VM level, we gain this extra 1% not only in DPQS but in a gazillion other methods. A+ Osvaldo > > In general, we save about about 1% on Bentley's test suite. > Also I eliminate additional check of indexes k and less: > > if (k != less) { > // swap a[k] and a[less] > } > For long type it gives additional one percent and works the same > for other types. > > If you don't have any comments/suggestions, I'm going to integrate > the code into JDK repository on the next week. > > Thanks, > Vladimir > > Vladimir Iaroslavski wrote: > >> Hello, >> >> Here is the latest version of Dual-Pivot Quicksort with minor javadoc >> changes. >> >> Does anybody have comments/suggestions/improvements? >> >> Thank you, >> Vladimir >> > > /* > * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. > * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. > * > * This code is free software; you can redistribute it and/or modify it > * under the terms of the GNU General Public License version 2 only, as > * published by the Free Software Foundation. Sun designates this > * particular file as subject to the "Classpath" exception as provided > * by Sun in the LICENSE file that accompanied this code. > * > * This code is distributed in the hope that it will be useful, but WITHOUT > * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or > * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License > * version 2 for more details (a copy is included in the LICENSE file that > * accompanied this code). > * > * You should have received a copy of the GNU General Public License > version > * 2 along with this work; if not, write to the Free Software Foundation, > * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. > * > * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, > * CA 95054 USA or visit www.sun.com if you need additional information or > * have any questions. > */ > > package java.util; > > /** > * This class implements the Dual-Pivot Quicksort algorithm by > * Vladimir Yaroslavskiy, Jon Bentley, and Josh Bloch. The algorithm > * offers O(n log(n)) performance on many data sets that cause other > * quicksorts to degrade to quadratic performance, and is typically > * faster than traditional (one-pivot) Quicksort implementations. > * > * @author Vladimir Yaroslavskiy > * @author Jon Bentley > * @author Josh Bloch > * > * @version 2010.06.18 m765.827.12i:5\7 > * @since 1.7 > */ > final class DualPivotQuicksort { > > /** > * Prevents instantiation. > */ > private DualPivotQuicksort() {} > > /* > * Tuning parameters. > */ > > /** > * If the length of an array to be sorted is less than this > * constant, insertion sort is used in preference to Quicksort. > */ > private static final int INSERTION_SORT_THRESHOLD = 32; > > /** > * If the length of a byte array to be sorted is greater than > * this constant, counting sort is used in preference to Quicksort. > */ > private static final int COUNTING_SORT_THRESHOLD_FOR_BYTE = 128; > > /** > * If the length of a short or char array to be sorted is greater > * than this constant, counting sort is used in preference to Quicksort. > */ > private static final int COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR = > 32768; > > /* > * Sorting methods for seven primitive types. > */ > > /** > * Sorts the specified array into ascending numerical order. > * > * @param a the array to be sorted > */ > public static void sort(int[] a) { > sort(a, 0, a.length - 1, true); > } > > /** > * Sorts the specified range of the array into ascending order. The > range > * to be sorted extends from the index {@code fromIndex}, inclusive, to > * the index {@code toIndex}, exclusive. If {@code fromIndex == > toIndex}, > * the range to be sorted is empty (and the call is a no-op). > * > * @param a the array to be sorted > * @param fromIndex the index of the first element, inclusive, to be > sorted > * @param toIndex the index of the last element, exclusive, to be sorted > * @throws IllegalArgumentException if {@code fromIndex > toIndex} > * @throws ArrayIndexOutOfBoundsException > * if {@code fromIndex < 0} or {@code toIndex > a.length} > */ > public static void sort(int[] a, int fromIndex, int toIndex) { > rangeCheck(a.length, fromIndex, toIndex); > sort(a, fromIndex, toIndex - 1, true); > } > > /** > * Sorts the specified range of the array into ascending order by the > * Dual-Pivot Quicksort algorithm. This method differs from the public > * {@code sort} method in that the {@code right} index is inclusive, > * it does no range checking on {@code left} or {@code right}, and has > * boolean flag if insertion sort with sentinel is used or not. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > * @param leftmost indicates if the part is the most left in the range > */ > private static void sort(int[] a, int left, int right, boolean leftmost) > { > int length = right - left + 1; > > // Use insertion sort on tiny arrays > if (length < INSERTION_SORT_THRESHOLD) { > if (!leftmost) { > /* > * Every element in adjoining part plays the role > * of sentinel, therefore this allows us to avoid > * the j >= left check on each iteration. > */ > for (int j, i = left + 1; i <= right; i++) { > int ai = a[i]; > for (j = i - 1; ai < a[j]; j--) { > // assert j >= left; > a[j + 1] = a[j]; > } > a[j + 1] = ai; > } > } else { > /* > * For case of leftmost part traditional (without a > sentinel) > * insertion sort, optimized for server JVM, is used. > */ > for (int i = left, j = i; i < right; j = ++i) { > int ai = a[i + 1]; > while (ai < a[j]) { > a[j + 1] = a[j]; > if (j-- == left) { > break; > } > } > a[j + 1] = ai; > } > } > return; > } > > // Inexpensive approximation of length / 7 > int seventh = (length >>> 3) + (length >>> 6) + 1; > > /* > * Sort five evenly spaced elements around (and including) the > * center element in the range. These elements will be used for > * pivot selection as described below. The choice for spacing > * these elements was empirically determined to work well on > * a wide variety of inputs. > */ > int e3 = (left + right) >>> 1; // The midpoint > int e2 = e3 - seventh; > int e1 = e2 - seventh; > int e4 = e3 + seventh; > int e5 = e4 + seventh; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { int t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { int t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { int t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { int t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > /* > * Use the second and fourth of the five sorted elements as pivots. > * These values are inexpensive approximations of the first and > * second terciles of the array. Note that pivot1 <= pivot2. > */ > int pivot1 = a[e2]; > int pivot2 = a[e4]; > > // Pointers > int less = left; // The index of the first element of center part > int great = right; // The index before the first element of right > part > > if (pivot1 != pivot2) { > /* > * The first and the last elements to be sorted are moved to the > * locations formerly occupied by the pivots. When partitioning > * is complete, the pivots are swapped back into their final > * positions, and excluded from subsequent sorting. > */ > a[e2] = a[left]; > a[e4] = a[right]; > > /* > * Skip elements, which are less or greater than pivot values. > */ > while (a[++less] < pivot1); > while (a[--great] > pivot2); > > /* > * Partitioning: > * > * left part center part right > part > * > +--------------------------------------------------------------+ > * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 > | > * > +--------------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot1 > * pivot1 <= all in [less, k) <= pivot2 > * all in (great, right) > pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > int ak = a[k]; > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else if (ak > pivot2) { // Move a[k] to right part > while (a[great] > pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // pivot1 <= a[great] <= pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } > } > > // Swap pivots into their final positions > a[left] = a[less - 1]; a[less - 1] = pivot1; > a[right] = a[great + 1]; a[great + 1] = pivot2; > > // Sort left and right parts recursively, excluding known pivots > sort(a, left, less - 2, leftmost); > sort(a, great + 2, right, false); > > /* > * If center part is too large (comprises > 5/7 of the array), > * swap internal pivot values to ends. > */ > if (less < e1 && great > e5) { > /* > * Skip elements, which are equal to pivot values. > */ > while (a[less] == pivot1) { > less++; > } > while (a[great] == pivot2) { > great--; > } > > /* > * Partitioning: > * > * left part center part right > part > * > +----------------------------------------------------------+ > * | == pivot1 | pivot1 < && < pivot2 | ? | == > pivot2 | > * > +----------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (*, less) == pivot1 > * pivot1 < all in [less, k) < pivot2 > * all in (great, *) == pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > int ak = a[k]; > if (ak == pivot2) { // Move a[k] to right part > while (a[great] == pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] == pivot1) { > a[k] = a[less]; > /* > * Even though a[great] equals to pivot1, the > * assignment a[less] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > zeros > * of different signs. Therefore in float and > * double sorting methods we have to use more > * accurate assignment a[less] = a[great]. > */ > a[less] = pivot1; > less++; > } else { // pivot1 < a[great] < pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } else if (ak == pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } > } > } > > // Sort center part recursively > sort(a, less, great, false); > > } else { // Pivots are equal > /* > * Partition degenerates to the traditional 3-way > * (or "Dutch National Flag") schema: > * > * left part center part right part > * +-------------------------------------------------+ > * | < pivot | == pivot | ? | > pivot | > * +-------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot > * all in [less, k) == pivot > * all in (great, right) > pivot > * > * Pointer k is the first index of ?-part. > */ > for (int k = less; k <= great; k++) { > int ak = a[k]; > if (ak == pivot1) { > continue; > } > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else { // a[k] > pivot1 - Move a[k] to right part > /* > * We know that pivot1 == a[e3] == pivot2. Thus, we know > * that great will still be >= k when the following loop > * terminates, even though we don't test for it > explicitly. > * In other words, a[e3] acts as a sentinel for great. > */ > while (a[great] > pivot1) { > // assert great > k; > great--; > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // a[great] == pivot1 > /* > * Even though a[great] equals to pivot1, the > * assignment a[k] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > * zeros of different signs. Therefore in float > * and double sorting methods we have to use > * more accurate assignment a[k] = a[great]. > */ > a[k] = pivot1; > } > a[great] = ak; > great--; > } > } > > // Sort left and right parts recursively > sort(a, left, less - 1, leftmost); > sort(a, great + 1, right, false); > } > } > > /** > * Sorts the specified array into ascending numerical order. > * > * @param a the array to be sorted > */ > public static void sort(long[] a) { > sort(a, 0, a.length - 1, true); > } > > /** > * Sorts the specified range of the array into ascending order. The > range > * to be sorted extends from the index {@code fromIndex}, inclusive, to > * the index {@code toIndex}, exclusive. If {@code fromIndex == > toIndex}, > * the range to be sorted is empty (and the call is a no-op). > * > * @param a the array to be sorted > * @param fromIndex the index of the first element, inclusive, to be > sorted > * @param toIndex the index of the last element, exclusive, to be sorted > * @throws IllegalArgumentException if {@code fromIndex > toIndex} > * @throws ArrayIndexOutOfBoundsException > * if {@code fromIndex < 0} or {@code toIndex > a.length} > */ > public static void sort(long[] a, int fromIndex, int toIndex) { > rangeCheck(a.length, fromIndex, toIndex); > sort(a, fromIndex, toIndex - 1, true); > } > > /** > * Sorts the specified range of the array into ascending order by the > * Dual-Pivot Quicksort algorithm. This method differs from the public > * {@code sort} method in that the {@code right} index is inclusive, > * it does no range checking on {@code left} or {@code right}, and has > * boolean flag if insertion sort with sentinel is used or not. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > * @param leftmost indicates if the part is the most left in the range > */ > private static void sort(long[] a, int left, int right, boolean > leftmost) { > int length = right - left + 1; > > // Use insertion sort on tiny arrays > if (length < INSERTION_SORT_THRESHOLD) { > if (!leftmost) { > /* > * Every element in adjoining part plays the role > * of sentinel, therefore this allows us to avoid > * the j >= left check on each iteration. > */ > for (int j, i = left + 1; i <= right; i++) { > long ai = a[i]; > for (j = i - 1; ai < a[j]; j--) { > // assert j >= left; > a[j + 1] = a[j]; > } > a[j + 1] = ai; > } > } else { > /* > * For case of leftmost part traditional (without a > sentinel) > * insertion sort, optimized for server JVM, is used. > */ > for (int i = left, j = i; i < right; j = ++i) { > long ai = a[i + 1]; > while (ai < a[j]) { > a[j + 1] = a[j]; > if (j-- == left) { > break; > } > } > a[j + 1] = ai; > } > } > return; > } > > // Inexpensive approximation of length / 7 > int seventh = (length >>> 3) + (length >>> 6) + 1; > > /* > * Sort five evenly spaced elements around (and including) the > * center element in the range. These elements will be used for > * pivot selection as described below. The choice for spacing > * these elements was empirically determined to work well on > * a wide variety of inputs. > */ > int e3 = (left + right) >>> 1; // The midpoint > int e2 = e3 - seventh; > int e1 = e2 - seventh; > int e4 = e3 + seventh; > int e5 = e4 + seventh; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { long t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { long t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { long t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { long t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > /* > * Use the second and fourth of the five sorted elements as pivots. > * These values are inexpensive approximations of the first and > * second terciles of the array. Note that pivot1 <= pivot2. > */ > long pivot1 = a[e2]; > long pivot2 = a[e4]; > > // Pointers > int less = left; // The index of the first element of center part > int great = right; // The index before the first element of right > part > > if (pivot1 != pivot2) { > /* > * The first and the last elements to be sorted are moved to the > * locations formerly occupied by the pivots. When partitioning > * is complete, the pivots are swapped back into their final > * positions, and excluded from subsequent sorting. > */ > a[e2] = a[left]; > a[e4] = a[right]; > > /* > * Skip elements, which are less or greater than pivot values. > */ > while (a[++less] < pivot1); > while (a[--great] > pivot2); > > /* > * Partitioning: > * > * left part center part right > part > * > +--------------------------------------------------------------+ > * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 > | > * > +--------------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot1 > * pivot1 <= all in [less, k) <= pivot2 > * all in (great, right) > pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > long ak = a[k]; > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else if (ak > pivot2) { // Move a[k] to right part > while (a[great] > pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // pivot1 <= a[great] <= pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } > } > > // Swap pivots into their final positions > a[left] = a[less - 1]; a[less - 1] = pivot1; > a[right] = a[great + 1]; a[great + 1] = pivot2; > > // Sort left and right parts recursively, excluding known pivots > sort(a, left, less - 2, leftmost); > sort(a, great + 2, right, false); > > /* > * If center part is too large (comprises > 5/7 of the array), > * swap internal pivot values to ends. > */ > if (less < e1 && great > e5) { > /* > * Skip elements, which are equal to pivot values. > */ > while (a[less] == pivot1) { > less++; > } > while (a[great] == pivot2) { > great--; > } > > /* > * Partitioning: > * > * left part center part right > part > * > +----------------------------------------------------------+ > * | == pivot1 | pivot1 < && < pivot2 | ? | == > pivot2 | > * > +----------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (*, less) == pivot1 > * pivot1 < all in [less, k) < pivot2 > * all in (great, *) == pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > long ak = a[k]; > if (ak == pivot2) { // Move a[k] to right part > while (a[great] == pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] == pivot1) { > a[k] = a[less]; > /* > * Even though a[great] equals to pivot1, the > * assignment a[less] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > zeros > * of different signs. Therefore in float and > * double sorting methods we have to use more > * accurate assignment a[less] = a[great]. > */ > a[less] = pivot1; > less++; > } else { // pivot1 < a[great] < pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } else if (ak == pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } > } > } > > // Sort center part recursively > sort(a, less, great, false); > > } else { // Pivots are equal > /* > * Partition degenerates to the traditional 3-way > * (or "Dutch National Flag") schema: > * > * left part center part right part > * +-------------------------------------------------+ > * | < pivot | == pivot | ? | > pivot | > * +-------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot > * all in [less, k) == pivot > * all in (great, right) > pivot > * > * Pointer k is the first index of ?-part. > */ > for (int k = less; k <= great; k++) { > long ak = a[k]; > if (ak == pivot1) { > continue; > } > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else { // a[k] > pivot1 - Move a[k] to right part > /* > * We know that pivot1 == a[e3] == pivot2. Thus, we know > * that great will still be >= k when the following loop > * terminates, even though we don't test for it > explicitly. > * In other words, a[e3] acts as a sentinel for great. > */ > while (a[great] > pivot1) { > // assert great > k; > great--; > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // a[great] == pivot1 > /* > * Even though a[great] equals to pivot1, the > * assignment a[k] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > * zeros of different signs. Therefore in float > * and double sorting methods we have to use > * more accurate assignment a[k] = a[great]. > */ > a[k] = pivot1; > } > a[great] = ak; > great--; > } > } > > // Sort left and right parts recursively > sort(a, left, less - 1, leftmost); > sort(a, great + 1, right, false); > } > } > > /** > * Sorts the specified array into ascending numerical order. > * > * @param a the array to be sorted > */ > public static void sort(short[] a) { > if (a.length > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > countingSort(a, 0, a.length - 1); > } else { > sort(a, 0, a.length - 1, true); > } > } > > /** > * Sorts the specified range of the array into ascending order. The > range > * to be sorted extends from the index {@code fromIndex}, inclusive, to > * the index {@code toIndex}, exclusive. If {@code fromIndex == > toIndex}, > * the range to be sorted is empty (and the call is a no-op). > * > * @param a the array to be sorted > * @param fromIndex the index of the first element, inclusive, to be > sorted > * @param toIndex the index of the last element, exclusive, to be sorted > * @throws IllegalArgumentException if {@code fromIndex > toIndex} > * @throws ArrayIndexOutOfBoundsException > * if {@code fromIndex < 0} or {@code toIndex > a.length} > */ > public static void sort(short[] a, int fromIndex, int toIndex) { > rangeCheck(a.length, fromIndex, toIndex); > > if (toIndex - fromIndex > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) > { > countingSort(a, fromIndex, toIndex - 1); > } else { > sort(a, fromIndex, toIndex - 1, true); > } > } > > /** The number of distinct short values. */ > private static final int NUM_SHORT_VALUES = 1 << 16; > > /** > * Sorts the specified range of the array by counting sort. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > */ > private static void countingSort(short[] a, int left, int right) { > int[] count = new int[NUM_SHORT_VALUES]; > > for (int i = left; i <= right; i++) { > count[a[i] - Short.MIN_VALUE]++; > } > for (int i = NUM_SHORT_VALUES - 1, k = right; k >= left; i--) { > while (count[i] == 0) { > i--; > } > short value = (short) (i + Short.MIN_VALUE); > int s = count[i]; > > do { > a[k--] = value; > } while (--s > 0); > } > } > > /** > * Sorts the specified range of the array into ascending order by the > * Dual-Pivot Quicksort algorithm. This method differs from the public > * {@code sort} method in that the {@code right} index is inclusive, > * it does no range checking on {@code left} or {@code right}, and has > * boolean flag if insertion sort with sentinel is used or not. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > * @param leftmost indicates if the part is the most left in the range > */ > private static void sort(short[] a, int left, int right,boolean > leftmost) { > int length = right - left + 1; > > // Use insertion sort on tiny arrays > if (length < INSERTION_SORT_THRESHOLD) { > if (!leftmost) { > /* > * Every element in adjoining part plays the role > * of sentinel, therefore this allows us to avoid > * the j >= left check on each iteration. > */ > for (int j, i = left + 1; i <= right; i++) { > short ai = a[i]; > for (j = i - 1; ai < a[j]; j--) { > // assert j >= left; > a[j + 1] = a[j]; > } > a[j + 1] = ai; > } > } else { > /* > * For case of leftmost part traditional (without a > sentinel) > * insertion sort, optimized for server JVM, is used. > */ > for (int i = left, j = i; i < right; j = ++i) { > short ai = a[i + 1]; > while (ai < a[j]) { > a[j + 1] = a[j]; > if (j-- == left) { > break; > } > } > a[j + 1] = ai; > } > } > return; > } > > // Inexpensive approximation of length / 7 > int seventh = (length >>> 3) + (length >>> 6) + 1; > > /* > * Sort five evenly spaced elements around (and including) the > * center element in the range. These elements will be used for > * pivot selection as described below. The choice for spacing > * these elements was empirically determined to work well on > * a wide variety of inputs. > */ > int e3 = (left + right) >>> 1; // The midpoint > int e2 = e3 - seventh; > int e1 = e2 - seventh; > int e4 = e3 + seventh; > int e5 = e4 + seventh; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { short t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { short t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { short t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { short t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > /* > * Use the second and fourth of the five sorted elements as pivots. > * These values are inexpensive approximations of the first and > * second terciles of the array. Note that pivot1 <= pivot2. > */ > short pivot1 = a[e2]; > short pivot2 = a[e4]; > > // Pointers > int less = left; // The index of the first element of center part > int great = right; // The index before the first element of right > part > > if (pivot1 != pivot2) { > /* > * The first and the last elements to be sorted are moved to the > * locations formerly occupied by the pivots. When partitioning > * is complete, the pivots are swapped back into their final > * positions, and excluded from subsequent sorting. > */ > a[e2] = a[left]; > a[e4] = a[right]; > > /* > * Skip elements, which are less or greater than pivot values. > */ > while (a[++less] < pivot1); > while (a[--great] > pivot2); > > /* > * Partitioning: > * > * left part center part right > part > * > +--------------------------------------------------------------+ > * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 > | > * > +--------------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot1 > * pivot1 <= all in [less, k) <= pivot2 > * all in (great, right) > pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > short ak = a[k]; > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else if (ak > pivot2) { // Move a[k] to right part > while (a[great] > pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // pivot1 <= a[great] <= pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } > } > > // Swap pivots into their final positions > a[left] = a[less - 1]; a[less - 1] = pivot1; > a[right] = a[great + 1]; a[great + 1] = pivot2; > > // Sort left and right parts recursively, excluding known pivots > sort(a, left, less - 2, leftmost); > sort(a, great + 2, right, false); > > /* > * If center part is too large (comprises > 5/7 of the array), > * swap internal pivot values to ends. > */ > if (less < e1 && great > e5) { > /* > * Skip elements, which are equal to pivot values. > */ > while (a[less] == pivot1) { > less++; > } > while (a[great] == pivot2) { > great--; > } > > /* > * Partitioning: > * > * left part center part right > part > * > +----------------------------------------------------------+ > * | == pivot1 | pivot1 < && < pivot2 | ? | == > pivot2 | > * > +----------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (*, less) == pivot1 > * pivot1 < all in [less, k) < pivot2 > * all in (great, *) == pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > short ak = a[k]; > if (ak == pivot2) { // Move a[k] to right part > while (a[great] == pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] == pivot1) { > a[k] = a[less]; > /* > * Even though a[great] equals to pivot1, the > * assignment a[less] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > zeros > * of different signs. Therefore in float and > * double sorting methods we have to use more > * accurate assignment a[less] = a[great]. > */ > a[less] = pivot1; > less++; > } else { // pivot1 < a[great] < pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } else if (ak == pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } > } > } > > // Sort center part recursively > sort(a, less, great, false); > > } else { // Pivots are equal > /* > * Partition degenerates to the traditional 3-way > * (or "Dutch National Flag") schema: > * > * left part center part right part > * +-------------------------------------------------+ > * | < pivot | == pivot | ? | > pivot | > * +-------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot > * all in [less, k) == pivot > * all in (great, right) > pivot > * > * Pointer k is the first index of ?-part. > */ > for (int k = less; k <= great; k++) { > short ak = a[k]; > if (ak == pivot1) { > continue; > } > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else { // a[k] > pivot1 - Move a[k] to right part > /* > * We know that pivot1 == a[e3] == pivot2. Thus, we know > * that great will still be >= k when the following loop > * terminates, even though we don't test for it > explicitly. > * In other words, a[e3] acts as a sentinel for great. > */ > while (a[great] > pivot1) { > // assert great > k; > great--; > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // a[great] == pivot1 > /* > * Even though a[great] equals to pivot1, the > * assignment a[k] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > * zeros of different signs. Therefore in float > * and double sorting methods we have to use > * more accurate assignment a[k] = a[great]. > */ > a[k] = pivot1; > } > a[great] = ak; > great--; > } > } > > // Sort left and right parts recursively > sort(a, left, less - 1, leftmost); > sort(a, great + 1, right, false); > } > } > > /** > * Sorts the specified array into ascending numerical order. > * > * @param a the array to be sorted > */ > public static void sort(char[] a) { > if (a.length > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) { > countingSort(a, 0, a.length - 1); > } else { > sort(a, 0, a.length - 1, true); > } > } > > /** > * Sorts the specified range of the array into ascending order. The > range > * to be sorted extends from the index {@code fromIndex}, inclusive, to > * the index {@code toIndex}, exclusive. If {@code fromIndex == > toIndex}, > * the range to be sorted is empty (and the call is a no-op). > * > * @param a the array to be sorted > * @param fromIndex the index of the first element, inclusive, to be > sorted > * @param toIndex the index of the last element, exclusive, to be sorted > * @throws IllegalArgumentException if {@code fromIndex > toIndex} > * @throws ArrayIndexOutOfBoundsException > * if {@code fromIndex < 0} or {@code toIndex > a.length} > */ > public static void sort(char[] a, int fromIndex, int toIndex) { > rangeCheck(a.length, fromIndex, toIndex); > > if (toIndex - fromIndex > COUNTING_SORT_THRESHOLD_FOR_SHORT_OR_CHAR) > { > countingSort(a, fromIndex, toIndex - 1); > } else { > sort(a, fromIndex, toIndex - 1, true); > } > } > > /** The number of distinct char values. */ > private static final int NUM_CHAR_VALUES = 1 << 16; > > /** > * Sorts the specified range of the array by counting sort. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > */ > private static void countingSort(char[] a, int left, int right) { > int[] count = new int[NUM_CHAR_VALUES]; > > for (int i = left; i <= right; i++) { > count[a[i]]++; > } > for (int i = 0, k = left; k <= right; i++) { > while (count[i] == 0) { > i++; > } > char value = (char) i; > int s = count[i]; > > do { > a[k++] = value; > } while (--s > 0); > } > } > > /** > * Sorts the specified range of the array into ascending order by the > * Dual-Pivot Quicksort algorithm. This method differs from the public > * {@code sort} method in that the {@code right} index is inclusive, > * it does no range checking on {@code left} or {@code right}, and has > * boolean flag if insertion sort with sentinel is used or not. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > * @param leftmost indicates if the part is the most left in the range > */ > private static void sort(char[] a, int left, int right, boolean > leftmost) { > int length = right - left + 1; > > // Use insertion sort on tiny arrays > if (length < INSERTION_SORT_THRESHOLD) { > if (!leftmost) { > /* > * Every element in adjoining part plays the role > * of sentinel, therefore this allows us to avoid > * the j >= left check on each iteration. > */ > for (int j, i = left + 1; i <= right; i++) { > char ai = a[i]; > for (j = i - 1; ai < a[j]; j--) { > // assert j >= left; > a[j + 1] = a[j]; > } > a[j + 1] = ai; > } > } else { > /* > * For case of leftmost part traditional (without a > sentinel) > * insertion sort, optimized for server JVM, is used. > */ > for (int i = left, j = i; i < right; j = ++i) { > char ai = a[i + 1]; > while (ai < a[j]) { > a[j + 1] = a[j]; > if (j-- == left) { > break; > } > } > a[j + 1] = ai; > } > } > return; > } > > // Inexpensive approximation of length / 7 > int seventh = (length >>> 3) + (length >>> 6) + 1; > > /* > * Sort five evenly spaced elements around (and including) the > * center element in the range. These elements will be used for > * pivot selection as described below. The choice for spacing > * these elements was empirically determined to work well on > * a wide variety of inputs. > */ > int e3 = (left + right) >>> 1; // The midpoint > int e2 = e3 - seventh; > int e1 = e2 - seventh; > int e4 = e3 + seventh; > int e5 = e4 + seventh; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { char t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { char t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { char t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { char t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > /* > * Use the second and fourth of the five sorted elements as pivots. > * These values are inexpensive approximations of the first and > * second terciles of the array. Note that pivot1 <= pivot2. > */ > char pivot1 = a[e2]; > char pivot2 = a[e4]; > > // Pointers > int less = left; // The index of the first element of center part > int great = right; // The index before the first element of right > part > > if (pivot1 != pivot2) { > /* > * The first and the last elements to be sorted are moved to the > * locations formerly occupied by the pivots. When partitioning > * is complete, the pivots are swapped back into their final > * positions, and excluded from subsequent sorting. > */ > a[e2] = a[left]; > a[e4] = a[right]; > > /* > * Skip elements, which are less or greater than pivot values. > */ > while (a[++less] < pivot1); > while (a[--great] > pivot2); > > /* > * Partitioning: > * > * left part center part right > part > * > +--------------------------------------------------------------+ > * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 > | > * > +--------------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot1 > * pivot1 <= all in [less, k) <= pivot2 > * all in (great, right) > pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > char ak = a[k]; > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else if (ak > pivot2) { // Move a[k] to right part > while (a[great] > pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // pivot1 <= a[great] <= pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } > } > > // Swap pivots into their final positions > a[left] = a[less - 1]; a[less - 1] = pivot1; > a[right] = a[great + 1]; a[great + 1] = pivot2; > > // Sort left and right parts recursively, excluding known pivots > sort(a, left, less - 2, leftmost); > sort(a, great + 2, right, false); > > /* > * If center part is too large (comprises > 5/7 of the array), > * swap internal pivot values to ends. > */ > if (less < e1 && great > e5) { > /* > * Skip elements, which are equal to pivot values. > */ > while (a[less] == pivot1) { > less++; > } > while (a[great] == pivot2) { > great--; > } > > /* > * Partitioning: > * > * left part center part right > part > * > +----------------------------------------------------------+ > * | == pivot1 | pivot1 < && < pivot2 | ? | == > pivot2 | > * > +----------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (*, less) == pivot1 > * pivot1 < all in [less, k) < pivot2 > * all in (great, *) == pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > char ak = a[k]; > if (ak == pivot2) { // Move a[k] to right part > while (a[great] == pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] == pivot1) { > a[k] = a[less]; > /* > * Even though a[great] equals to pivot1, the > * assignment a[less] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > zeros > * of different signs. Therefore in float and > * double sorting methods we have to use more > * accurate assignment a[less] = a[great]. > */ > a[less] = pivot1; > less++; > } else { // pivot1 < a[great] < pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } else if (ak == pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } > } > } > > // Sort center part recursively > sort(a, less, great, false); > > } else { // Pivots are equal > /* > * Partition degenerates to the traditional 3-way > * (or "Dutch National Flag") schema: > * > * left part center part right part > * +-------------------------------------------------+ > * | < pivot | == pivot | ? | > pivot | > * +-------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot > * all in [less, k) == pivot > * all in (great, right) > pivot > * > * Pointer k is the first index of ?-part. > */ > for (int k = less; k <= great; k++) { > char ak = a[k]; > if (ak == pivot1) { > continue; > } > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else { // a[k] > pivot1 - Move a[k] to right part > /* > * We know that pivot1 == a[e3] == pivot2. Thus, we know > * that great will still be >= k when the following loop > * terminates, even though we don't test for it > explicitly. > * In other words, a[e3] acts as a sentinel for great. > */ > while (a[great] > pivot1) { > // assert great > k; > great--; > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // a[great] == pivot1 > /* > * Even though a[great] equals to pivot1, the > * assignment a[k] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > * zeros of different signs. Therefore in float > * and double sorting methods we have to use > * more accurate assignment a[k] = a[great]. > */ > a[k] = pivot1; > } > a[great] = ak; > great--; > } > } > > // Sort left and right parts recursively > sort(a, left, less - 1, leftmost); > sort(a, great + 1, right, false); > } > } > > /** > * Sorts the specified array into ascending numerical order. > * > * @param a the array to be sorted > */ > public static void sort(byte[] a) { > if (a.length > COUNTING_SORT_THRESHOLD_FOR_BYTE) { > countingSort(a, 0, a.length - 1); > } else { > sort(a, 0, a.length - 1, true); > } > } > > /** > * Sorts the specified range of the array into ascending order. The > range > * to be sorted extends from the index {@code fromIndex}, inclusive, to > * the index {@code toIndex}, exclusive. If {@code fromIndex == > toIndex}, > * the range to be sorted is empty (and the call is a no-op). > * > * @param a the array to be sorted > * @param fromIndex the index of the first element, inclusive, to be > sorted > * @param toIndex the index of the last element, exclusive, to be sorted > * @throws IllegalArgumentException if {@code fromIndex > toIndex} > * @throws ArrayIndexOutOfBoundsException > * if {@code fromIndex < 0} or {@code toIndex > a.length} > */ > public static void sort(byte[] a, int fromIndex, int toIndex) { > rangeCheck(a.length, fromIndex, toIndex); > > if (toIndex - fromIndex > COUNTING_SORT_THRESHOLD_FOR_BYTE) { > countingSort(a, fromIndex, toIndex - 1); > } else { > sort(a, fromIndex, toIndex - 1, true); > } > } > > /** The number of distinct byte values. */ > private static final int NUM_BYTE_VALUES = 1 << 8; > > /** > * Sorts the specified range of the array by counting sort. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > */ > private static void countingSort(byte[] a, int left, int right) { > int[] count = new int[NUM_BYTE_VALUES]; > > for (int i = left; i <= right; i++) { > count[a[i] - Byte.MIN_VALUE]++; > } > for (int i = NUM_BYTE_VALUES - 1, k = right; k >= left; i--) { > while (count[i] == 0) { > i--; > } > byte value = (byte) (i + Byte.MIN_VALUE); > int s = count[i]; > > do { > a[k--] = value; > } while (--s > 0); > } > } > > /** > * Sorts the specified range of the array into ascending order by the > * Dual-Pivot Quicksort algorithm. This method differs from the public > * {@code sort} method in that the {@code right} index is inclusive, > * it does no range checking on {@code left} or {@code right}, and has > * boolean flag if insertion sort with sentinel is used or not. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > * @param leftmost indicates if the part is the most left in the range > */ > private static void sort(byte[] a, int left, int right, boolean > leftmost) { > int length = right - left + 1; > > // Use insertion sort on tiny arrays > if (length < INSERTION_SORT_THRESHOLD) { > if (!leftmost) { > /* > * Every element in adjoining part plays the role > * of sentinel, therefore this allows us to avoid > * the j >= left check on each iteration. > */ > for (int j, i = left + 1; i <= right; i++) { > byte ai = a[i]; > for (j = i - 1; ai < a[j]; j--) { > // assert j >= left; > a[j + 1] = a[j]; > } > a[j + 1] = ai; > } > } else { > /* > * For case of leftmost part traditional (without a > sentinel) > * insertion sort, optimized for server JVM, is used. > */ > for (int i = left, j = i; i < right; j = ++i) { > byte ai = a[i + 1]; > while (ai < a[j]) { > a[j + 1] = a[j]; > if (j-- == left) { > break; > } > } > a[j + 1] = ai; > } > } > return; > } > > // Inexpensive approximation of length / 7 > int seventh = (length >>> 3) + (length >>> 6) + 1; > > /* > * Sort five evenly spaced elements around (and including) the > * center element in the range. These elements will be used for > * pivot selection as described below. The choice for spacing > * these elements was empirically determined to work well on > * a wide variety of inputs. > */ > int e3 = (left + right) >>> 1; // The midpoint > int e2 = e3 - seventh; > int e1 = e2 - seventh; > int e4 = e3 + seventh; > int e5 = e4 + seventh; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { byte t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { byte t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { byte t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { byte t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > /* > * Use the second and fourth of the five sorted elements as pivots. > * These values are inexpensive approximations of the first and > * second terciles of the array. Note that pivot1 <= pivot2. > */ > byte pivot1 = a[e2]; > byte pivot2 = a[e4]; > > // Pointers > int less = left; // The index of the first element of center part > int great = right; // The index before the first element of right > part > > if (pivot1 != pivot2) { > /* > * The first and the last elements to be sorted are moved to the > * locations formerly occupied by the pivots. When partitioning > * is complete, the pivots are swapped back into their final > * positions, and excluded from subsequent sorting. > */ > a[e2] = a[left]; > a[e4] = a[right]; > > /* > * Skip elements, which are less or greater than pivot values. > */ > while (a[++less] < pivot1); > while (a[--great] > pivot2); > > /* > * Partitioning: > * > * left part center part right > part > * > +--------------------------------------------------------------+ > * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 > | > * > +--------------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot1 > * pivot1 <= all in [less, k) <= pivot2 > * all in (great, right) > pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > byte ak = a[k]; > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else if (ak > pivot2) { // Move a[k] to right part > while (a[great] > pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // pivot1 <= a[great] <= pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } > } > > // Swap pivots into their final positions > a[left] = a[less - 1]; a[less - 1] = pivot1; > a[right] = a[great + 1]; a[great + 1] = pivot2; > > // Sort left and right parts recursively, excluding known pivots > sort(a, left, less - 2, leftmost); > sort(a, great + 2, right, false); > > /* > * If center part is too large (comprises > 5/7 of the array), > * swap internal pivot values to ends. > */ > if (less < e1 && great > e5) { > /* > * Skip elements, which are equal to pivot values. > */ > while (a[less] == pivot1) { > less++; > } > while (a[great] == pivot2) { > great--; > } > > /* > * Partitioning: > * > * left part center part right > part > * > +----------------------------------------------------------+ > * | == pivot1 | pivot1 < && < pivot2 | ? | == > pivot2 | > * > +----------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (*, less) == pivot1 > * pivot1 < all in [less, k) < pivot2 > * all in (great, *) == pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > byte ak = a[k]; > if (ak == pivot2) { // Move a[k] to right part > while (a[great] == pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] == pivot1) { > a[k] = a[less]; > /* > * Even though a[great] equals to pivot1, the > * assignment a[less] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > zeros > * of different signs. Therefore in float and > * double sorting methods we have to use more > * accurate assignment a[less] = a[great]. > */ > a[less] = pivot1; > less++; > } else { // pivot1 < a[great] < pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } else if (ak == pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } > } > } > > // Sort center part recursively > sort(a, less, great, false); > > } else { // Pivots are equal > /* > * Partition degenerates to the traditional 3-way > * (or "Dutch National Flag") schema: > * > * left part center part right part > * +-------------------------------------------------+ > * | < pivot | == pivot | ? | > pivot | > * +-------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot > * all in [less, k) == pivot > * all in (great, right) > pivot > * > * Pointer k is the first index of ?-part. > */ > for (int k = less; k <= great; k++) { > byte ak = a[k]; > if (ak == pivot1) { > continue; > } > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else { // a[k] > pivot1 - Move a[k] to right part > /* > * We know that pivot1 == a[e3] == pivot2. Thus, we know > * that great will still be >= k when the following loop > * terminates, even though we don't test for it > explicitly. > * In other words, a[e3] acts as a sentinel for great. > */ > while (a[great] > pivot1) { > // assert great > k; > great--; > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // a[great] == pivot1 > /* > * Even though a[great] equals to pivot1, the > * assignment a[k] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > * zeros of different signs. Therefore in float > * and double sorting methods we have to use > * more accurate assignment a[k] = a[great]. > */ > a[k] = pivot1; > } > a[great] = ak; > great--; > } > } > > // Sort left and right parts recursively > sort(a, left, less - 1, leftmost); > sort(a, great + 1, right, false); > } > } > > /** > * Sorts the specified array into ascending numerical order. > * > *

The {@code <} relation does not provide a total order on all float > * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN} > * value compares neither less than, greater than, nor equal to any > value, > * even itself. This method uses the total order imposed by the method > * {@link Float#compareTo}: {@code -0.0f} is treated as less than value > * {@code 0.0f} and {@code Float.NaN} is considered greater than any > * other value and all {@code Float.NaN} values are considered equal. > * > * @param a the array to be sorted > */ > public static void sort(float[] a) { > sortNegZeroAndNaN(a, 0, a.length - 1); > } > > /** > * Sorts the specified range of the array into ascending order. The > range > * to be sorted extends from the index {@code fromIndex}, inclusive, to > * the index {@code toIndex}, exclusive. If {@code fromIndex == > toIndex}, > * the range to be sorted is empty (and the call is a no-op). > * > *

The {@code <} relation does not provide a total order on all float > * values: {@code -0.0f == 0.0f} is {@code true} and a {@code Float.NaN} > * value compares neither less than, greater than, nor equal to any > value, > * even itself. This method uses the total order imposed by the method > * {@link Float#compareTo}: {@code -0.0f} is treated as less than value > * {@code 0.0f} and {@code Float.NaN} is considered greater than any > * other value and all {@code Float.NaN} values are considered equal. > * > * @param a the array to be sorted > * @param fromIndex the index of the first element, inclusive, to be > sorted > * @param toIndex the index of the last element, exclusive, to be sorted > * @throws IllegalArgumentException if {@code fromIndex > toIndex} > * @throws ArrayIndexOutOfBoundsException > * if {@code fromIndex < 0} or {@code toIndex > a.length} > */ > public static void sort(float[] a, int fromIndex, int toIndex) { > rangeCheck(a.length, fromIndex, toIndex); > sortNegZeroAndNaN(a, fromIndex, toIndex - 1); > } > > /** > * Sorts the specified range of the array into ascending order. The > * sort is done in three phases to avoid expensive comparisons in the > * inner loop. The comparisons would be expensive due to anomalies > * associated with negative zero {@code -0.0f} and {@code Float.NaN}. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > */ > private static void sortNegZeroAndNaN(float[] a, int left, int right) { > /* > * Phase 1: Move NaNs to the end of the array. > */ > while (left <= right && Float.isNaN(a[right])) { > right--; > } > for (int k = right - 1; k >= left; k--) { > float ak = a[k]; > if (ak != ak) { // a[k] is NaN > a[k] = a[right]; > a[right] = ak; > right--; > } > } > > /* > * Phase 2: Sort everything except NaNs (which are already in > place). > */ > sort(a, left, right, true); > > /* > * Phase 3: Place negative zeros before positive zeros. > */ > int hi = right; > > /* > * Search first zero, or first positive, or last negative element. > */ > while (left < hi) { > int middle = (left + hi) >>> 1; > float middleValue = a[middle]; > > if (middleValue < 0.0f) { > left = middle + 1; > } else { > hi = middle; > } > } > > /* > * Skip the last negative value (if any) or all leading negative > zeros. > */ > while (left <= right && Float.floatToRawIntBits(a[left]) < 0) { > left++; > } > > /* > * Move negative zeros to the beginning of the sub-range. > * > * Partitioning: > * > * +---------------------------------------------------+ > * | < 0.0 | -0.0 | 0.0 | ? >= 0.0 | > * +---------------------------------------------------+ > * ^ ^ ^ > * | | | > * left p k > * > * Invariants: > * > * all in (*, left) < 0.0 > * all in [left, p) == -0.0 > * all in [p, k) == 0.0 > * all in [k, right] >= 0.0 > * > * Pointer k is the first index of ?-part. > */ > for (int k = left + 1, p = left; k <= right; k++) { > float ak = a[k]; > if (ak != 0.0f) { > return; > } > if (Float.floatToRawIntBits(ak) < 0) { // ak is -0.0f > a[k] = +0.0f; > a[p] = -0.0f; > p++; > } > } > } > > /** > * Sorts the specified range of the array into ascending order by the > * Dual-Pivot Quicksort algorithm. This method differs from the public > * {@code sort} method in that the {@code right} index is inclusive, > * it does no range checking on {@code left} or {@code right}, and has > * boolean flag if insertion sort with sentinel is used or not. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > * @param leftmost indicates if the part is the most left in the range > */ > private static void sort(float[] a, int left, int right,boolean > leftmost) { > int length = right - left + 1; > > // Use insertion sort on tiny arrays > if (length < INSERTION_SORT_THRESHOLD) { > if (!leftmost) { > /* > * Every element in adjoining part plays the role > * of sentinel, therefore this allows us to avoid > * the j >= left check on each iteration. > */ > for (int j, i = left + 1; i <= right; i++) { > float ai = a[i]; > for (j = i - 1; ai < a[j]; j--) { > // assert j >= left; > a[j + 1] = a[j]; > } > a[j + 1] = ai; > } > } else { > /* > * For case of leftmost part traditional (without a > sentinel) > * insertion sort, optimized for server JVM, is used. > */ > for (int i = left, j = i; i < right; j = ++i) { > float ai = a[i + 1]; > while (ai < a[j]) { > a[j + 1] = a[j]; > if (j-- == left) { > break; > } > } > a[j + 1] = ai; > } > } > return; > } > > // Inexpensive approximation of length / 7 > int seventh = (length >>> 3) + (length >>> 6) + 1; > > /* > * Sort five evenly spaced elements around (and including) the > * center element in the range. These elements will be used for > * pivot selection as described below. The choice for spacing > * these elements was empirically determined to work well on > * a wide variety of inputs. > */ > int e3 = (left + right) >>> 1; // The midpoint > int e2 = e3 - seventh; > int e1 = e2 - seventh; > int e4 = e3 + seventh; > int e5 = e4 + seventh; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { float t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { float t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { float t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { float t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > /* > * Use the second and fourth of the five sorted elements as pivots. > * These values are inexpensive approximations of the first and > * second terciles of the array. Note that pivot1 <= pivot2. > */ > float pivot1 = a[e2]; > float pivot2 = a[e4]; > > // Pointers > int less = left; // The index of the first element of center part > int great = right; // The index before the first element of right > part > > if (pivot1 != pivot2) { > /* > * The first and the last elements to be sorted are moved to the > * locations formerly occupied by the pivots. When partitioning > * is complete, the pivots are swapped back into their final > * positions, and excluded from subsequent sorting. > */ > a[e2] = a[left]; > a[e4] = a[right]; > > /* > * Skip elements, which are less or greater than pivot values. > */ > while (a[++less] < pivot1); > while (a[--great] > pivot2); > > /* > * Partitioning: > * > * left part center part right > part > * > +--------------------------------------------------------------+ > * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 > | > * > +--------------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot1 > * pivot1 <= all in [less, k) <= pivot2 > * all in (great, right) > pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > float ak = a[k]; > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else if (ak > pivot2) { // Move a[k] to right part > while (a[great] > pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // pivot1 <= a[great] <= pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } > } > > // Swap pivots into their final positions > a[left] = a[less - 1]; a[less - 1] = pivot1; > a[right] = a[great + 1]; a[great + 1] = pivot2; > > // Sort left and right parts recursively, excluding known pivots > sort(a, left, less - 2, leftmost); > sort(a, great + 2, right, false); > > /* > * If center part is too large (comprises > 5/7 of the array), > * swap internal pivot values to ends. > */ > if (less < e1 && great > e5) { > /* > * Skip elements, which are equal to pivot values. > */ > while (a[less] == pivot1) { > less++; > } > while (a[great] == pivot2) { > great--; > } > > /* > * Partitioning: > * > * left part center part right > part > * > +----------------------------------------------------------+ > * | == pivot1 | pivot1 < && < pivot2 | ? | == > pivot2 | > * > +----------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (*, less) == pivot1 > * pivot1 < all in [less, k) < pivot2 > * all in (great, *) == pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > float ak = a[k]; > if (ak == pivot2) { // Move a[k] to right part > while (a[great] == pivot2) { > if (great-- == k) { > break outer; > } > } > if (a[great] == pivot1) { > a[k] = a[less]; > /* > * Even though a[great] equals to pivot1, the > * assignment a[less] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > zeros > * of different signs. Therefore in float and > * double sorting methods we have to use more > * accurate assignment a[less] = a[great]. > */ > a[less] = a[great]; > less++; > } else { // pivot1 < a[great] < pivot2 > a[k] = a[great]; > } > a[great] = ak; > great--; > } else if (ak == pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } > } > } > > // Sort center part recursively > sort(a, less, great, false); > > } else { // Pivots are equal > /* > * Partition degenerates to the traditional 3-way > * (or "Dutch National Flag") schema: > * > * left part center part right part > * +-------------------------------------------------+ > * | < pivot | == pivot | ? | > pivot | > * +-------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot > * all in [less, k) == pivot > * all in (great, right) > pivot > * > * Pointer k is the first index of ?-part. > */ > for (int k = less; k <= great; k++) { > float ak = a[k]; > if (ak == pivot1) { > continue; > } > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[less]; > a[less] = ak; > less++; > } else { // a[k] > pivot1 - Move a[k] to right part > /* > * We know that pivot1 == a[e3] == pivot2. Thus, we know > * that great will still be >= k when the following loop > * terminates, even though we don't test for it > explicitly. > * In other words, a[e3] acts as a sentinel for great. > */ > while (a[great] > pivot1) { > // assert great > k; > great--; > } > if (a[great] < pivot1) { > a[k] = a[less]; > a[less] = a[great]; > less++; > } else { // a[great] == pivot1 > /* > * Even though a[great] equals to pivot1, the > * assignment a[k] = pivot1 may be incorrect, > * if a[great] and pivot1 are floating-point > * zeros of different signs. Therefore in float > * and double sorting methods we have to use > * more accurate assignment a[k] = a[great]. > */ > a[k] = a[great]; > } > a[great] = ak; > great--; > } > } > > // Sort left and right parts recursively > sort(a, left, less - 1, leftmost); > sort(a, great + 1, right, false); > } > } > > /** > * Sorts the specified array into ascending numerical order. > * > *

The {@code <} relation does not provide a total order on all > double > * values: {@code -0.0d == 0.0d} is {@code true} and a {@code > Double.NaN} > * value compares neither less than, greater than, nor equal to any > value, > * even itself. This method uses the total order imposed by the method > * {@link Double#compareTo}: {@code -0.0d} is treated as less than value > * {@code 0.0d} and {@code Double.NaN} is considered greater than any > * other value and all {@code Double.NaN} values are considered equal. > * > * @param a the array to be sorted > */ > public static void sort(double[] a) { > sortNegZeroAndNaN(a, 0, a.length - 1); > } > > /** > * Sorts the specified range of the array into ascending order. The > range > * to be sorted extends from the index {@code fromIndex}, inclusive, to > * the index {@code toIndex}, exclusive. If {@code fromIndex == > toIndex}, > * the range to be sorted is empty (and the call is a no-op). > * > *

The {@code <} relation does not provide a total order on all > double > * values: {@code -0.0d == 0.0d} is {@code true} and a {@code > Double.NaN} > * value compares neither less than, greater than, nor equal to any > value, > * even itself. This method uses the total order imposed by the method > * {@link Double#compareTo}: {@code -0.0d} is treated as less than value > * {@code 0.0d} and {@code Double.NaN} is considered greater than any > * other value and all {@code Double.NaN} values are considered equal. > * > * @param a the array to be sorted > * @param fromIndex the index of the first element, inclusive, to be > sorted > * @param toIndex the index of the last element, exclusive, to be sorted > * @throws IllegalArgumentException if {@code fromIndex > toIndex} > * @throws ArrayIndexOutOfBoundsException > * if {@code fromIndex < 0} or {@code toIndex > a.length} > */ > public static void sort(double[] a, int fromIndex, int toIndex) { > rangeCheck(a.length, fromIndex, toIndex); > sortNegZeroAndNaN(a, fromIndex, toIndex - 1); > } > > /** > * Sorts the specified range of the array into ascending order. The > * sort is done in three phases to avoid expensive comparisons in the > * inner loop. The comparisons would be expensive due to anomalies > * associated with negative zero {@code -0.0d} and {@code Double.NaN}. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > */ > private static void sortNegZeroAndNaN(double[] a, int left, int right) { > /* > * Phase 1: Move NaNs to the end of the array. > */ > while (left <= right && Double.isNaN(a[right])) { > right--; > } > for (int k = right - 1; k >= left; k--) { > double ak = a[k]; > if (ak != ak) { // a[k] is NaN > a[k] = a[right]; > a[right] = ak; > right--; > } > } > > /* > * Phase 2: Sort everything except NaNs (which are already in > place). > */ > sort(a, left, right, true); > > /* > * Phase 3: Place negative zeros before positive zeros. > */ > int hi = right; > > /* > * Search first zero, or first positive, or last negative element. > */ > while (left < hi) { > int middle = (left + hi) >>> 1; > double middleValue = a[middle]; > > if (middleValue < 0.0d) { > left = middle + 1; > } else { > hi = middle; > } > } > > /* > * Skip the last negative value (if any) or all leading negative > zeros. > */ > while (left <= right && Double.doubleToRawLongBits(a[left]) < 0) { > left++; > } > > /* > * Move negative zeros to the beginning of the sub-range. > * > * Partitioning: > * > * +---------------------------------------------------+ > * | < 0.0 | -0.0 | 0.0 | ? >= 0.0 | > * +---------------------------------------------------+ > * ^ ^ ^ > * | | | > * left p k > * > * Invariants: > * > * all in (*, left) < 0.0 > * all in [left, p) == -0.0 > * all in [p, k) == 0.0 > * all in [k, right] >= 0.0 > * > * Pointer k is the first index of ?-part. > */ > for (int k = left + 1, p = left; k <= right; k++) { > double ak = a[k]; > if (ak != 0.0d) { > return; > } > if (Double.doubleToRawLongBits(ak) < 0) { // ak is -0.0d > a[k] = +0.0d; > a[p] = -0.0d; > p++; > } > } > } > > /** > * Sorts the specified range of the array into ascending order by the > * Dual-Pivot Quicksort algorithm. This method differs from the public > * {@code sort} method in that the {@code right} index is inclusive, > * it does no range checking on {@code left} or {@code right}, and has > * boolean flag if insertion sort with sentinel is used or not. > * > * @param a the array to be sorted > * @param left the index of the first element, inclusive, to be sorted > * @param right the index of the last element, inclusive, to be sorted > * @param leftmost indicates if the part is the most left in the range > */ > private static void sort(double[] a, int left,int right,boolean > leftmost) { > int length = right - left + 1; > > // Use insertion sort on tiny arrays > if (length < INSERTION_SORT_THRESHOLD) { > if (!leftmost) { > /* > * Every element in adjoining part plays the role > * of sentinel, therefore this allows us to avoid > * the j >= left check on each iteration. > */ > for (int j, i = left + 1; i <= right; i++) { > double ai = a[i]; > for (j = i - 1; ai < a[j]; j--) { > // assert j >= left; > a[j + 1] = a[j]; > } > a[j + 1] = ai; > } > } else { > /* > * For case of leftmost part traditional (without a > sentinel) > * insertion sort, optimized for server JVM, is used. > */ > for (int i = left, j = i; i < right; j = ++i) { > double ai = a[i + 1]; > while (ai < a[j]) { > a[j + 1] = a[j]; > if (j-- == left) { > break; > } > } > a[j + 1] = ai; > } > } > return; > } > > // Inexpensive approximation of length / 7 > int seventh = (length >>> 3) + (length >>> 6) + 1; > > /* > * Sort five evenly spaced elements around (and including) the > * center element in the range. These elements will be used for > * pivot selection as described below. The choice for spacing > * these elements was empirically determined to work well on > * a wide variety of inputs. > */ > int e3 = (left + right) >>> 1; // The midpoint > int e2 = e3 - seventh; > int e1 = e2 - seventh; > int e4 = e3 + seventh; > int e5 = e4 + seventh; > > // Sort these elements using insertion sort > if (a[e2] < a[e1]) { double t = a[e2]; a[e2] = a[e1]; a[e1] = t; } > > if (a[e3] < a[e2]) { double t = a[e3]; a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > if (a[e4] < a[e3]) { double t = a[e4]; a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > if (a[e5] < a[e4]) { double t = a[e5]; a[e5] = a[e4]; a[e4] = t; > if (t < a[e3]) { a[e4] = a[e3]; a[e3] = t; > if (t < a[e2]) { a[e3] = a[e2]; a[e2] = t; > if (t < a[e1]) { a[e2] = a[e1]; a[e1] = t; } > } > } > } > > /* > * Use the second and fourth of the five sorted elements as pivots. > * These values are inexpensive approximations of the first and > * second terciles of the array. Note that pivot1 <= pivot2. > */ > double pivot1 = a[e2]; > double pivot2 = a[e4]; > > // Pointers > int less = left; // The index of the first element of center part > int great = right; // The index before the first element of right > part > > if (pivot1 != pivot2) { > /* > * The first and the last elements to be sorted are moved to the > * locations formerly occupied by the pivots. When partitioning > * is complete, the pivots are swapped back into their final > * positions, and excluded from subsequent sorting. > */ > a[e2] = a[left]; > a[e4] = a[right]; > > /* > * Skip elements, which are less or greater than pivot values. > */ > while (a[++less] < pivot1); > while (a[--great] > pivot2); > > /* > * Partitioning: > * > * left part center part right > part > * > +--------------------------------------------------------------+ > * | < pivot1 | pivot1 <= && <= pivot2 | ? | > pivot2 > | > * > +--------------------------------------------------------------+ > * ^ ^ ^ > * | | | > * less k great > * > * Invariants: > * > * all in (left, less) < pivot1 > * pivot1 <= all in [less, k) <= pivot2 > * all in (great, right) > pivot2 > * > * Pointer k is the first index of ?-part. > */ > outer: > for (int k = less; k <= great; k++) { > double ak = a[k]; > if (ak < pivot1) { // Move a[k] to left part > a[k] = a[ > -------------- next part -------------- An HTML attachment was scrubbed... URL: From mandy.chung at oracle.com Fri Jun 18 16:36:01 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Fri, 18 Jun 2010 16:36:01 +0000 Subject: hg: jdk7/tl/jdk: 6961894: TEST_BUG: jdk_lang tests fail in samevm mode Message-ID: <20100618163633.CCEAC47384@hg.openjdk.java.net> Changeset: 7526d0b9aab0 Author: mchung Date: 2010-06-18 09:35 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/7526d0b9aab0 6961894: TEST_BUG: jdk_lang tests fail in samevm mode Summary: Fixed jdk_lang tests to run in samevm mode or mark to run in othervm Reviewed-by: alanb ! test/ProblemList.txt ! test/java/lang/System/ExitFinalizersAndJIT.java ! test/java/lang/Thread/GenerifyStackTraces.java ! test/java/lang/Thread/StackTraces.java ! test/java/lang/management/ClassLoadingMXBean/LoadCounts.java ! test/java/lang/management/ManagementFactory/MXBeanProxyTest.java ! test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java ! test/java/lang/management/MemoryMXBean/LowMemoryTest.java ! test/java/lang/management/MemoryMXBean/MemoryManagement.java ! test/java/lang/management/MemoryMXBean/Pending.java ! test/java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java ! test/java/lang/management/MemoryPoolMXBean/ThresholdTest.java ! test/java/lang/management/RuntimeMXBean/UpTime.java ! test/java/lang/management/ThreadMXBean/AllThreadIds.java ! test/java/lang/management/ThreadMXBean/DisableTest.java ! test/java/lang/management/ThreadMXBean/EnableTest.java ! test/java/lang/management/ThreadMXBean/FindDeadlocks.java ! test/java/lang/management/ThreadMXBean/FindMonitorDeadlock.java ! test/java/lang/management/ThreadMXBean/Locks.java ! test/java/lang/reflect/Proxy/Boxing.java ! test/java/lang/reflect/Proxy/ClassRestrictions.java ! test/java/lang/reflect/Proxy/returnTypes/Test.java From mandy.chung at oracle.com Fri Jun 18 16:45:59 2010 From: mandy.chung at oracle.com (Mandy Chung) Date: Fri, 18 Jun 2010 09:45:59 -0700 Subject: 6962045: TEST_BUG: Tests in test/java/io/Serializable leave files open In-Reply-To: <4C1A3A24.10001@oracle.com> References: <4C1A3A24.10001@oracle.com> Message-ID: <4C1BA2C7.2000300@oracle.com> Looks good to me. Thanks Mandy Alan Bateman wrote: > > Many of the serialization tests leave files open and this causes > problems, particularly on Windows, when running these tests in jtreg > samevm mode. One failure can cascade and cause all subsequent tests to > fail. > > I've taken a pass over these tests so that all 115 now pass in this > mode. The changes are trivial and are mostly just the addition of a > finally block to close the streams. I've kept the changes to a minimum > and more work could be done if anyone has cycles. In particular there > are several tests that close their files but only when the test > passes. One idea is to take a pass over these tests once ARM blocks > are in and stable. I've changed one test to run in othervm mode as it > requires a security manager (and I'm assuming we're not all at jtreg > 4.1 yet). There are two tests that assumed the test is loaded by the > system class loader. Otherwise all the changes are trivial. > > I've put the webrev here: > http://cr.openjdk.java.net/~alanb/6962045/webrev/ > > -Alan. From xueming.shen at oracle.com Fri Jun 18 17:34:39 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Fri, 18 Jun 2010 10:34:39 -0700 Subject: 6962419: TEST_BUG: java_io tests fails in samevm mode In-Reply-To: <4C1B88CA.1030901@oracle.com> References: <4C1B88CA.1030901@oracle.com> Message-ID: <4C1BAE2F.8050006@oracle.com> looks good. Alan Bateman wrote: > > This is another batch of updates to the regression tests to allow them > be run in jtreg samevm mode. This batch covers the java.io tests. As > expected, most of the issues are simply tests leaving files open, > causing problems for subsequent tests running in the same VM. There > are also several other random issues such as tests assuming the > working directory, one test assuming it will be defined by the system > class loader, and an issue cleaning up after a test that leaves a > hidden file. > > The webrev with the changes is here: > http://cr.openjdk.java.net/~alanb/6962419/webrev/ > > With these changes (plus yesterday's batch to fix the serialization > tests) then all 305 java.io tests pass, for me, in both samevm and > othervm modes on all platforms. > > Alan. From David.Holmes at oracle.com Fri Jun 18 22:51:06 2010 From: David.Holmes at oracle.com (David Holmes) Date: Sat, 19 Jun 2010 08:51:06 +1000 Subject: 6962419: TEST_BUG: java_io tests fails in samevm mode In-Reply-To: References: <4C1B88CA.1030901@oracle.com> Message-ID: <4C1BF85A.4010800@oracle.com> Kelly O'Hair said the following on 06/19/10 01:23: > Just an aside comment. > I really hate import wildcards, seems so... inexact. I side with the person who decided that wildcard imports were a good idea for the language. I think explicitly listing every single type used by a class as if it were a long list of C header includes is just wrong. I can see how some tools might find it useful, but for the programmer ... yuck! If the IDE does it for you that helps but even then I don't want to see that list regardless. Just my 2c as I run out the door on vacation :) David > I noticed that there are GPL utilities out there that could clean these > up for us, > making the import list exact. > One I found at http://www.javafaq.nu/java-article914.html, and I know > NetBeans and IDEs > have 'Fix Imports' options, I use them all the time. But if this could > be easily > batched... seems like something to think about. > > Maybe that would be a good summer intern job of figuring out how to make > the imports > explicit, and also a scheme to maintain it? > What do you think? Is it worth it? > > Maybe create a database too so people could run all the tests using a > specific class > or method? Just ideas... > > -kto > > On Jun 18, 2010, at 7:55 AM, Alan Bateman wrote: > >> >> This is another batch of updates to the regression tests to allow them >> be run in jtreg samevm mode. This batch covers the java.io tests. As >> expected, most of the issues are simply tests leaving files open, >> causing problems for subsequent tests running in the same VM. There >> are also several other random issues such as tests assuming the >> working directory, one test assuming it will be defined by the system >> class loader, and an issue cleaning up after a test that leaves a >> hidden file. >> >> The webrev with the changes is here: >> http://cr.openjdk.java.net/~alanb/6962419/webrev/ >> >> With these changes (plus yesterday's batch to fix the serialization >> tests) then all 305 java.io tests pass, for me, in both samevm and >> othervm modes on all platforms. >> >> Alan. > From jonathan.gibbons at oracle.com Fri Jun 18 23:46:04 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Fri, 18 Jun 2010 23:46:04 +0000 Subject: hg: jdk7/tl/langtools: 6962540: langtools Makefile sets DEV_NULL incorrectly Message-ID: <20100618234608.BB6E4473A0@hg.openjdk.java.net> Changeset: 0ba1f80b73a5 Author: jjg Date: 2010-06-18 16:45 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/0ba1f80b73a5 6962540: langtools Makefile sets DEV_NULL incorrectly Reviewed-by: ohair ! make/Makefile From jonathan.gibbons at oracle.com Sat Jun 19 04:14:34 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Sat, 19 Jun 2010 04:14:34 +0000 Subject: hg: jdk7/tl/langtools: 6961178: Allow doclet.xml to contain XML attributes Message-ID: <20100619041438.38CFB473AB@hg.openjdk.java.net> Changeset: 4177f5bdd189 Author: jjg Date: 2010-06-18 21:13 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/4177f5bdd189 6961178: Allow doclet.xml to contain XML attributes Reviewed-by: bpatel ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java ! src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java + src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java From iaroslavski at mail.ru Sat Jun 19 13:38:49 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Sat, 19 Jun 2010 17:38:49 +0400 Subject: =?koi8-r?Q?Re[2]=3A_New_portion_of_improvements_for_Dual-Pivot_Quicksort?= In-Reply-To: References: Message-ID: Hello Osvaldo, I've prepared simple test which scans an array and does assignments for each element, see attached Test class: a[k] = a[less]; a[less++] = 0; // or a[less] = 0; less++; The result of running "java -client Test" is: a[less], less++; Time: 6998 a[less++]; Time: 8416 It is much more than 1%. Is it bug in JVM? Note that under server VM there is no difference between "a[less++]" and "a[less], less++". I'm using JDK 7 on Windows XP: java version "1.7.0-ea" Java(TM) SE Runtime Environment (build 1.7.0-ea-b84) Java HotSpot(TM) Client VM (build 17.0-b09, mixed mode, sharing) Thanks, Vladimir Fri, 18 Jun 2010 13:03:50 -0300 ?????? ?? Osvaldo Doederlein : > Hi, > > 2010/6/18 Vladimir Iaroslavski > Hello, > > Here is next piece of improvements, see attached class. > It is surprise but code > > a[less++] = ak; > > works slower (client VM) than > > a[less] = ak; > less++; > > This is really surprising, even if it's C1 only - and bad, considering that "p[i++] = y" is a very popular Java idiom for sequential mutation of arrays (the equivalent of C's "*p++ = y". I wonder if this reveals some simple bug/weakness of C1 that should be investigated. Even a un-mighty, client-side JIT should have no problem with such minor code-ordering issue. I'm all in favor of micro optimization for critical stuff like DPQS (or most of the core actually), but the kind of change above borders gratuitous code churn... perhaps if the problem is simple to fix at the VM level, we gain this extra 1% not only in DPQS but in a gazillion other methods. > > A+ > Osvaldo > > In general, we save about about 1% on Bentley's test suite. > Also I eliminate additional check of indexes k and less: > > if (k != less) { > // swap a[k] and a[less] > } > For long type it gives additional one percent and works the same > for other types. > > If you don't have any comments/suggestions, I'm going to integrate > the code into JDK repository on the next week. > > Thanks, > Vladimir -------------- next part -------------- A non-text attachment was scrubbed... Name: Test.java Type: application/octet-stream Size: 1333 bytes Desc: not available URL: From alan.bateman at oracle.com Sat Jun 19 14:21:20 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Sat, 19 Jun 2010 14:21:20 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100619142222.E4274473C5@hg.openjdk.java.net> Changeset: ac93014a4d78 Author: alanb Date: 2010-06-18 20:59 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/ac93014a4d78 6962045: TEST_BUG: Tests in test/java/io/Serializable leave files open Reviewed-by: mchung ! test/ProblemList.txt ! test/java/io/Serializable/ClassCastExceptionDetail/Read.java ! test/java/io/Serializable/auditStreamSubclass/AuditStreamSubclass.java ! test/java/io/Serializable/backRefCNFException/Read.java ! test/java/io/Serializable/checkModifiers/CheckModifiers.java ! test/java/io/Serializable/classDescFlagConflict/Read.java ! test/java/io/Serializable/classDescHooks/ClassDescHooks.java ! test/java/io/Serializable/duplicateSerialFields/Test.java ! test/java/io/Serializable/enum/badResolve/Read.java ! test/java/io/Serializable/enum/constantSubclasses/Read.java ! test/java/io/Serializable/enum/missingConstant/Read.java ! test/java/io/Serializable/fieldTypeString/Read.java ! test/java/io/Serializable/illegalHandle/Test.java ! test/java/io/Serializable/longString/LongString.java ! test/java/io/Serializable/oldTests/AnnotateClass.java ! test/java/io/Serializable/oldTests/ArrayFields.java ! test/java/io/Serializable/oldTests/ArraysOfArrays.java ! test/java/io/Serializable/oldTests/BinaryTree.java ! test/java/io/Serializable/oldTests/CircularList.java ! test/java/io/Serializable/oldTests/SimpleArrays.java ! test/java/io/Serializable/oldTests/WritePrimitive.java ! test/java/io/Serializable/packageAccess/Test.java ! test/java/io/Serializable/parents/EvolvedClass.java ! test/java/io/Serializable/parents/OriginalClass.java ! test/java/io/Serializable/proxy/Basic.java ! test/java/io/Serializable/proxy/skipMissing/Read.java ! test/java/io/Serializable/proxy/skipMissing/Write.java ! test/java/io/Serializable/readObjectNoData/Read.java ! test/java/io/Serializable/skipWriteObject/Read.java ! test/java/io/Serializable/skippedObjCNFException/Read.java ! test/java/io/Serializable/stopCustomDeserialization/Read.java ! test/java/io/Serializable/unresolvedClassDesc/Read.java ! test/java/io/Serializable/unshared/Read.java ! test/java/io/Serializable/wrongReturnTypes/Read.java Changeset: 5919f0c72c0b Author: alanb Date: 2010-06-19 15:17 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/5919f0c72c0b 6962419: TEST_BUG: java_io tests fails in samevm mode Reviewed-by: ohair, sherman ! test/ProblemList.txt ! test/java/io/BufferedReader/BigMark.java ! test/java/io/BufferedReader/ReadLineSync.java ! test/java/io/DataInputStream/OpsAfterClose.java ! test/java/io/DataInputStream/ReadFully.java ! test/java/io/File/DeleteOnExit.java ! test/java/io/File/DeleteOnExitNPE.java ! test/java/io/File/IsHidden.java ! test/java/io/FileInputStream/LeadingSlash.java ! test/java/io/InputStream/OpsAfterClose.java ! test/java/io/InputStream/ReadParams.java ! test/java/io/InputStreamReader/GrowAfterEOF.java ! test/java/io/ObjectInputStream/ResolveProxyClass.java ! test/java/io/RandomAccessFile/EOF.java ! test/java/io/RandomAccessFile/ParameterCheck.java ! test/java/io/RandomAccessFile/ReadLine.java ! test/java/io/RandomAccessFile/Seek.java ! test/java/io/RandomAccessFile/WriteBytesChars.java ! test/java/io/RandomAccessFile/WriteUTF.java ! test/java/io/RandomAccessFile/skipBytes/SkipBytes.java ! test/java/io/Reader/Skip.java ! test/java/io/Reader/SkipNegative.java ! test/java/io/StreamTokenizer/Comment.java ! test/java/io/readBytes/ReadBytesBounds.java From Alan.Bateman at oracle.com Sun Jun 20 08:49:21 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Sun, 20 Jun 2010 09:49:21 +0100 Subject: 6962419: TEST_BUG: java_io tests fails in samevm mode In-Reply-To: References: <4C1B88CA.1030901@oracle.com> Message-ID: <4C1DD611.3080709@oracle.com> Kelly O'Hair wrote: > Looks great to me. > > Thanks to everyone for fixing tests like this. > > People should keep in mind that some of the test batches in the > jdk/test/Makefile > do NOT run in samevm mode at all, e.g. jdk_awt, jdk_beans2, > jdk_beans3, jdk_management1, > jdk_management2, jdk_nio2, jdk_nio3, jdk_rmi, jdk_security2, > jdk_security3, jdk_swing, > and jdk_tools2. When I tried to run them in samevm mode, there were > too many problems, > so I gave up on the entire batch. Although some of the batches may > make sense to be entirely > othervm tests, like jdk_tools2. But eventually, I think it's a good > idea to mark tests > that need a dedicated VM "othervm", making it explicit. The jdk_nio3 batch seem to be charsets and sctp tests. I don't think it should take too much effort to get most of the charsets tests running in samevm mode. I think Chris might be looking at the sctp tests already (I think the failures there are due to variation in the sctp support rather than issues running the tests in the same VM). I'll try to get cycles next week to sort out the jdk_nio2 batch. There are a dozen of so tests there that require their own VM (might be able to combine some of the smaller tests to offset the cost of running them in othervm mode). There are also a couple of tests that will need to be dialed down as they consume all resources and cause problems for subsequent tests. Overall I don't expect there will be a huge performance benefit to running this batch in samevm mode (some benefit, just not as significant as other batches with lots of short running tests). -Alan. From kumar.x.srinivasan at oracle.com Sun Jun 20 18:25:53 2010 From: kumar.x.srinivasan at oracle.com (kumar.x.srinivasan at oracle.com) Date: Sun, 20 Jun 2010 18:25:53 +0000 Subject: hg: jdk7/tl/jdk: 6712743: pack200: should default to 150.7 pack format for classfiles without any classes. Message-ID: <20100620182627.20F6F473FD@hg.openjdk.java.net> Changeset: 43dfa39686a1 Author: ksrini Date: 2010-06-19 17:42 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/43dfa39686a1 6712743: pack200: should default to 150.7 pack format for classfiles without any classes. Reviewed-by: jrose ! src/share/classes/com/sun/java/util/jar/pack/Constants.java ! src/share/classes/com/sun/java/util/jar/pack/Package.java ! src/share/classes/java/util/jar/Pack200.java + test/tools/pack200/PackageVersionTest.java From kelly.ohair at oracle.com Sun Jun 20 18:32:37 2010 From: kelly.ohair at oracle.com (Kelly O'Hair) Date: Sun, 20 Jun 2010 11:32:37 -0700 Subject: 6962419: TEST_BUG: java_io tests fails in samevm mode In-Reply-To: <4C1DD611.3080709@oracle.com> References: <4C1B88CA.1030901@oracle.com> <4C1DD611.3080709@oracle.com> Message-ID: On Jun 20, 2010, at 1:49 AM, Alan Bateman wrote: > Kelly O'Hair wrote: >> Looks great to me. >> >> Thanks to everyone for fixing tests like this. >> >> People should keep in mind that some of the test batches in the jdk/ >> test/Makefile >> do NOT run in samevm mode at all, e.g. jdk_awt, jdk_beans2, >> jdk_beans3, jdk_management1, >> jdk_management2, jdk_nio2, jdk_nio3, jdk_rmi, jdk_security2, >> jdk_security3, jdk_swing, >> and jdk_tools2. When I tried to run them in samevm mode, there were >> too many problems, >> so I gave up on the entire batch. Although some of the batches may >> make sense to be entirely >> othervm tests, like jdk_tools2. But eventually, I think it's a good >> idea to mark tests >> that need a dedicated VM "othervm", making it explicit. > The jdk_nio3 batch seem to be charsets and sctp tests. I don't think > it should take too much effort to get most of the charsets tests > running in samevm mode. I think Chris might be looking at the sctp > tests already (I think the failures there are due to variation in > the sctp support rather than issues running the tests in the same VM). > That would be great. Thanks to all of you for the testcase work. I think this will pay off in the long run. > I'll try to get cycles next week to sort out the jdk_nio2 batch. > There are a dozen of so tests there that require their own VM (might > be able to combine some of the smaller tests to offset the cost of > running them in othervm mode). There are also a couple of tests that > will need to be dialed down as they consume all resources and cause > problems for subsequent tests. Overall I don't expect there will be > a huge performance benefit to running this batch in samevm mode > (some benefit, just not as significant as other batches with lots of > short running tests). That's what I was thinking with the jdk_tools2 tests, lots of shell tests, which are by default 'othervm' tests, BUT I was surprised, it does run faster in samevm, so it doesn't take very many samevm tests being in the batch of tests to make a difference in overall run time. -kto > > -Alan. From kumar.x.srinivasan at oracle.com Thu Jun 10 16:52:44 2010 From: kumar.x.srinivasan at oracle.com (Kumar Srinivasan) Date: Thu, 10 Jun 2010 09:52:44 -0700 Subject: Review please : 6575373 : Error verifying signatures of pack200 files in some cases Message-ID: <4C11185C.1030806@oracle.COM> Hello, This is a very simple fix to a long standing issue with pack200, it changes the default behavior of pack200 to use one segment by default, which will cover most common use cases. http://cr.openjdk.java.net/~ksrini/6575373/ Thanks Kumar From john.r.rose at oracle.com Thu Jun 10 18:05:57 2010 From: john.r.rose at oracle.com (john.r.rose at oracle.com) Date: Thu, 10 Jun 2010 11:05:57 -0700 Subject: Review please : 6575373 : Error verifying signatures of pack200 files in some cases In-Reply-To: <4C11185C.1030806@oracle.COM> References: <4C11185C.1030806@oracle.COM> Message-ID: <15FD2C30-E1D9-4D46-ADED-820220CE5892@oracle.com> Looks good. -- John (on my iPhone) On Jun 10, 2010, at 9:52 AM, Kumar Srinivasan wrote: > Hello, > > This is a very simple fix to a long standing issue with pack200, it > changes the > default behavior of pack200 to use one segment by default, which will > cover most common use cases. > > http://cr.openjdk.java.net/~ksrini/6575373/ > > Thanks > Kumar > From Nikolay.Gorshkov at Sun.COM Tue Jun 15 13:25:28 2010 From: Nikolay.Gorshkov at Sun.COM (Nikolay Gorshkov) Date: Tue, 15 Jun 2010 17:25:28 +0400 Subject: Review please : 6575373 : Error verifying signatures of pack200 files in some cases In-Reply-To: <4C11185C.1030806@oracle.COM> References: <4C11185C.1030806@oracle.COM> Message-ID: <4C177F48.9060502@sun.com> Hello Kumar, I think we should update the comment above the changed line in PropMap.java too. Thanks, Nikolay Kumar Srinivasan wrote: > Hello, > > This is a very simple fix to a long standing issue with pack200, it > changes the > default behavior of pack200 to use one segment by default, which will > cover most common use cases. > > http://cr.openjdk.java.net/~ksrini/6575373/ > > Thanks > Kumar > From daniel.daugherty at oracle.com Thu Jun 17 00:30:35 2010 From: daniel.daugherty at oracle.com (Daniel D. Daugherty) Date: Wed, 16 Jun 2010 18:30:35 -0600 Subject: Review request: test/java/util/logging/ParentLoggersTest.java fails in samevm mode In-Reply-To: <4C17B6D9.8070800@oracle.com> References: <4C17B6D9.8070800@oracle.com> Message-ID: <4C196CAB.8020700@oracle.com> Mandy, What happens when the test is run twice in samevm mode? I suspect that the expected Logger names will be in the initialLoggerNames list at the beginning of the second run and thus won't be added to returnedLoggerNames on line 104. There isn't a way to delete a Logger so if you want this test to work when run twice, you'll need to filter the expected Loggers out of the initial list. So instead of the defaultLogger filter on lines 48-54, you'll need to filter out the expected Loggers instead. Dan On 6/15/2010 11:22 AM, Mandy Chung wrote: > Fixed 6961408: test/java/util/logging/ParentLoggersTest.java fails in > samevm mode > > Webrev at: > http://cr.openjdk.java.net/~mchung/6961408/webrev.00/ > > This fix updates the test to check the list of loggers before and > after the test run and also takes out all logging tests from the > ProblemList.txt. > > Thanks > Mandy From daniel.daugherty at oracle.com Thu Jun 17 00:52:37 2010 From: daniel.daugherty at oracle.com (Daniel D. Daugherty) Date: Wed, 16 Jun 2010 18:52:37 -0600 Subject: Review request: test/java/util/logging/ParentLoggersTest.java fails in samevm mode In-Reply-To: <4C196F55.9000406@oracle.com> References: <4C17B6D9.8070800@oracle.com> <4C196CAB.8020700@oracle.com> <4C196F55.9000406@oracle.com> Message-ID: <4C1971D5.3080403@oracle.com> OK by me. Forgot to say "thumbs up" before. Dan On 6/16/2010 6:41 PM, Mandy Chung wrote: > Daniel D. Daugherty wrote: >> Mandy, >> >> What happens when the test is run twice in samevm mode? > > The test only needs to support running once in samevm mode. Are you > thinking of some kind of stress testing? In any case, I don't think > we need to fix the test to support running more than once in the same vm. > > Mandy > >> >> I suspect that the expected Logger names will be in the >> initialLoggerNames list at the beginning of the second run >> and thus won't be added to returnedLoggerNames on line 104. >> >> There isn't a way to delete a Logger so if you want this >> test to work when run twice, you'll need to filter the >> expected Loggers out of the initial list. So instead of >> the defaultLogger filter on lines 48-54, you'll need to >> filter out the expected Loggers instead. >> >> Dan >> >> >> >> On 6/15/2010 11:22 AM, Mandy Chung wrote: >>> Fixed 6961408: test/java/util/logging/ParentLoggersTest.java fails >>> in samevm mode >>> >>> Webrev at: >>> http://cr.openjdk.java.net/~mchung/6961408/webrev.00/ >>> >>> This fix updates the test to check the list of loggers before and >>> after the test run and also takes out all logging tests from the >>> ProblemList.txt. >>> >>> Thanks >>> Mandy > From kelly.ohair at oracle.com Mon Jun 21 02:37:44 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Mon, 21 Jun 2010 02:37:44 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100621023814.581744740E@hg.openjdk.java.net> Changeset: a086a3d98711 Author: ohair Date: 2010-06-20 14:51 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/a086a3d98711 6960853: Cleanup makefiles, remove unused vars etc. Reviewed-by: alanb ! make/common/shared/Defs-control.gmk ! make/netbeans/README ! make/netbeans/world/README ! make/netbeans/world/build.xml Changeset: 840265545bc3 Author: ohair Date: 2010-06-20 14:53 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/840265545bc3 6962617: Testcase changes, cleanup of problem list for jdk_tools targets Reviewed-by: alanb ! test/Makefile ! test/ProblemList.txt ! test/com/sun/jdi/PopAndInvokeTest.java ! test/com/sun/servicetag/JavaServiceTagTest1.java ! test/com/sun/servicetag/SystemRegistryTest.java ! test/com/sun/tools/attach/BasicTests.sh ! test/com/sun/tracing/BasicFunctionality.java ! test/sun/jvmstat/testlibrary/utils.sh ! test/sun/tools/jps/jps-Vvml_2.sh ! test/sun/tools/jps/jps-m_2.sh ! test/sun/tools/jstatd/jstatdDefaults.sh ! test/sun/tools/jstatd/jstatdExternalRegistry.sh ! test/sun/tools/jstatd/jstatdPort.sh ! test/sun/tools/jstatd/jstatdServerName.sh ! test/tools/jar/UpdateManifest.java ! test/tools/jar/index/MetaInf.java From opinali at gmail.com Mon Jun 21 14:18:20 2010 From: opinali at gmail.com (Osvaldo Doederlein) Date: Mon, 21 Jun 2010 11:18:20 -0300 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: Message-ID: Hi Vladimir, 2010/6/19 Vladimir Iaroslavski > Hello Osvaldo, > > I've prepared simple test which scans an array and does assignments for > each element, > see attached Test class: > > a[k] = a[less]; > a[less++] = 0; // or a[less] = 0; less++; > > The result of running "java -client Test" is: > > a[less], less++; Time: 6998 > a[less++]; Time: 8416 > > It is much more than 1%. Is it bug in JVM? Note that under server VM > The amount of diff surely depends on the benchmark; your bench should "zoom" the problem by not having much other work polluting the measurement. But in my own test with b98 (32-bit), Q6600 CPU, I've got 5065/5079, so the diff is < 1%. The excessive disadvantage you report may be something bad in your older b84. Anyway I investigated the JIT-compiled code, details in the end (I've split the benchmark in two classes just to make the comparison simpler). The problem with "a[less++]" is that "less++" will first increment "less", _then_ it will use the old value (not-incremented) to index "a". C1 generates code that is equivalent to: int less_incremented = less + 1; a[less] = 0; less = less_incremented; ...which is a 1-to-1 translation of the IR coming off the bytecode. C1 is not smart enough to see that the increment can be reordered after the indexing, maybe because there's a data dependency as the indexing uses "less"; but due to the semantics of postfix "++" this dependency is for the before-increment value, so the reordering would be safe. Maybe that's just some simple missing heuristics that could be easily added? there is no difference between "a[less++]" and "a[less], less++". > C2 generates completely different code,with 16X unrolling - this is the inner loop: 0x026a6e40: pxor %xmm0,%xmm0 ;*aload_0 ; - Test1::sort1 at 9 (line 23) 0x026a6e44: movq %xmm0,0xc(%ecx,%esi,4) 0x026a6e4a: movq %xmm0,0x14(%ecx,%esi,4) 0x026a6e50: movq %xmm0,0x1c(%ecx,%esi,4) 0x026a6e56: movq %xmm0,0x24(%ecx,%esi,4) 0x026a6e5c: movq %xmm0,0x2c(%ecx,%esi,4) 0x026a6e62: movq %xmm0,0x34(%ecx,%esi,4) 0x026a6e68: movq %xmm0,0x3c(%ecx,%esi,4) 0x026a6e6e: movq %xmm0,0x44(%ecx,%esi,4) ;*iastore ; - Test1::sort1 at 21 (line 24) 0x026a6e74: add $0x10,%esi ;*iinc ; - Test1::sort1 at 22 (line 22) 0x026a6e77: cmp %ebp,%esi 0x026a6e79: jl 0x026a6e44 There is some extra slow-path code to fill the remaining 1...15 elements if the loop length is not multiple of 16, and that's all. C2 detects the redundancy between the "k" and "less" vars, and kills the also-redundant "a[k] = a[less]" assignment so the net result is a simple zero-fill of the array. Maybe a different benchmark without these redundancies would make easier to see that C2 doesn't have a problem with the postfix "++", but if it had, I think it wouldn't reach the excellent result above. A+ Osvaldo > I'm using JDK 7 on Windows XP: > > java version "1.7.0-ea" > Java(TM) SE Runtime Environment (build 1.7.0-ea-b84) > Java HotSpot(TM) Client VM (build 17.0-b09, mixed mode, sharing) > > Thanks, > Vladimir > > This is the C1 code for sort2()'s loop: 0x0251c1dc: cmp 0x8(%ecx),%esi ; implicit exception: dispatches to 0x0251c21e ;; 30 branch [AE] [RangeCheckStub: 0x454c640] [bci:13] 0x0251c1df: jae 0x0251c24a 0x0251c1e5: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; ; - Test2::sort2 at 13 (line 23) 0x0251c1e9: cmp 0x8(%ecx),%edi ;; 36 branch [AE] [RangeCheckStub: 0x454c7e0] [bci:14] 0x0251c1ec: jae 0x0251c263 0x0251c1f2: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; ; - Test2::sort2 at 14 (line 23) (sort1/sort2 start to differ here) 0x0251c1f6: cmp 0x8(%ecx),%esi ;; 42 branch [AE] [RangeCheckStub: 0x454c980] [bci:18] 0x0251c1f9: jae 0x0251c27c 0x0251c1ff: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less] = 0; ; - Test2::sort2 at 18 (line 24) 0x0251c207: inc %esi ; ++less; 0x0251c208: inc %edi ; OopMap{ecx=Oop off=73} ;*goto: for k++ ; - Test2::sort2 at 25 (line 22) 0x0251c209: test %eax,0x1a0100 ;*goto ; - Test2::sort2 at 25 (line 22) ; {poll} ;; block B1 [4, 6] 0x0251c20f: cmp %edx,%edi ;; 22 branch [LT] [B2] 0x0251c211: jl 0x0251c1dc ;*if_icmpge: for k < right ; - Test2::sort2 at 6 (line 22) The code looks OK; C1 doesn't do much optimization - no unrolling, bounds check elimination - but it's otherwise just about the code you would expect for a simple JITting. Now, C1 code for sort1()'s loop: 0x024bc21c: cmp 0x8(%ecx),%esi ; implicit exception: dispatches to 0x024bc262 ;; 30 branch [AE] [RangeCheckStub: 0x44ee3b0] [bci:13] 0x024bc21f: jae 0x024bc28e 0x024bc225: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; ; - Test1::sort1 at 13 (line 23) 0x024bc229: cmp 0x8(%ecx),%edi ;; 36 branch [AE] [RangeCheckStub: 0x44ee550] [bci:14] 0x024bc22c: jae 0x024bc2a7 0x024bc232: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; ; - Test1::sort1 at 14 (line 23) (sort1/sort2 start to differ here) 0x024bc236: mov %esi,%ebx ; Crap! C1 temps 'less' into %ebx 0x024bc238: inc %ebx ; ++less; (for the temp "less from future") 0x024bc239: cmp 0x8(%ecx),%esi ; %esi is still the "old less".... ;; 46 branch [AE] [RangeCheckStub: 0x44ee7b8] [bci:21] 0x024bc23c: jae 0x024bc2c0 0x024bc242: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less++] = 0; ; - Test1::sort1 at 21 (line 24) 0x024bc24a: inc %edi ; OopMap{ecx=Oop off=75} ;*goto: for k++ ; - Test1::sort1 at 25 (line 22) 0x024bc24b: test %eax,0x1a0100 ; {poll} 0x024bc251: mov %ebx,%esi ;*goto ; - Test1::sort1 at 25 (line 22): for... ;; block B1 [4, 6] 0x024bc253: cmp %edx,%edi ;; 22 branch [LT] [B2] 0x024bc255: jl 0x024bc21c ;*if_icmpge ; - Test1::sort1 at 6 (line 22): for... -------------- next part -------------- An HTML attachment was scrubbed... URL: From mandy.chung at oracle.com Mon Jun 21 16:40:16 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Mon, 21 Jun 2010 16:40:16 +0000 Subject: hg: jdk7/tl/jdk: 6962478: Privacy page referenced in register_ja.html is incorrect Message-ID: <20100621164036.6F04F4742D@hg.openjdk.java.net> Changeset: 2366c2a5624c Author: mchung Date: 2010-06-20 19:56 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/2366c2a5624c 6962478: Privacy page referenced in register_ja.html is incorrect Summary: Fix the URL for the privacy page Reviewed-by: ogino ! src/share/classes/com/sun/servicetag/resources/register_ja.html From kelly.ohair at oracle.com Mon Jun 21 19:38:40 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Mon, 21 Jun 2010 19:38:40 +0000 Subject: hg: jdk7/tl: 6960853: Cleanup makefiles, remove unused vars etc.; ... Message-ID: <20100621193840.58ED647438@hg.openjdk.java.net> Changeset: 47f6b7db1882 Author: ohair Date: 2010-06-21 11:00 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/47f6b7db1882 6960853: Cleanup makefiles, remove unused vars etc. 6959596: Windows fastdebug build broken 6960335: Add top level 'make test' rule that uses test/Makefile, runs all test batches Reviewed-by: alanb ! Makefile ! make/Defs-internal.gmk ! make/jprt.gmk ! make/sanity-rules.gmk ! test/Makefile From mandy.chung at oracle.com Mon Jun 21 22:03:06 2010 From: mandy.chung at oracle.com (mandy.chung at oracle.com) Date: Mon, 21 Jun 2010 22:03:06 +0000 Subject: hg: jdk7/tl/jdk: 6962815: support enable and disable of the servicetag's system registry for testing purpose Message-ID: <20100621220325.0ADF94743E@hg.openjdk.java.net> Changeset: fe7271b4aeea Author: mchung Date: 2010-06-21 15:02 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/fe7271b4aeea 6962815: support enable and disable of the servicetag's system registry for testing purpose Summary: Allow the system registry to be disabled/enabled at runtime Reviewed-by: ksrini ! src/share/classes/com/sun/servicetag/Registry.java ! test/com/sun/servicetag/FindServiceTags.java ! test/com/sun/servicetag/JavaServiceTagTest1.java ! test/com/sun/servicetag/SystemRegistryTest.java ! test/com/sun/servicetag/Util.java From iaroslavski at mail.ru Tue Jun 22 12:15:56 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Tue, 22 Jun 2010 16:15:56 +0400 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: References: Message-ID: <4C20A97C.2050601@mail.ru> Hello, I tried with the latest JDK, build 98 and see different behaviour on two computers: 7570 / 8318 and 8560 / 8590, but sorting method works slower with a[less++] instruction on both computers: first second a[less] = ak; less++; / (a[less++] = ak; random: 16371 / 16696 14018 / 14326 ascendant: 2706 / 2762 2884 / 2897 descendant: 2994 / 3108 3170 / 3258 organ pipes: 7073 / 7296 6939 / 7090 stagger(2): 7765 / 8069 7531 / 7731 period(1,2): 653 / 743 719 / 753 random(1..4): 2152 / 2234 1567 / 1591 If I change Test class and populate the array with descendant values, I still see difference in times: 4793 / 5718 see updated attached Test class. Also I'm attaching the latest version of DualPivotQuicksort with minor format changes. If you don't have comments, I'll ask to to integrate the code at the end of this week. Thank you, Vladimir Osvaldo Doederlein wrote: > Hi Vladimir, > > 2010/6/19 Vladimir Iaroslavski > > > Hello Osvaldo, > > I've prepared simple test which scans an array and does assignments > for each element, > see attached Test class: > > a[k] = a[less]; > a[less++] = 0; // or a[less] = 0; less++; > > The result of running "java -client Test" is: > > a[less], less++; Time: 6998 > a[less++]; Time: 8416 > > It is much more than 1%. Is it bug in JVM? Note that under server VM > > The amount of diff surely depends on the benchmark; your bench should > "zoom" the problem by not having much other work polluting the > measurement. But in my own test with b98 (32-bit), Q6600 CPU, I've got > 5065/5079, so the diff is < 1%. The excessive disadvantage you report > may be something bad in your older b84. > > Anyway I investigated the JIT-compiled code, details in the end (I've > split the benchmark in two classes just to make the comparison simpler). > The problem with "a[less++]" is that "less++" will first increment > "less", _then_ it will use the old value (not-incremented) to index "a". > C1 generates code that is equivalent to: > > int less_incremented = less + 1; > a[less] = 0; > less = less_incremented; > > ...which is a 1-to-1 translation of the IR coming off the bytecode. C1 > is not smart enough to see that the increment can be reordered after > the indexing, maybe because there's a data dependency as the indexing > uses "less"; but due to the semantics of postfix "++" this dependency is > for the before-increment value, so the reordering would be safe. Maybe > that's just some simple missing heuristics that could be easily added? > > there is no difference between "a[less++]" and "a[less], less++". > > C2 generates completely different code,with 16X unrolling - this is the > inner loop: > > 0x026a6e40: pxor %xmm0,%xmm0 ;*aload_0 > ; - Test1::sort1 at 9 (line 23) > 0x026a6e44: movq %xmm0,0xc(%ecx,%esi,4) > 0x026a6e4a: movq %xmm0,0x14(%ecx,%esi,4) > 0x026a6e50: movq %xmm0,0x1c(%ecx,%esi,4) > 0x026a6e56: movq %xmm0,0x24(%ecx,%esi,4) > 0x026a6e5c: movq %xmm0,0x2c(%ecx,%esi,4) > 0x026a6e62: movq %xmm0,0x34(%ecx,%esi,4) > 0x026a6e68: movq %xmm0,0x3c(%ecx,%esi,4) > 0x026a6e6e: movq %xmm0,0x44(%ecx,%esi,4) ;*iastore > ; - Test1::sort1 at 21 (line 24) > 0x026a6e74: add $0x10,%esi ;*iinc > ; - Test1::sort1 at 22 (line 22) > 0x026a6e77: cmp %ebp,%esi > 0x026a6e79: jl 0x026a6e44 > > There is some extra slow-path code to fill the remaining 1...15 elements > if the loop length is not multiple of 16, and that's all. C2 detects the > redundancy between the "k" and "less" vars, and kills the also-redundant > "a[k] = a[less]" assignment so the net result is a simple zero-fill of > the array. Maybe a different benchmark without these redundancies would > make easier to see that C2 doesn't have a problem with the postfix "++", > but if it had, I think it wouldn't reach the excellent result above. > > A+ > Osvaldo > > > I'm using JDK 7 on Windows XP: > > java version "1.7.0-ea" > Java(TM) SE Runtime Environment (build 1.7.0-ea-b84) > Java HotSpot(TM) Client VM (build 17.0-b09, mixed mode, sharing) > > Thanks, > Vladimir > > > > This is the C1 code for sort2()'s loop: > > 0x0251c1dc: cmp 0x8(%ecx),%esi ; implicit exception: dispatches > to 0x0251c21e > ;; 30 branch [AE] [RangeCheckStub: 0x454c640] [bci:13] > 0x0251c1df: jae 0x0251c24a > 0x0251c1e5: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; > ; - Test2::sort2 at 13 (line 23) > 0x0251c1e9: cmp 0x8(%ecx),%edi > ;; 36 branch [AE] [RangeCheckStub: 0x454c7e0] [bci:14] > 0x0251c1ec: jae 0x0251c263 > 0x0251c1f2: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; > ; - Test2::sort2 at 14 (line 23) > > (sort1/sort2 start to differ here) > > 0x0251c1f6: cmp 0x8(%ecx),%esi > ;; 42 branch [AE] [RangeCheckStub: 0x454c980] [bci:18] > 0x0251c1f9: jae 0x0251c27c > 0x0251c1ff: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less] = 0; > ; - Test2::sort2 at 18 (line 24) > 0x0251c207: inc %esi ; ++less; > 0x0251c208: inc %edi ; OopMap{ecx=Oop off=73} > ;*goto: for k++ > ; - Test2::sort2 at 25 (line 22) > 0x0251c209: test %eax,0x1a0100 ;*goto > ; - Test2::sort2 at 25 (line 22) > ; {poll} > ;; block B1 [4, 6] > > 0x0251c20f: cmp %edx,%edi > ;; 22 branch [LT] [B2] > 0x0251c211: jl 0x0251c1dc ;*if_icmpge: for k < right > ; - Test2::sort2 at 6 (line 22) > > The code looks OK; C1 doesn't do much optimization - no unrolling, > bounds check elimination - but it's otherwise just about the code you > would expect for a simple JITting. > > Now, C1 code for sort1()'s loop: > > 0x024bc21c: cmp 0x8(%ecx),%esi ; implicit exception: dispatches > to 0x024bc262 > ;; 30 branch [AE] [RangeCheckStub: 0x44ee3b0] [bci:13] > 0x024bc21f: jae 0x024bc28e > 0x024bc225: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; > ; - Test1::sort1 at 13 (line 23) > 0x024bc229: cmp 0x8(%ecx),%edi > ;; 36 branch [AE] [RangeCheckStub: 0x44ee550] [bci:14] > 0x024bc22c: jae 0x024bc2a7 > 0x024bc232: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; > ; - Test1::sort1 at 14 (line 23) > > (sort1/sort2 start to differ here) > > 0x024bc236: mov %esi,%ebx ; Crap! C1 temps 'less' into %ebx > 0x024bc238: inc %ebx ; ++less; (for the temp "less > from future") > > 0x024bc239: cmp 0x8(%ecx),%esi ; %esi is still the "old less".... > ;; 46 branch [AE] [RangeCheckStub: 0x44ee7b8] [bci:21] > 0x024bc23c: jae 0x024bc2c0 > 0x024bc242: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less++] = 0; > ; - Test1::sort1 at 21 (line 24) > 0x024bc24a: inc %edi ; OopMap{ecx=Oop off=75} > ;*goto: for k++ > ; - Test1::sort1 at 25 (line 22) > 0x024bc24b: test %eax,0x1a0100 ; {poll} > 0x024bc251: mov %ebx,%esi ;*goto > ; - Test1::sort1 at 25 (line 22): > for... > ;; block B1 [4, 6] > > 0x024bc253: cmp %edx,%edi > ;; 22 branch [LT] [B2] > 0x024bc255: jl 0x024bc21c ;*if_icmpge > ; - Test1::sort1 at 6 (line 22): for... -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: Test.java URL: -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: DualPivotQuicksort.java URL: From opinali at gmail.com Tue Jun 22 13:15:18 2010 From: opinali at gmail.com (Osvaldo Pinali Doederlein) Date: Tue, 22 Jun 2010 10:15:18 -0300 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4C20A97C.2050601@mail.ru> References: <4C20A97C.2050601@mail.ru> Message-ID: <4C20B766.3010202@gmail.com> Hi Vladimir, > Hello, > > I tried with the latest JDK, build 98 and see different behaviour > on two computers: 7570 / 8318 and 8560 / 8590, but sorting method > works slower with a[less++] instruction on both computers: Is the first computer (with larger performance diff) an AMD by any chance? It's odd that just the a[less++] would make the code so much slower. Perhaps the worst compiled code has additional costs in some CPUs, e.g. spoiling branch prediction for the bounds checking guards. Anyway the change is risk-free (including performance) and the advantage is important at least in some CPUs, so go ahead (FWIW wrt my opinion...). I just wish that C1 would be fixed to not need this kind of hacking - as I categorize this as a hack, not even as a "normal" low-level Java code optimization - because there are certainly millions of uses of the idiom "array[index++/--]" in JavaSE APIs and elsewhere. But I'm not familiar with the C1 source so I don't know if this is some low hanging fruit that could be addressed quickly (any HotSpot engineers there to comment?). A+ Osvaldo > > first second > a[less] = ak; less++; / (a[less++] = ak; > > random: 16371 / 16696 14018 / 14326 > ascendant: 2706 / 2762 2884 / 2897 > descendant: 2994 / 3108 3170 / 3258 > organ pipes: 7073 / 7296 6939 / 7090 > stagger(2): 7765 / 8069 7531 / 7731 > period(1,2): 653 / 743 719 / 753 > random(1..4): 2152 / 2234 1567 / 1591 > > If I change Test class and populate the array with descendant > values, I still see difference in times: 4793 / 5718 > see updated attached Test class. > > Also I'm attaching the latest version of DualPivotQuicksort > with minor format changes. If you don't have comments, I'll > ask to to integrate the code at the end of this week. > > Thank you, > Vladimir > > Osvaldo Doederlein wrote: >> Hi Vladimir, >> >> 2010/6/19 Vladimir Iaroslavski > > >> >> Hello Osvaldo, >> >> I've prepared simple test which scans an array and does assignments >> for each element, >> see attached Test class: >> >> a[k] = a[less]; >> a[less++] = 0; // or a[less] = 0; less++; >> >> The result of running "java -client Test" is: >> >> a[less], less++; Time: 6998 >> a[less++]; Time: 8416 >> >> It is much more than 1%. Is it bug in JVM? Note that under server VM >> >> The amount of diff surely depends on the benchmark; your bench should >> "zoom" the problem by not having much other work polluting the >> measurement. But in my own test with b98 (32-bit), Q6600 CPU, I've >> got 5065/5079, so the diff is < 1%. The excessive disadvantage you >> report may be something bad in your older b84. >> >> Anyway I investigated the JIT-compiled code, details in the end (I've >> split the benchmark in two classes just to make the comparison >> simpler). The problem with "a[less++]" is that "less++" will first >> increment "less", _then_ it will use the old value (not-incremented) >> to index "a". C1 generates code that is equivalent to: >> >> int less_incremented = less + 1; >> a[less] = 0; >> less = less_incremented; >> >> ...which is a 1-to-1 translation of the IR coming off the bytecode. >> C1 is not smart enough to see that the increment can be reordered >> after the indexing, maybe because there's a data dependency as the >> indexing uses "less"; but due to the semantics of postfix "++" this >> dependency is for the before-increment value, so the reordering would >> be safe. Maybe that's just some simple missing heuristics that could >> be easily added? >> >> there is no difference between "a[less++]" and "a[less], less++". >> >> C2 generates completely different code,with 16X unrolling - this is >> the inner loop: >> >> 0x026a6e40: pxor %xmm0,%xmm0 ;*aload_0 >> ; - Test1::sort1 at 9 (line 23) >> 0x026a6e44: movq %xmm0,0xc(%ecx,%esi,4) >> 0x026a6e4a: movq %xmm0,0x14(%ecx,%esi,4) >> 0x026a6e50: movq %xmm0,0x1c(%ecx,%esi,4) >> 0x026a6e56: movq %xmm0,0x24(%ecx,%esi,4) >> 0x026a6e5c: movq %xmm0,0x2c(%ecx,%esi,4) >> 0x026a6e62: movq %xmm0,0x34(%ecx,%esi,4) >> 0x026a6e68: movq %xmm0,0x3c(%ecx,%esi,4) >> 0x026a6e6e: movq %xmm0,0x44(%ecx,%esi,4) ;*iastore >> ; - Test1::sort1 at 21 (line 24) >> 0x026a6e74: add $0x10,%esi ;*iinc >> ; - Test1::sort1 at 22 (line 22) >> 0x026a6e77: cmp %ebp,%esi >> 0x026a6e79: jl 0x026a6e44 >> >> There is some extra slow-path code to fill the remaining 1...15 >> elements if the loop length is not multiple of 16, and that's all. C2 >> detects the redundancy between the "k" and "less" vars, and kills the >> also-redundant "a[k] = a[less]" assignment so the net result is a >> simple zero-fill of the array. Maybe a different benchmark without >> these redundancies would make easier to see that C2 doesn't have a >> problem with the postfix "++", but if it had, I think it wouldn't >> reach the excellent result above. >> >> A+ >> Osvaldo >> >> >> I'm using JDK 7 on Windows XP: >> >> java version "1.7.0-ea" >> Java(TM) SE Runtime Environment (build 1.7.0-ea-b84) >> Java HotSpot(TM) Client VM (build 17.0-b09, mixed mode, sharing) >> >> Thanks, >> Vladimir >> >> >> >> This is the C1 code for sort2()'s loop: >> >> 0x0251c1dc: cmp 0x8(%ecx),%esi ; implicit exception: >> dispatches to 0x0251c21e >> ;; 30 branch [AE] [RangeCheckStub: 0x454c640] [bci:13] >> 0x0251c1df: jae 0x0251c24a >> 0x0251c1e5: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; >> ; - Test2::sort2 at 13 (line 23) >> 0x0251c1e9: cmp 0x8(%ecx),%edi >> ;; 36 branch [AE] [RangeCheckStub: 0x454c7e0] [bci:14] >> 0x0251c1ec: jae 0x0251c263 >> 0x0251c1f2: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; >> ; - Test2::sort2 at 14 (line 23) >> >> (sort1/sort2 start to differ here) >> >> 0x0251c1f6: cmp 0x8(%ecx),%esi >> ;; 42 branch [AE] [RangeCheckStub: 0x454c980] [bci:18] >> 0x0251c1f9: jae 0x0251c27c >> 0x0251c1ff: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less] = 0; >> ; - Test2::sort2 at 18 (line 24) >> 0x0251c207: inc %esi ; ++less; >> 0x0251c208: inc %edi ; OopMap{ecx=Oop off=73} >> ;*goto: for k++ >> ; - Test2::sort2 at 25 (line 22) >> 0x0251c209: test %eax,0x1a0100 ;*goto >> ; - Test2::sort2 at 25 (line 22) >> ; {poll} >> ;; block B1 [4, 6] >> >> 0x0251c20f: cmp %edx,%edi >> ;; 22 branch [LT] [B2] >> 0x0251c211: jl 0x0251c1dc ;*if_icmpge: for k < right >> ; - Test2::sort2 at 6 (line 22) >> >> The code looks OK; C1 doesn't do much optimization - no unrolling, >> bounds check elimination - but it's otherwise just about the code you >> would expect for a simple JITting. >> Now, C1 code for sort1()'s loop: >> >> 0x024bc21c: cmp 0x8(%ecx),%esi ; implicit exception: >> dispatches to 0x024bc262 >> ;; 30 branch [AE] [RangeCheckStub: 0x44ee3b0] [bci:13] >> 0x024bc21f: jae 0x024bc28e >> 0x024bc225: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; >> ; - Test1::sort1 at 13 (line 23) >> 0x024bc229: cmp 0x8(%ecx),%edi >> ;; 36 branch [AE] [RangeCheckStub: 0x44ee550] [bci:14] >> 0x024bc22c: jae 0x024bc2a7 >> 0x024bc232: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; >> ; - Test1::sort1 at 14 (line 23) >> >> (sort1/sort2 start to differ here) >> >> 0x024bc236: mov %esi,%ebx ; Crap! C1 temps 'less' into >> %ebx >> 0x024bc238: inc %ebx ; ++less; (for the temp "less >> from future") >> >> 0x024bc239: cmp 0x8(%ecx),%esi ; %esi is still the "old >> less".... >> ;; 46 branch [AE] [RangeCheckStub: 0x44ee7b8] [bci:21] >> 0x024bc23c: jae 0x024bc2c0 >> 0x024bc242: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less++] = 0; >> ; - Test1::sort1 at 21 (line 24) >> 0x024bc24a: inc %edi ; OopMap{ecx=Oop off=75} >> ;*goto: for k++ >> ; - Test1::sort1 at 25 (line 22) >> 0x024bc24b: test %eax,0x1a0100 ; {poll} >> 0x024bc251: mov %ebx,%esi ;*goto >> ; - Test1::sort1 at 25 (line >> 22): for... >> ;; block B1 [4, 6] >> >> 0x024bc253: cmp %edx,%edi >> ;; 22 branch [LT] [B2] >> 0x024bc255: jl 0x024bc21c ;*if_icmpge >> ; - Test1::sort1 at 6 (line 22): >> for... From iaroslavski at mail.ru Tue Jun 22 13:16:25 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Tue, 22 Jun 2010 17:16:25 +0400 Subject: Improvements for sorting test class Message-ID: <4C20B7A9.80402@mail.ru> Hello, Please, review the Sorting test class. I added tests for null arrays (NPE must be thrown) and added description of test to error message. Thanks, Vladimir -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: Sorting.java URL: From iaroslavski at mail.ru Tue Jun 22 13:24:08 2010 From: iaroslavski at mail.ru (Vladimir Iaroslavski) Date: Tue, 22 Jun 2010 17:24:08 +0400 Subject: New portion of improvements for Dual-Pivot Quicksort In-Reply-To: <4C20B766.3010202@gmail.com> References: <4C20A97C.2050601@mail.ru> <4C20B766.3010202@gmail.com> Message-ID: <4C20B978.1040607@mail.ru> both computers with Intel processor: Pentium, Intel, 4 CPU, 3.2 GHz, 2 Gb RAM Pentium, Intel, 4 CPU, 2.8 GHz, 2 Gb RAM Osvaldo Pinali Doederlein wrote: > Hi Vladimir, > >> Hello, >> >> I tried with the latest JDK, build 98 and see different behaviour >> on two computers: 7570 / 8318 and 8560 / 8590, but sorting method >> works slower with a[less++] instruction on both computers: > > Is the first computer (with larger performance diff) an AMD by any > chance? It's odd that just the a[less++] would make the code so much > slower. Perhaps the worst compiled code has additional costs in some > CPUs, e.g. spoiling branch prediction for the bounds checking guards. > > Anyway the change is risk-free (including performance) and the advantage > is important at least in some CPUs, so go ahead (FWIW wrt my > opinion...). I just wish that C1 would be fixed to not need this kind of > hacking - as I categorize this as a hack, not even as a "normal" > low-level Java code optimization - because there are certainly millions > of uses of the idiom "array[index++/--]" in JavaSE APIs and elsewhere. > But I'm not familiar with the C1 source so I don't know if this is some > low hanging fruit that could be addressed quickly (any HotSpot engineers > there to comment?). > > A+ > Osvaldo > >> first second >> a[less] = ak; less++; / (a[less++] = ak; >> >> random: 16371 / 16696 14018 / 14326 >> ascendant: 2706 / 2762 2884 / 2897 >> descendant: 2994 / 3108 3170 / 3258 >> organ pipes: 7073 / 7296 6939 / 7090 >> stagger(2): 7765 / 8069 7531 / 7731 >> period(1,2): 653 / 743 719 / 753 >> random(1..4): 2152 / 2234 1567 / 1591 >> >> If I change Test class and populate the array with descendant >> values, I still see difference in times: 4793 / 5718 >> see updated attached Test class. >> >> Also I'm attaching the latest version of DualPivotQuicksort >> with minor format changes. If you don't have comments, I'll >> ask to to integrate the code at the end of this week. >> >> Thank you, >> Vladimir >> >> Osvaldo Doederlein wrote: >>> Hi Vladimir, >>> >>> 2010/6/19 Vladimir Iaroslavski >> > >>> >>> Hello Osvaldo, >>> >>> I've prepared simple test which scans an array and does assignments >>> for each element, >>> see attached Test class: >>> >>> a[k] = a[less]; >>> a[less++] = 0; // or a[less] = 0; less++; >>> >>> The result of running "java -client Test" is: >>> >>> a[less], less++; Time: 6998 >>> a[less++]; Time: 8416 >>> >>> It is much more than 1%. Is it bug in JVM? Note that under server VM >>> >>> The amount of diff surely depends on the benchmark; your bench should >>> "zoom" the problem by not having much other work polluting the >>> measurement. But in my own test with b98 (32-bit), Q6600 CPU, I've >>> got 5065/5079, so the diff is < 1%. The excessive disadvantage you >>> report may be something bad in your older b84. >>> >>> Anyway I investigated the JIT-compiled code, details in the end (I've >>> split the benchmark in two classes just to make the comparison >>> simpler). The problem with "a[less++]" is that "less++" will first >>> increment "less", _then_ it will use the old value (not-incremented) >>> to index "a". C1 generates code that is equivalent to: >>> >>> int less_incremented = less + 1; >>> a[less] = 0; >>> less = less_incremented; >>> >>> ...which is a 1-to-1 translation of the IR coming off the bytecode. >>> C1 is not smart enough to see that the increment can be reordered >>> after the indexing, maybe because there's a data dependency as the >>> indexing uses "less"; but due to the semantics of postfix "++" this >>> dependency is for the before-increment value, so the reordering would >>> be safe. Maybe that's just some simple missing heuristics that could >>> be easily added? >>> >>> there is no difference between "a[less++]" and "a[less], less++". >>> >>> C2 generates completely different code,with 16X unrolling - this is >>> the inner loop: >>> >>> 0x026a6e40: pxor %xmm0,%xmm0 ;*aload_0 >>> ; - Test1::sort1 at 9 (line 23) >>> 0x026a6e44: movq %xmm0,0xc(%ecx,%esi,4) >>> 0x026a6e4a: movq %xmm0,0x14(%ecx,%esi,4) >>> 0x026a6e50: movq %xmm0,0x1c(%ecx,%esi,4) >>> 0x026a6e56: movq %xmm0,0x24(%ecx,%esi,4) >>> 0x026a6e5c: movq %xmm0,0x2c(%ecx,%esi,4) >>> 0x026a6e62: movq %xmm0,0x34(%ecx,%esi,4) >>> 0x026a6e68: movq %xmm0,0x3c(%ecx,%esi,4) >>> 0x026a6e6e: movq %xmm0,0x44(%ecx,%esi,4) ;*iastore >>> ; - Test1::sort1 at 21 (line 24) >>> 0x026a6e74: add $0x10,%esi ;*iinc >>> ; - Test1::sort1 at 22 (line 22) >>> 0x026a6e77: cmp %ebp,%esi >>> 0x026a6e79: jl 0x026a6e44 >>> >>> There is some extra slow-path code to fill the remaining 1...15 >>> elements if the loop length is not multiple of 16, and that's all. C2 >>> detects the redundancy between the "k" and "less" vars, and kills the >>> also-redundant "a[k] = a[less]" assignment so the net result is a >>> simple zero-fill of the array. Maybe a different benchmark without >>> these redundancies would make easier to see that C2 doesn't have a >>> problem with the postfix "++", but if it had, I think it wouldn't >>> reach the excellent result above. >>> >>> A+ >>> Osvaldo >>> >>> >>> I'm using JDK 7 on Windows XP: >>> >>> java version "1.7.0-ea" >>> Java(TM) SE Runtime Environment (build 1.7.0-ea-b84) >>> Java HotSpot(TM) Client VM (build 17.0-b09, mixed mode, sharing) >>> >>> Thanks, >>> Vladimir >>> >>> >>> >>> This is the C1 code for sort2()'s loop: >>> >>> 0x0251c1dc: cmp 0x8(%ecx),%esi ; implicit exception: >>> dispatches to 0x0251c21e >>> ;; 30 branch [AE] [RangeCheckStub: 0x454c640] [bci:13] >>> 0x0251c1df: jae 0x0251c24a >>> 0x0251c1e5: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; >>> ; - Test2::sort2 at 13 (line 23) >>> 0x0251c1e9: cmp 0x8(%ecx),%edi >>> ;; 36 branch [AE] [RangeCheckStub: 0x454c7e0] [bci:14] >>> 0x0251c1ec: jae 0x0251c263 >>> 0x0251c1f2: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; >>> ; - Test2::sort2 at 14 (line 23) >>> >>> (sort1/sort2 start to differ here) >>> >>> 0x0251c1f6: cmp 0x8(%ecx),%esi >>> ;; 42 branch [AE] [RangeCheckStub: 0x454c980] [bci:18] >>> 0x0251c1f9: jae 0x0251c27c >>> 0x0251c1ff: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less] = 0; >>> ; - Test2::sort2 at 18 (line 24) >>> 0x0251c207: inc %esi ; ++less; >>> 0x0251c208: inc %edi ; OopMap{ecx=Oop off=73} >>> ;*goto: for k++ >>> ; - Test2::sort2 at 25 (line 22) >>> 0x0251c209: test %eax,0x1a0100 ;*goto >>> ; - Test2::sort2 at 25 (line 22) >>> ; {poll} >>> ;; block B1 [4, 6] >>> >>> 0x0251c20f: cmp %edx,%edi >>> ;; 22 branch [LT] [B2] >>> 0x0251c211: jl 0x0251c1dc ;*if_icmpge: for k < right >>> ; - Test2::sort2 at 6 (line 22) >>> >>> The code looks OK; C1 doesn't do much optimization - no unrolling, >>> bounds check elimination - but it's otherwise just about the code you >>> would expect for a simple JITting. >>> Now, C1 code for sort1()'s loop: >>> >>> 0x024bc21c: cmp 0x8(%ecx),%esi ; implicit exception: >>> dispatches to 0x024bc262 >>> ;; 30 branch [AE] [RangeCheckStub: 0x44ee3b0] [bci:13] >>> 0x024bc21f: jae 0x024bc28e >>> 0x024bc225: mov 0xc(%ecx,%esi,4),%ebx ;*iaload: %ebx = a[less]; >>> ; - Test1::sort1 at 13 (line 23) >>> 0x024bc229: cmp 0x8(%ecx),%edi >>> ;; 36 branch [AE] [RangeCheckStub: 0x44ee550] [bci:14] >>> 0x024bc22c: jae 0x024bc2a7 >>> 0x024bc232: mov %ebx,0xc(%ecx,%edi,4) ;*iastore: a[k] = %ebx; >>> ; - Test1::sort1 at 14 (line 23) >>> >>> (sort1/sort2 start to differ here) >>> >>> 0x024bc236: mov %esi,%ebx ; Crap! C1 temps 'less' into >>> %ebx >>> 0x024bc238: inc %ebx ; ++less; (for the temp "less >>> from future") >>> >>> 0x024bc239: cmp 0x8(%ecx),%esi ; %esi is still the "old >>> less".... >>> ;; 46 branch [AE] [RangeCheckStub: 0x44ee7b8] [bci:21] >>> 0x024bc23c: jae 0x024bc2c0 >>> 0x024bc242: movl $0x0,0xc(%ecx,%esi,4) ;*iastore: a[less++] = 0; >>> ; - Test1::sort1 at 21 (line 24) >>> 0x024bc24a: inc %edi ; OopMap{ecx=Oop off=75} >>> ;*goto: for k++ >>> ; - Test1::sort1 at 25 (line 22) >>> 0x024bc24b: test %eax,0x1a0100 ; {poll} >>> 0x024bc251: mov %ebx,%esi ;*goto >>> ; - Test1::sort1 at 25 (line >>> 22): for... >>> ;; block B1 [4, 6] >>> >>> 0x024bc253: cmp %edx,%edi >>> ;; 22 branch [LT] [B2] >>> 0x024bc255: jl 0x024bc21c ;*if_icmpge >>> ; - Test1::sort1 at 6 (line 22): >>> for... From xueming.shen at oracle.com Tue Jun 22 16:19:27 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Tue, 22 Jun 2010 09:19:27 -0700 Subject: Test: test/sun/nio/cs Message-ID: <4C20E28F.9050307@oracle.com> Alan, Can you help review? (1)TestUTF8 This one is no longer reproducible, it passes on all platforms during the last several jprt runs. (2)FindDecoderBugs The only possible cause of its failure on a particular platform is timeout, this test takes long cpu time on slow machine. I tweak it a little, it runs about 30% faster now. It passes the last several jprt runs on all platforms. (3) TestX11CNS This test is not really necessary (it is useful when migration to new implementation) but I modified it to run and pass anyway. http://cr.openjdk.java.net/~sherman/test_cs/webrev/ Thanks, Sherman From Alan.Bateman at oracle.com Tue Jun 22 17:01:29 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Tue, 22 Jun 2010 18:01:29 +0100 Subject: Test: test/sun/nio/cs In-Reply-To: <4C20E28F.9050307@oracle.com> References: <4C20E28F.9050307@oracle.com> Message-ID: <4C20EC68.3080207@oracle.com> Xueming Shen wrote: > Alan, > > Can you help review? > > (1)TestUTF8 > This one is no longer reproducible, it passes on all platforms > during the last several jprt runs. > > (2)FindDecoderBugs > The only possible cause of its failure on a particular platform is > timeout, this test takes long cpu time > on slow machine. I tweak it a little, it runs about 30% faster now. > It passes the last several jprt runs > on all platforms. > > (3) TestX11CNS > This test is not really necessary (it is useful when migration to > new implementation) but I modified > it to run and pass anyway. > > http://cr.openjdk.java.net/~sherman/test_cs/webrev/ Speeding up FindDecoderBugs is good. Is the static equals method that you've added to the "Infrastructure" section used? TestX11CNS.getCharsets might consume an exception that we might want to see. Would it be better if it only returned null if UnsupportedCharsetException is thrown, and maybe have the test fail if there is another problem. Do you have cycles to take a pass over the sun/nio/cs tests to see if they could run in samevm mode? I think they are in batch jdk_nio3 at the moment and that test target currently runs in othervm mode. -Alan. From kelly.ohair at oracle.com Tue Jun 22 17:56:28 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Tue, 22 Jun 2010 17:56:28 +0000 Subject: hg: jdk7/tl/jdk: 6931871: Rebranding of javadoc generation in makefiles; ... Message-ID: <20100622175650.3761A47470@hg.openjdk.java.net> Changeset: dd98b0b747ec Author: ohair Date: 2010-06-22 10:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/dd98b0b747ec 6931871: Rebranding of javadoc generation in makefiles 6951293: control docs target does not work on windows Reviewed-by: jjg + make/common/shared/Defs-javadoc.gmk ! make/docs/Makefile From xueming.shen at oracle.com Tue Jun 22 18:24:48 2010 From: xueming.shen at oracle.com (xueming.shen at oracle.com) Date: Tue, 22 Jun 2010 18:24:48 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100622182506.9EEC447472@hg.openjdk.java.net> Changeset: d7fdaee81c14 Author: sherman Date: 2010-06-22 14:04 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/d7fdaee81c14 6963156: TEST_BUG: Several tests under sun/nio/cs failed Summary: Updated the test cases and removed them from ProblemList.txt Reviewed-by: alanb ! test/ProblemList.txt ! test/sun/nio/cs/FindDecoderBugs.java ! test/sun/nio/cs/TestX11CNS.java Changeset: 6fe3b86f4720 Author: sherman Date: 2010-06-22 14:22 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/6fe3b86f4720 Merge From kelly.ohair at oracle.com Tue Jun 22 21:13:20 2010 From: kelly.ohair at oracle.com (Kelly O'Hair) Date: Tue, 22 Jun 2010 14:13:20 -0700 Subject: Need reviewers: charsets.jar fix, JarReorder changes, Poller demo change Message-ID: <9F6AA6C9-A035-459F-B4D7-CAA11B028338@oracle.com> 6933622: Duplicate class files in rt.jar and charsets.jar 6895003: JarReorder is not excluding a requested file. 6939022: Source code adjustments for parfait compilation http://cr.openjdk.java.net/~ohair/openjdk7/jar-reorder/webrev/ The first two changes are related. Excluding items with JarReorder was not working if the item was also in the ordered classlist. Now excludes apply to the ordered classlist. This JarReorder problem is an old one, one which we also ran into when javax/crypto/SecretKey.class showed up in rt.jar even when it was excluded. This utility class has been cleaned up and hopefully is considered an improved version. The third fix is a minor change to Poller.c where the C macro ## operator was used on two quoted strings, which caused the Parfait tool some problems and is unncessary. These same changes will also be applied to OpenJDK6. -kto From daniel.daugherty at oracle.com Wed Jun 23 01:00:48 2010 From: daniel.daugherty at oracle.com (daniel.daugherty at oracle.com) Date: Wed, 23 Jun 2010 01:00:48 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100623010107.DB5FB47484@hg.openjdk.java.net> Changeset: 4e76be6e9fe1 Author: dcubed Date: 2010-06-22 10:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/4e76be6e9fe1 6942989: 2/2 Memory leak of java.lang.ref.WeakReference objects Summary: Use ReferenceQueues to manage WeakReferences in LogManager and Logger. Reviewed-by: dholmes, alanb, emcmanus, tonyp Contributed-by: jeremymanson at google.com ! src/share/classes/java/util/logging/LogManager.java ! src/share/classes/java/util/logging/Logger.java + test/java/util/logging/AnonLoggerWeakRefLeak.java + test/java/util/logging/AnonLoggerWeakRefLeak.sh + test/java/util/logging/LoggerWeakRefLeak.java + test/java/util/logging/LoggerWeakRefLeak.sh Changeset: 600ef8b4a211 Author: dcubed Date: 2010-06-22 16:18 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/600ef8b4a211 Merge From kelly.ohair at oracle.com Wed Jun 23 03:55:05 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Wed, 23 Jun 2010 03:55:05 +0000 Subject: hg: jdk7/tl/jdk: 3 new changesets Message-ID: <20100623035538.D18F94748D@hg.openjdk.java.net> Changeset: 25fe5c3bf7b7 Author: ohair Date: 2010-06-22 17:07 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/25fe5c3bf7b7 6939022: Source code adjustments for parfait compilation Reviewed-by: jjg ! src/solaris/demo/jni/Poller/Poller.c Changeset: 848e69fcf2f3 Author: ohair Date: 2010-06-22 17:26 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/848e69fcf2f3 6933622: Duplicate class files in rt.jar and charsets.jar 6895003: JarReorder is not excluding a requested file. Reviewed-by: jjg ! make/common/Release.gmk ! make/tools/src/build/tools/jarreorder/JarReorder.java ! test/ProblemList.txt Changeset: 3c745249065f Author: ohair Date: 2010-06-22 19:18 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3c745249065f Merge From xueming.shen at oracle.com Wed Jun 23 05:25:20 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Tue, 22 Jun 2010 22:25:20 -0700 Subject: Test: test/sun/nio/cs In-Reply-To: <4C20EC68.3080207@oracle.com> References: <4C20E28F.9050307@oracle.com> <4C20EC68.3080207@oracle.com> Message-ID: <4C219AC0.5060303@oracle.com> Alan Bateman wrote > > Do you have cycles to take a pass over the sun/nio/cs tests to see if > they could run in samevm mode? I think they are in batch jdk_nio3 at > the moment and that test target currently runs in othervm mode. > http://jprt-web.sfbay.sun.com/archive/2010/06/2010-06-22-183013.sherman.nio3_samevm/logs/ It appears the jdk_nio3 runs totally fine under samevm. Do you want me to change it to jdk_nio3? or you can piggyback into your change? either works for me. From Alan.Bateman at oracle.com Wed Jun 23 11:09:12 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Wed, 23 Jun 2010 12:09:12 +0100 Subject: Test: test/sun/nio/cs In-Reply-To: <4C219AC0.5060303@oracle.com> References: <4C20E28F.9050307@oracle.com> <4C20EC68.3080207@oracle.com> <4C219AC0.5060303@oracle.com> Message-ID: <4C21EB58.9010004@oracle.com> Xueming Shen wrote: > : > > It appears the jdk_nio3 runs totally fine under samevm. > > Do you want me to change it to jdk_nio3? or you can piggyback into > your change? either works for me. No problem, I'm switching batch jdk_nio2 to run in samevm mode and I can do jdk_nio3 while I'm there. My guess is that there are a few tests that will need to be fixed to work in samevm mode - for example, there is a test that changes the locale to Turkish but doesn't restore it. -Alan. From dmitry.samersoff at sun.com Wed Jun 23 13:29:43 2010 From: dmitry.samersoff at sun.com (dmitry.samersoff at sun.com) Date: Wed, 23 Jun 2010 13:29:43 +0000 Subject: hg: jdk7/tl/jdk: 6931566: NetworkInterface is not working when interface name is more than 15 characters long Message-ID: <20100623132957.CC314474A3@hg.openjdk.java.net> Changeset: 887e525597f8 Author: dsamersoff Date: 2010-06-23 17:25 +0400 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/887e525597f8 6931566: NetworkInterface is not working when interface name is more than 15 characters long Summary: Separate Linux and Solaris code, use lifreq under Solaris Reviewed-by: chegar ! src/solaris/native/java/net/NetworkInterface.c From alan.bateman at oracle.com Wed Jun 23 20:23:45 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Wed, 23 Jun 2010 20:23:45 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100623202426.85BB4474B5@hg.openjdk.java.net> Changeset: eb84b89ef3ff Author: alanb Date: 2010-06-23 20:19 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/eb84b89ef3ff 6963027: TEST_BUG: channels and buffer tests need to run in samevm mode Reviewed-by: ohair, sherman, chegar ! test/Makefile ! test/ProblemList.txt ! test/java/nio/BufferPoolMXBean/Basic.java ! test/java/nio/MappedByteBuffer/Basic.java ! test/java/nio/MappedByteBuffer/Force.java ! test/java/nio/MappedByteBuffer/ZeroMap.java ! test/java/nio/channels/AsynchronousChannelGroup/GroupOfOne.java ! test/java/nio/channels/AsynchronousChannelGroup/Identity.java ! test/java/nio/channels/AsynchronousDatagramChannel/Basic.java ! test/java/nio/channels/AsynchronousFileChannel/Basic.java ! test/java/nio/channels/AsynchronousFileChannel/Lock.java ! test/java/nio/channels/AsynchronousFileChannel/LotsOfWrites.java ! test/java/nio/channels/AsynchronousSocketChannel/Basic.java ! test/java/nio/channels/Channels/Basic2.java ! test/java/nio/channels/Channels/Write.java ! test/java/nio/channels/DatagramChannel/AdaptDatagramSocket.java ! test/java/nio/channels/DatagramChannel/EmptyBuffer.java ! test/java/nio/channels/DatagramChannel/ReceiveISA.java ! test/java/nio/channels/DatagramChannel/SelectWhenRefused.java ! test/java/nio/channels/FileChannel/Args.java ! test/java/nio/channels/FileChannel/ClosedChannelTransfer.java ! test/java/nio/channels/FileChannel/ExpandingMap.java ! test/java/nio/channels/FileChannel/Lock.java ! test/java/nio/channels/FileChannel/MapOverEnd.java ! test/java/nio/channels/FileChannel/MapReadOnly.java ! test/java/nio/channels/FileChannel/MapTest.java ! test/java/nio/channels/FileChannel/Mode.java ! test/java/nio/channels/FileChannel/Position.java ! test/java/nio/channels/FileChannel/Pread.java ! test/java/nio/channels/FileChannel/Pwrite.java ! test/java/nio/channels/FileChannel/Read.java ! test/java/nio/channels/FileChannel/ReadFull.java ! test/java/nio/channels/FileChannel/ReadToLimit.java ! test/java/nio/channels/FileChannel/ReleaseOnCloseDeadlock.java ! test/java/nio/channels/FileChannel/ScatteringRead.java ! test/java/nio/channels/FileChannel/Size.java ! test/java/nio/channels/FileChannel/Transfer.java ! test/java/nio/channels/FileChannel/TransferToChannel.java ! test/java/nio/channels/FileChannel/TransferToNonWritable.java ! test/java/nio/channels/FileChannel/Transfers.java ! test/java/nio/channels/FileChannel/TryLock.java ! test/java/nio/channels/FileChannel/Write.java ! test/java/nio/channels/Pipe/NonBlocking.java ! test/java/nio/channels/Pipe/SelectPipe.java ! test/java/nio/channels/SelectionKey/AtomicAttachTest.java ! test/java/nio/channels/Selector/BasicAccept.java ! test/java/nio/channels/Selector/BasicConnect.java ! test/java/nio/channels/Selector/CheckLocking.java ! test/java/nio/channels/Selector/CloseInvalidatesKeys.java ! test/java/nio/channels/Selector/CloseWhenKeyIdle.java ! test/java/nio/channels/Selector/Connect.java ! test/java/nio/channels/Selector/ConnectWrite.java ! test/java/nio/channels/Selector/HelperSlowToDie.java ! test/java/nio/channels/Selector/KeysReady.java ! test/java/nio/channels/Selector/LotsOfChannels.java ! test/java/nio/channels/Selector/RegAfterPreClose.java ! test/java/nio/channels/Selector/SelectAndCancel.java ! test/java/nio/channels/Selector/SelectorLimit.java ! test/java/nio/channels/Selector/SelectorTest.java ! test/java/nio/channels/Selector/WakeupNow.java ! test/java/nio/channels/Selector/WakeupOverflow.java ! test/java/nio/channels/Selector/WakeupSpeed.java - test/java/nio/channels/ServerSocketChannel/AcceptAddress.java ! test/java/nio/channels/SocketChannel/AdaptSocket.java ! test/java/nio/channels/SocketChannel/Bind.java ! test/java/nio/channels/SocketChannel/Close.java ! test/java/nio/channels/SocketChannel/CloseRegisteredChannel.java ! test/java/nio/channels/SocketChannel/CloseTimeoutChannel.java ! test/java/nio/channels/SocketChannel/IsConnectable.java ! test/java/nio/channels/SocketChannel/LocalAddress.java ! test/java/nio/channels/SocketChannel/SocketInheritance.java ! test/java/nio/channels/SocketChannel/Trivial.java ! test/java/nio/channels/SocketChannel/UnboundSocketTests.java ! test/java/nio/channels/etc/Shadow.java ! test/java/nio/channels/spi/SelectorProvider/inheritedChannel/ClosedStreams.java ! test/sun/nio/ch/Basic.java ! test/sun/nio/ch/TempBuffer.java ! test/sun/nio/cs/ReadZero.java ! test/sun/nio/cs/Test4206507.java ! test/sun/nio/cs/TestStringCoding.java Changeset: 55aa27b8bb98 Author: alanb Date: 2010-06-23 21:22 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/55aa27b8bb98 Merge From joe.darcy at oracle.com Thu Jun 24 00:06:06 2010 From: joe.darcy at oracle.com (joe.darcy at oracle.com) Date: Thu, 24 Jun 2010 00:06:06 +0000 Subject: hg: jdk7/tl/jdk: 6911258: Project Coin: Add essential API support for Automatic Resource Management (ARM) blocks; ... Message-ID: <20100624000625.73845474C6@hg.openjdk.java.net> Changeset: c4d60bcce958 Author: darcy Date: 2010-06-23 17:03 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/c4d60bcce958 6911258: Project Coin: Add essential API support for Automatic Resource Management (ARM) blocks 6911261: Project Coin: Retrofit Automatic Resource Management (ARM) support onto platform APIs 6962571: Infinite loop in printing out Throwable stack traces with circular references Reviewed-by: darcy, alanb Contributed-by: jjb at google.com ! make/java/java/FILES_java.gmk ! src/share/classes/java/io/Closeable.java + src/share/classes/java/lang/AutoCloseable.java ! src/share/classes/java/lang/Throwable.java ! src/share/classes/java/nio/channels/FileLock.java ! src/share/classes/javax/imageio/stream/ImageInputStream.java + test/java/lang/Throwable/SuppressedExceptions.java From joe.darcy at oracle.com Thu Jun 24 00:06:30 2010 From: joe.darcy at oracle.com (joe.darcy at oracle.com) Date: Thu, 24 Jun 2010 00:06:30 +0000 Subject: hg: jdk7/tl/langtools: 6911258: Project Coin: Add essential API support for Automatic Resource Management (ARM) blocks Message-ID: <20100624000633.7862F474C7@hg.openjdk.java.net> Changeset: be5cafeb318d Author: darcy Date: 2010-06-23 16:51 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/be5cafeb318d 6911258: Project Coin: Add essential API support for Automatic Resource Management (ARM) blocks Reviewed-by: darcy, alanb Contributed-by: jjb at google.com ! src/share/classes/javax/lang/model/element/ElementKind.java From martinrb at google.com Thu Jun 24 01:15:12 2010 From: martinrb at google.com (Martin Buchholz) Date: Wed, 23 Jun 2010 18:15:12 -0700 Subject: Test: test/sun/nio/cs In-Reply-To: <4C20EC68.3080207@oracle.com> References: <4C20E28F.9050307@oracle.com> <4C20EC68.3080207@oracle.com> Message-ID: On Tue, Jun 22, 2010 at 10:01, Alan Bateman wrote: > Xueming Shen wrote: >> >> (2)FindDecoderBugs >> ? The only possible cause of its failure on a particular platform is >> timeout, this test takes long cpu time >> ? on slow machine. I tweak it a little, it runs about 30% faster now. It >> passes the last several jprt runs >> ? on all platforms. FindDecoderBugs was a very useful test, but IIRC the 5-minute runtime is overkill for finding regressions, and you can't exhaustively test all possible byte sequences anyways. It should be possible to use my pet strategy of generating a random subset of interesting byte sequences, testExhaustively(prefix, 1); testExhaustively(prefix, 2); // Can you spare a week of CPU time? // testExhaustively(cs, tester, prefix, 3); testRandomly(prefix, 3); testRandomly(prefix, 4); so the test could have a 10-second mode and a 10-minute mode. But I'm not volunteering. BTW, Thank y'all very much for making these test robustness improvements. They are appreciated. Martin From weijun.wang at sun.com Thu Jun 24 06:27:29 2010 From: weijun.wang at sun.com (weijun.wang at sun.com) Date: Thu, 24 Jun 2010 06:27:29 +0000 Subject: hg: jdk7/tl/jdk: 3 new changesets Message-ID: <20100624062806.9A4C3474DC@hg.openjdk.java.net> Changeset: 706e2d1fc378 Author: weijun Date: 2010-06-24 14:26 +0800 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/706e2d1fc378 6958026: Problem with PKCS12 keystore Reviewed-by: mullan ! src/share/classes/sun/security/pkcs12/PKCS12KeyStore.java + test/sun/security/pkcs12/PKCS12SameKeyId.java Changeset: 1da7dfca3e20 Author: weijun Date: 2010-06-24 14:26 +0800 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/1da7dfca3e20 6844907: krb5 etype order should be from strong to weak Reviewed-by: valeriep ! src/share/classes/sun/security/krb5/Credentials.java ! src/share/classes/sun/security/krb5/internal/crypto/EType.java ! src/share/classes/sun/security/krb5/internal/ktab/KeyTab.java + test/sun/security/krb5/etype/ETypeOrder.java ! test/sun/security/krb5/ktab/HighestKvno.java Changeset: 9c0f542c8b37 Author: weijun Date: 2010-06-24 14:26 +0800 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/9c0f542c8b37 6946669: SSL/Krb5 should not call EncryptedData.reset(data, false) Reviewed-by: xuelei ! src/share/classes/sun/security/krb5/EncryptedData.java ! src/share/classes/sun/security/krb5/KrbApRep.java ! src/share/classes/sun/security/krb5/KrbApReq.java ! src/share/classes/sun/security/krb5/KrbAsRep.java ! src/share/classes/sun/security/krb5/KrbCred.java ! src/share/classes/sun/security/krb5/KrbPriv.java ! src/share/classes/sun/security/krb5/KrbTgsRep.java ! src/share/classes/sun/security/ssl/krb5/KerberosClientKeyExchangeImpl.java ! src/share/classes/sun/security/ssl/krb5/KerberosPreMasterSecret.java ! test/sun/security/krb5/auto/SSL.java From kelly.ohair at oracle.com Thu Jun 24 15:53:09 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Thu, 24 Jun 2010 15:53:09 +0000 Subject: hg: jdk7/tl/jaxp: 6963941: Correct download link for source drop bundle Message-ID: <20100624155309.F244A474F3@hg.openjdk.java.net> Changeset: 34ed99f84832 Author: ohair Date: 2010-06-24 08:34 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/34ed99f84832 6963941: Correct download link for source drop bundle Reviewed-by: darcy ! jaxp.properties From jonathan.gibbons at oracle.com Thu Jun 24 17:35:34 2010 From: jonathan.gibbons at oracle.com (jonathan.gibbons at oracle.com) Date: Thu, 24 Jun 2010 17:35:34 +0000 Subject: hg: jdk7/tl/langtools: 6917288: Unnamed nested class is not generated Message-ID: <20100624173537.92196474F7@hg.openjdk.java.net> Changeset: d8a15fda7e3a Author: jjg Date: 2010-06-24 10:34 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/d8a15fda7e3a 6917288: Unnamed nested class is not generated Reviewed-by: mcimadamore ! src/share/classes/com/sun/tools/javac/comp/Lower.java + test/tools/javac/6917288/GraphicalInstaller.java + test/tools/javac/6917288/GraphicalInstallerTest.java + test/tools/javac/6917288/T6917288.java From kelly.ohair at oracle.com Thu Jun 24 23:51:43 2010 From: kelly.ohair at oracle.com (Kelly O'Hair) Date: Thu, 24 Jun 2010 16:51:43 -0700 Subject: Need reviewer: regression in control builds, workaround fix Message-ID: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> Joe, Looks like I need to undo the removal of the sun/nio/cs/ext classes from rt.jar (they supposedly belonged in charsets.jar). Control builds of jdk7-tl are broken. Apparently in the short time that they have been in jdk7 rt.jar, we seem to have created a dependency on some of the sun/nio/cs/ext classes that we did not have before. The build error happens when CreateSymbols is run during the jdk images creation, missing class sun.nio.cs.ext.DoubleByte. When doing a control build, this is a run of the bootstrap langtools javac.jar, and charsets.jar is not in the classpath. The error looks like: error: sun.nio.cs.ext.DoubleByte.Encoder: class file for sun.nio.cs.ext.DoubleByte not found error: class file for sun.nio.cs.ext.DoubleByte not found 1 error gmake[3]: *** [initial-image-jdk] Error 1 gmake[3]: Leaving directory `/tmp/jprt/P1/B/153854.ohair/source/jdk/ make' gmake[2]: *** [jdk-build] Error 2 A workaround fix is to reverse the change I made to explicitly exclude the sun/nio/cs/ext classes from rt.jar: --------------------- diff --git a/make/common/Release.gmk b/make/common/Release.gmk --- a/make/common/Release.gmk +++ b/make/common/Release.gmk @@ -549,7 +549,6 @@ ###################################################### # List of directories in classes directory that should NOT be in rt.jar -# sun/nio/cs/ext/ will go into charsets.jar ###################################################### NOT_RT_JAR_LIST = $(ABS_TEMPDIR)/not_rt_jar.list @@ -572,7 +571,6 @@ $(ECHO) "META-INF/services/com.sun.tools.xjc.Plugin" >> $@ $(ECHO) "com/sun/tools/" >> $@ $(ECHO) "sun/jvmstat/" >> $@ - $(ECHO) "sun/nio/cs/ext/" >> $@ $(ECHO) "sun/rmi/rmic/" >> $@ $(ECHO) "sun/tools/asm/" >> $@ $(ECHO) "sun/tools/java/" >> $@ ----------------------- I'm not exactly sure what the right fix is here, or if the real fix is to track down the change that added in the new dependence and remove that dependence. Any help anyone can provide, especially charsets.jar experts would be welcome. -kto From joe.darcy at oracle.com Fri Jun 25 06:12:44 2010 From: joe.darcy at oracle.com (Joe Darcy) Date: Thu, 24 Jun 2010 23:12:44 -0700 Subject: Need reviewer: regression in control builds, workaround fix In-Reply-To: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> References: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> Message-ID: <4C2448DC.6000602@oracle.com> Hi Kelly. I don't know what the right fix is either; however, I'd support putting the sun/nio/cs/ext classes back into rt.jar to fix the build issue while the longer-term fix was being investigated. -Joe Kelly O'Hair wrote: > Joe, > > Looks like I need to undo the removal of the sun/nio/cs/ext classes > from rt.jar > (they supposedly belonged in charsets.jar). Control builds of jdk7-tl > are broken. > > Apparently in the short time that they have been in jdk7 rt.jar, we > seem to have > created a dependency on some of the sun/nio/cs/ext classes that we did > not have before. > > The build error happens when CreateSymbols is run during the jdk > images creation, > missing class sun.nio.cs.ext.DoubleByte. When doing a control build, > this is a run > of the bootstrap langtools javac.jar, and charsets.jar is not in the > classpath. > > The error looks like: > > error: sun.nio.cs.ext.DoubleByte.Encoder: class file for > sun.nio.cs.ext.DoubleByte not found > error: class file for sun.nio.cs.ext.DoubleByte not found 1 error > gmake[3]: *** [initial-image-jdk] Error 1 > gmake[3]: Leaving directory `/tmp/jprt/P1/B/153854.ohair/source/jdk/make' > gmake[2]: *** [jdk-build] Error 2 > > A workaround fix is to reverse the change I made to explicitly exclude > the sun/nio/cs/ext > classes from rt.jar: > > --------------------- > diff --git a/make/common/Release.gmk b/make/common/Release.gmk > --- a/make/common/Release.gmk > +++ b/make/common/Release.gmk > @@ -549,7 +549,6 @@ > > ###################################################### > # List of directories in classes directory that should NOT be in rt.jar > -# sun/nio/cs/ext/ will go into charsets.jar > ###################################################### > > NOT_RT_JAR_LIST = $(ABS_TEMPDIR)/not_rt_jar.list > @@ -572,7 +571,6 @@ > $(ECHO) "META-INF/services/com.sun.tools.xjc.Plugin" >> $@ > $(ECHO) "com/sun/tools/" >> $@ > $(ECHO) "sun/jvmstat/" >> $@ > - $(ECHO) "sun/nio/cs/ext/" >> $@ > $(ECHO) "sun/rmi/rmic/" >> $@ > $(ECHO) "sun/tools/asm/" >> $@ > $(ECHO) "sun/tools/java/" >> $@ > ----------------------- > > I'm not exactly sure what the right fix is here, or if the real fix is > to track down the > change that added in the new dependence and remove that dependence. > Any help anyone can provide, especially charsets.jar experts would be > welcome. > > -kto > From Alan.Bateman at oracle.com Fri Jun 25 11:20:26 2010 From: Alan.Bateman at oracle.com (Alan Bateman) Date: Fri, 25 Jun 2010 12:20:26 +0100 Subject: Need reviewer: regression in control builds, workaround fix In-Reply-To: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> References: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> Message-ID: <4C2490FA.8090305@oracle.com> Kelly O'Hair wrote: > Joe, > > Looks like I need to undo the removal of the sun/nio/cs/ext classes > from rt.jar > (they supposedly belonged in charsets.jar). Control builds of jdk7-tl > are broken. I agree that backing this out for now is the right thing to do. Also, it might not matter anyway because once we move to a modular JDK then the legacy image and rt.jar goes away. -Alan. From Ulf.Zibis at gmx.de Fri Jun 25 12:28:34 2010 From: Ulf.Zibis at gmx.de (Ulf Zibis) Date: Fri, 25 Jun 2010 14:28:34 +0200 Subject: Need reviewer: regression in control builds, workaround fix In-Reply-To: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> References: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> Message-ID: <4C24A0F2.7020901@gmx.de> The reason seems to be, that HKSCS is in rt.jar (build b84), which should not be there: rt.jar!sun.nio.cs.ext.png Anyway, shouldn't sun.nio.cs.ext be completely in charsets.jar ? Sherman ? -Ulf Am 25.06.2010 01:51, schrieb Kelly O'Hair: > Joe, > > Looks like I need to undo the removal of the sun/nio/cs/ext classes > from rt.jar > (they supposedly belonged in charsets.jar). Control builds of jdk7-tl > are broken. > > Apparently in the short time that they have been in jdk7 rt.jar, we > seem to have > created a dependency on some of the sun/nio/cs/ext classes that we did > not have before. > > The build error happens when CreateSymbols is run during the jdk > images creation, > missing class sun.nio.cs.ext.DoubleByte. When doing a control build, > this is a run > of the bootstrap langtools javac.jar, and charsets.jar is not in the > classpath. > > The error looks like: > > error: sun.nio.cs.ext.DoubleByte.Encoder: class file for > sun.nio.cs.ext.DoubleByte not found > error: class file for sun.nio.cs.ext.DoubleByte not found 1 error > gmake[3]: *** [initial-image-jdk] Error 1 > gmake[3]: Leaving directory `/tmp/jprt/P1/B/153854.ohair/source/jdk/make' > gmake[2]: *** [jdk-build] Error 2 > > A workaround fix is to reverse the change I made to explicitly exclude > the sun/nio/cs/ext > classes from rt.jar: > > --------------------- > diff --git a/make/common/Release.gmk b/make/common/Release.gmk > --- a/make/common/Release.gmk > +++ b/make/common/Release.gmk > @@ -549,7 +549,6 @@ > > ###################################################### > # List of directories in classes directory that should NOT be in rt.jar > -# sun/nio/cs/ext/ will go into charsets.jar > ###################################################### > > NOT_RT_JAR_LIST = $(ABS_TEMPDIR)/not_rt_jar.list > @@ -572,7 +571,6 @@ > $(ECHO) "META-INF/services/com.sun.tools.xjc.Plugin" >> $@ > $(ECHO) "com/sun/tools/" >> $@ > $(ECHO) "sun/jvmstat/" >> $@ > - $(ECHO) "sun/nio/cs/ext/" >> $@ > $(ECHO) "sun/rmi/rmic/" >> $@ > $(ECHO) "sun/tools/asm/" >> $@ > $(ECHO) "sun/tools/java/" >> $@ > ----------------------- > > I'm not exactly sure what the right fix is here, or if the real fix is > to track down the > change that added in the new dependence and remove that dependence. > Any help anyone can provide, especially charsets.jar experts would be > welcome. > > -kto > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: rt.jar!sun.nio.cs.ext.png Type: image/png Size: 5839 bytes Desc: not available URL: From kelly.ohair at oracle.com Fri Jun 25 15:45:24 2010 From: kelly.ohair at oracle.com (kelly.ohair at oracle.com) Date: Fri, 25 Jun 2010 15:45:24 +0000 Subject: hg: jdk7/tl/jdk: 6964311: Build regression due to rt.jar contents change Message-ID: <20100625154543.83F804752B@hg.openjdk.java.net> Changeset: 2e9ef9a80d82 Author: ohair Date: 2010-06-25 08:44 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/2e9ef9a80d82 6964311: Build regression due to rt.jar contents change Summary: The fix for 6933622 regressed control builds, this is a workaround fix, filed 6964313 to find the right answer to why it happened and how to fix it correctly. Reviewed-by: alanb, darcy ! make/common/Release.gmk From alan.bateman at oracle.com Fri Jun 25 17:34:44 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Fri, 25 Jun 2010 17:34:44 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100625173504.0858047530@hg.openjdk.java.net> Changeset: 6bf403a14da4 Author: alanb Date: 2010-06-25 18:31 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/6bf403a14da4 6963828: TEST_BUG: java/nio/channels/FileTransfer.java takes too long (win) Reviewed-by: chegar ! test/java/nio/channels/FileChannel/Transfer.java Changeset: 0995c5a2dc6d Author: alanb Date: 2010-06-25 18:34 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/0995c5a2dc6d Merge From xueming.shen at oracle.com Fri Jun 25 17:32:04 2010 From: xueming.shen at oracle.com (Xueming Shen) Date: Fri, 25 Jun 2010 10:32:04 -0700 Subject: Need reviewer: regression in control builds, workaround fix In-Reply-To: <4C24A0F2.7020901@gmx.de> References: <54F6D303-D83C-42CF-9596-8F38CFE7077E@oracle.com> <4C24A0F2.7020901@gmx.de> Message-ID: <4C24E814.5040307@oracle.com> yes. sun.nio.cs.ext should be completely in charsets.jar. Ulf Zibis wrote: > The reason seems to be, that HKSCS is in rt.jar (build b84), which > should not be there: > > rt.jar!sun.nio.cs.ext.png > > Anyway, shouldn't sun.nio.cs.ext be completely in charsets.jar ? Sherman ? > > -Ulf > > > Am 25.06.2010 01:51, schrieb Kelly O'Hair: >> Joe, >> >> Looks like I need to undo the removal of the sun/nio/cs/ext classes >> from rt.jar >> (they supposedly belonged in charsets.jar). Control builds of jdk7-tl >> are broken. >> >> Apparently in the short time that they have been in jdk7 rt.jar, we >> seem to have >> created a dependency on some of the sun/nio/cs/ext classes that we >> did not have before. >> >> The build error happens when CreateSymbols is run during the jdk >> images creation, >> missing class sun.nio.cs.ext.DoubleByte. When doing a control build, >> this is a run >> of the bootstrap langtools javac.jar, and charsets.jar is not in the >> classpath. >> >> The error looks like: >> >> error: sun.nio.cs.ext.DoubleByte.Encoder: class file for >> sun.nio.cs.ext.DoubleByte not found >> error: class file for sun.nio.cs.ext.DoubleByte not found 1 error >> gmake[3]: *** [initial-image-jdk] Error 1 >> gmake[3]: Leaving directory >> `/tmp/jprt/P1/B/153854.ohair/source/jdk/make' >> gmake[2]: *** [jdk-build] Error 2 >> >> A workaround fix is to reverse the change I made to explicitly >> exclude the sun/nio/cs/ext >> classes from rt.jar: >> >> --------------------- >> diff --git a/make/common/Release.gmk b/make/common/Release.gmk >> --- a/make/common/Release.gmk >> +++ b/make/common/Release.gmk >> @@ -549,7 +549,6 @@ >> >> ###################################################### >> # List of directories in classes directory that should NOT be in rt.jar >> -# sun/nio/cs/ext/ will go into charsets.jar >> ###################################################### >> >> NOT_RT_JAR_LIST = $(ABS_TEMPDIR)/not_rt_jar.list >> @@ -572,7 +571,6 @@ >> $(ECHO) "META-INF/services/com.sun.tools.xjc.Plugin" >> $@ >> $(ECHO) "com/sun/tools/" >> $@ >> $(ECHO) "sun/jvmstat/" >> $@ >> - $(ECHO) "sun/nio/cs/ext/" >> $@ >> $(ECHO) "sun/rmi/rmic/" >> $@ >> $(ECHO) "sun/tools/asm/" >> $@ >> $(ECHO) "sun/tools/java/" >> $@ >> ----------------------- >> >> I'm not exactly sure what the right fix is here, or if the real fix >> is to track down the >> change that added in the new dependence and remove that dependence. >> Any help anyone can provide, especially charsets.jar experts would be >> welcome. >> >> -kto >> >> >> From chris.hegarty at oracle.com Mon Jun 28 14:07:50 2010 From: chris.hegarty at oracle.com (chris.hegarty at oracle.com) Date: Mon, 28 Jun 2010 14:07:50 +0000 Subject: hg: jdk7/tl/jdk: 2 new changesets Message-ID: <20100628140830.99F62475D2@hg.openjdk.java.net> Changeset: 6d274503d1b7 Author: chegar Date: 2010-06-28 14:55 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/6d274503d1b7 6954525: Testcase failure java/net/Authenticator/B4769350.java Reviewed-by: michaelm, weijun ! src/share/classes/sun/net/www/protocol/http/HttpURLConnection.java ! test/java/net/Authenticator/B4769350.java Changeset: a89f8c292a5b Author: chegar Date: 2010-06-28 15:06 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/a89f8c292a5b Merge From jon.vanalten at redhat.com Mon Jun 28 14:14:15 2010 From: jon.vanalten at redhat.com (jon.vanalten at redhat.com) Date: Mon, 28 Jun 2010 10:14:15 -0400 (EDT) Subject: System.currentTimeMillis check in System class during startup. In-Reply-To: <657098512.1307631277734326583.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> Message-ID: <1230826613.1308071277734455496.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> Hello all, We've been having a discussion on the downstream IcedTea bugzilla about a potential jdk bug, and it seems prudent to bring it up here. Link: http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=394 Please ignore discussion there RE 32-bit *nix time overflow in 2038; this is a glibc issue that Java cannot resolve. What I am more concerned about is the complete incompatibility with any negative currentTimeMillis() return value. TL/DR: System class does a (currentTimeMillis() > 0) check as part of method that only exists to avoid inlining of the initial null assignment of the in/out/err streams. So, if system time is before January 1, 1970, java will not start. The bug reporter has given several potential use cases where this could occur (summary in comment 14 of bug report). In my opinion, this is a bug. The comment preceding the methods in which this check occurs indicate that it is only to prevent inlining; Java should not, IMO, care whether the system clock is set to 2367CE, 2010, or 42BCE. Provided, of course, that the date falls within the 64 bit signed long value that the currentTimeMillis() method returns. In other words, I think that Java should not be concerned with whether the system clock is in sync with real world time. I've tried changing the check to (currentTimeMillis() >= Long.MIN_VALUE), to maintain the prevention of inlining while allowing startup to proceed. Patch attached. This seems to work, in that when system clock is before 1970 a program can actually start up. There does not seem to be unwanted side effects when running a few simple programs, although I have not done any real regression testing. Is this something that others think should be fixed in the JDK? Or are Java users ultimately required to ensure that their system clock is set accurately (and they are not time travelling hehe)? Related: I've been looking through other use of currentTimeMillis() throughout the JDK, and I've found a few other places where there seem to be assumptions made about the approximate expected return value. If others are of the same opinion that Java should be agnostic about what a "sensible" system time should be, then I'll summarize my findings in a future post. Your thoughts are appreciated. cheers, jon -------------- next part -------------- A non-text attachment was scrubbed... Name: pre1970-system-init.patch Type: text/x-patch Size: 894 bytes Desc: not available URL: From chris.hegarty at oracle.com Mon Jun 28 19:53:50 2010 From: chris.hegarty at oracle.com (chris.hegarty at oracle.com) Date: Mon, 28 Jun 2010 19:53:50 +0000 Subject: hg: jdk7/tl/jdk: 6961029: java/net/BindException/Test.java should not use wildcard address Message-ID: <20100628195427.0588E475DF@hg.openjdk.java.net> Changeset: 7c3da1f0e17c Author: chegar Date: 2010-06-28 20:52 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/7c3da1f0e17c 6961029: java/net/BindException/Test.java should not use wildcard address Reviewed-by: michaelm, alanb ! test/ProblemList.txt ! test/java/net/BindException/Test.java ! test/java/net/ipv6tests/Tests.java From kumar.x.srinivasan at oracle.com Tue Jun 29 01:25:32 2010 From: kumar.x.srinivasan at oracle.com (kumar.x.srinivasan at oracle.com) Date: Tue, 29 Jun 2010 01:25:32 +0000 Subject: hg: jdk7/tl/jdk: 6856415: Enabling java security manager will make programe thrown wrong exception ( main method not found ) Message-ID: <20100629012541.86C0A475ED@hg.openjdk.java.net> Changeset: a9e0a6fb6057 Author: ksrini Date: 2010-06-28 18:25 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/a9e0a6fb6057 6856415: Enabling java security manager will make programe thrown wrong exception ( main method not found ) Reviewed-by: darcy ! src/share/classes/sun/launcher/LauncherHelper.java + test/tools/launcher/VerifyExceptions.java From martinrb at google.com Tue Jun 29 01:49:56 2010 From: martinrb at google.com (Martin Buchholz) Date: Mon, 28 Jun 2010 18:49:56 -0700 Subject: System.currentTimeMillis check in System class during startup. In-Reply-To: <1230826613.1308071277734455496.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> References: <657098512.1307631277734326583.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> <1230826613.1308071277734455496.JavaMail.root@zmail01.collab.prod.int.phx2.redhat.com> Message-ID: It's not at all clear that one cannot solve the y2038 problem on systems with a 32-bit time_t. That's what Michael Schwern is trying to do here: http://code.google.com/p/y2038/ His code is available. The JDK should find some other anti-inlining technique. The code should be agnostic about the current time, as suggested. Martin On Mon, Jun 28, 2010 at 07:14, wrote: > Hello all, > > We've been having a discussion on the downstream IcedTea bugzilla about a potential jdk bug, and it seems prudent to bring it up here. ?Link: > > http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=394 > > Please ignore discussion there RE 32-bit *nix time overflow in 2038; this is a glibc issue that Java cannot resolve. ?What I am more concerned about is the complete incompatibility with any negative currentTimeMillis() return value. > > TL/DR: System class does a (currentTimeMillis() > 0) check as part of method that only exists to avoid inlining of the initial null assignment of the in/out/err streams. ?So, if system time is before January 1, 1970, java will not start. ?The bug reporter has given several potential use cases where this could occur (summary in comment 14 of bug report). > > In my opinion, this is a bug. ?The comment preceding the methods in which this check occurs indicate that it is only to prevent inlining; Java should not, IMO, care whether the system clock is set to 2367CE, 2010, or 42BCE. ?Provided, of course, that the date falls within the 64 bit signed long value that the currentTimeMillis() method returns. ?In other words, I think that Java should not be concerned with whether the system clock is in sync with real world time. > > I've tried changing the check to (currentTimeMillis() >= Long.MIN_VALUE), to maintain the prevention of inlining while allowing startup to proceed. ?Patch attached. ?This seems to work, in that when system clock is before 1970 a program can actually start up. ?There does not seem to be unwanted side effects when running a few simple programs, although I have not done any real regression testing. > > Is this something that others think should be fixed in the JDK? ?Or are Java users ultimately required to ensure that their system clock is set accurately (and they are not time travelling hehe)? > > Related: I've been looking through other use of currentTimeMillis() throughout the JDK, and I've found a few other places where there seem to be assumptions made about the approximate expected return value. ?If others are of the same opinion that Java should be agnostic about what a "sensible" system time should be, then I'll summarize my findings in a future post. > > Your thoughts are appreciated. > > cheers, > > jon From alan.bateman at oracle.com Tue Jun 29 16:12:23 2010 From: alan.bateman at oracle.com (alan.bateman at oracle.com) Date: Tue, 29 Jun 2010 16:12:23 +0000 Subject: hg: jdk7/tl/jdk: 6213702: (so) non-blocking sockets with TCP urgent disabled get still selected for read ops (win) Message-ID: <20100629161243.3807D47614@hg.openjdk.java.net> Changeset: 5c5fe62d990d Author: alanb Date: 2010-06-29 17:11 +0100 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/5c5fe62d990d 6213702: (so) non-blocking sockets with TCP urgent disabled get still selected for read ops (win) Reviewed-by: michaelm, chegar ! src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java ! src/windows/native/sun/nio/ch/WindowsSelectorImpl.c + test/java/nio/channels/Selector/OutOfBand.java From lana.steuck at oracle.com Tue Jun 29 20:53:15 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Tue, 29 Jun 2010 20:53:15 +0000 Subject: hg: jdk7/tl: 5 new changesets Message-ID: <20100629205315.B4D6F47620@hg.openjdk.java.net> Changeset: 39d81b90b100 Author: prr Date: 2010-06-16 09:41 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/39d81b90b100 6961079: Build JDK7 for 64 bit Windows using free Windows 7.1 SDK 64 bit compilers Reviewed-by: ohair, jcoomes ! README-builds.html Changeset: 6cea9984d73d Author: mikejwre Date: 2010-06-16 15:48 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/6cea9984d73d Merge Changeset: e7f18db469a3 Author: mikejwre Date: 2010-06-17 16:27 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/e7f18db469a3 Added tag jdk7-b98 for changeset 6cea9984d73d ! .hgtags Changeset: dc900d5a8e2f Author: mikejwre Date: 2010-06-24 20:02 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/dc900d5a8e2f Added tag jdk7-b99 for changeset e7f18db469a3 ! .hgtags Changeset: a191e79df156 Author: lana Date: 2010-06-29 10:48 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/rev/a191e79df156 Merge From lana.steuck at oracle.com Tue Jun 29 20:53:19 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Tue, 29 Jun 2010 20:53:19 +0000 Subject: hg: jdk7/tl/corba: 3 new changesets Message-ID: <20100629205322.8493747621@hg.openjdk.java.net> Changeset: 95db968660e7 Author: mikejwre Date: 2010-06-17 16:27 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/95db968660e7 Added tag jdk7-b98 for changeset 3b99409057e4 ! .hgtags Changeset: ad2aa1f66abf Author: mikejwre Date: 2010-06-24 20:02 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/ad2aa1f66abf Added tag jdk7-b99 for changeset 95db968660e7 ! .hgtags Changeset: 03fd3d78e344 Author: lana Date: 2010-06-29 10:48 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/corba/rev/03fd3d78e344 Merge From lana.steuck at oracle.com Tue Jun 29 20:55:54 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Tue, 29 Jun 2010 20:55:54 +0000 Subject: hg: jdk7/tl/hotspot: 41 new changesets Message-ID: <20100629205715.57BB047622@hg.openjdk.java.net> Changeset: 70191885f707 Author: prr Date: 2010-06-16 09:42 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/70191885f707 6961079: Build JDK7 for 64 bit Windows using free Windows 7.1 SDK 64 bit compilers Reviewed-by: ohair, jcoomes ! make/windows/makefiles/defs.make Changeset: 8a045b3f5c13 Author: mikejwre Date: 2010-06-16 15:48 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/8a045b3f5c13 Merge Changeset: 695c43156a9a Author: mikejwre Date: 2010-06-17 16:27 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/695c43156a9a Added tag jdk7-b98 for changeset 8a045b3f5c13 ! .hgtags Changeset: e40a3601bc1f Author: kamg Date: 2010-05-19 10:19 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/e40a3601bc1f 6911922: JVM must throw VerifyError for jsr or jsr_w opcodes in class file v.51+ 6693236: A class file whose version number is greater than to 50.0 must be verified using the typechecker Summary: Disable failover verification for classfiles >= v51 Reviewed-by: never, acorn, dholmes ! src/share/vm/classfile/verifier.cpp Changeset: 3548f3198dca Author: dcubed Date: 2010-05-26 14:16 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/3548f3198dca Merge Changeset: dfe27f03244a Author: trims Date: 2010-06-01 11:48 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/dfe27f03244a Merge ! src/share/vm/classfile/verifier.cpp Changeset: 1a5913bf5e19 Author: twisti Date: 2010-05-20 06:34 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob Summary: This moves the oops from Codeblob to nmethod. Reviewed-by: kvn, never ! agent/src/share/classes/sun/jvm/hotspot/code/CodeBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/PointerFinder.java ! src/cpu/sparc/vm/nativeInst_sparc.cpp ! src/os/solaris/dtrace/generateJvmOffsets.cpp ! src/os/solaris/dtrace/libjvm_db.c ! src/share/vm/asm/codeBuffer.hpp ! src/share/vm/code/codeBlob.cpp ! src/share/vm/code/codeBlob.hpp ! src/share/vm/code/codeCache.cpp ! src/share/vm/code/compiledIC.cpp ! src/share/vm/code/nmethod.cpp ! src/share/vm/code/nmethod.hpp ! src/share/vm/code/oopRecorder.cpp ! src/share/vm/code/oopRecorder.hpp ! src/share/vm/code/relocInfo.cpp ! src/share/vm/code/relocInfo.hpp ! src/share/vm/memory/iterator.cpp ! src/share/vm/runtime/sharedRuntime.cpp ! src/share/vm/runtime/vmStructs.cpp Changeset: 61b2245abf36 Author: twisti Date: 2010-05-21 02:59 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/61b2245abf36 6930772: JSR 292 needs to support SPARC C1 Summary: C1 for SPARC needs to support JSR 292. Reviewed-by: never, jrose ! src/cpu/sparc/vm/assembler_sparc.hpp ! src/cpu/sparc/vm/c1_FrameMap_sparc.cpp ! src/cpu/sparc/vm/c1_FrameMap_sparc.hpp ! src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp ! src/cpu/sparc/vm/c1_Runtime1_sparc.cpp ! src/cpu/sparc/vm/frame_sparc.cpp ! src/cpu/sparc/vm/methodHandles_sparc.cpp ! src/cpu/sparc/vm/register_definitions_sparc.cpp ! src/cpu/sparc/vm/sharedRuntime_sparc.cpp ! src/cpu/sparc/vm/stubGenerator_sparc.cpp ! src/cpu/sparc/vm/stubRoutines_sparc.hpp ! src/cpu/x86/vm/assembler_x86.hpp ! src/cpu/x86/vm/c1_FrameMap_x86.cpp ! src/cpu/x86/vm/c1_FrameMap_x86.hpp ! src/cpu/x86/vm/c1_LIRAssembler_x86.cpp ! src/cpu/x86/vm/c1_Runtime1_x86.cpp ! src/cpu/x86/vm/register_definitions_x86.cpp ! src/share/vm/c1/c1_FrameMap.hpp ! src/share/vm/c1/c1_IR.cpp ! src/share/vm/c1/c1_IR.hpp ! src/share/vm/c1/c1_LIR.cpp ! src/share/vm/c1/c1_LIR.hpp ! src/share/vm/c1/c1_LIRAssembler.cpp ! src/share/vm/c1/c1_LIRAssembler.hpp ! src/share/vm/c1/c1_LIRGenerator.cpp ! src/share/vm/ci/ciMethod.cpp ! src/share/vm/opto/bytecodeInfo.cpp ! src/share/vm/runtime/sharedRuntime.cpp Changeset: ab102d5d923e Author: jrose Date: 2010-05-23 01:38 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/ab102d5d923e 6939207: refactor constant pool index processing Summary: Factored cleanup of instruction decode which prepares for enhanced ldc semantics. Reviewed-by: twisti ! src/cpu/sparc/vm/interp_masm_sparc.cpp ! src/cpu/sparc/vm/interp_masm_sparc.hpp ! src/cpu/sparc/vm/templateInterpreter_sparc.cpp ! src/cpu/sparc/vm/templateTable_sparc.cpp ! src/cpu/x86/vm/interp_masm_x86_32.cpp ! src/cpu/x86/vm/interp_masm_x86_32.hpp ! src/cpu/x86/vm/interp_masm_x86_64.cpp ! src/cpu/x86/vm/interp_masm_x86_64.hpp ! src/cpu/x86/vm/templateInterpreter_x86_32.cpp ! src/cpu/x86/vm/templateInterpreter_x86_64.cpp ! src/cpu/x86/vm/templateTable_x86_32.cpp ! src/cpu/x86/vm/templateTable_x86_64.cpp ! src/share/vm/c1/c1_GraphBuilder.cpp ! src/share/vm/ci/ciStreams.cpp ! src/share/vm/ci/ciStreams.hpp ! src/share/vm/ci/ciTypeFlow.cpp ! src/share/vm/classfile/verifier.cpp ! src/share/vm/includeDB_core ! src/share/vm/interpreter/bytecode.cpp ! src/share/vm/interpreter/bytecode.hpp ! src/share/vm/interpreter/bytecodeStream.cpp ! src/share/vm/interpreter/bytecodeStream.hpp ! src/share/vm/interpreter/bytecodeTracer.cpp ! src/share/vm/interpreter/bytecodes.cpp ! src/share/vm/interpreter/bytecodes.hpp ! src/share/vm/interpreter/interpreter.cpp ! src/share/vm/interpreter/interpreterRuntime.cpp ! src/share/vm/interpreter/interpreterRuntime.hpp ! src/share/vm/interpreter/rewriter.cpp ! src/share/vm/interpreter/rewriter.hpp ! src/share/vm/interpreter/templateTable.cpp ! src/share/vm/interpreter/templateTable.hpp ! src/share/vm/oops/constantPoolOop.cpp ! src/share/vm/oops/constantPoolOop.hpp ! src/share/vm/oops/generateOopMap.cpp ! src/share/vm/opto/bytecodeInfo.cpp ! src/share/vm/opto/parse2.cpp ! src/share/vm/prims/jvmtiClassFileReconstituter.cpp ! src/share/vm/prims/methodComparator.cpp ! src/share/vm/prims/methodHandleWalk.cpp Changeset: 9f669cf29cb0 Author: jrose Date: 2010-05-24 14:15 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/9f669cf29cb0 Merge ! src/cpu/sparc/vm/assembler_sparc.hpp Changeset: 110501f54a99 Author: twisti Date: 2010-05-25 02:38 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/110501f54a99 6934104: JSR 292 needs to support SPARC C2 Summary: C2 for SPARC needs to support JSR 292. Reviewed-by: kvn, never ! src/cpu/sparc/vm/runtime_sparc.cpp ! src/cpu/sparc/vm/sparc.ad ! src/cpu/x86/vm/runtime_x86_32.cpp ! src/cpu/x86/vm/sharedRuntime_x86_64.cpp ! src/cpu/x86/vm/x86_32.ad ! src/cpu/x86/vm/x86_64.ad Changeset: 1747f04ad0c4 Author: never Date: 2010-05-24 13:53 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/1747f04ad0c4 6490487: java support on 64 bit solaris x86 machines is broken. Reviewed-by: kvn, kamg ! make/solaris/makefiles/defs.make Changeset: f9a202dd8899 Author: never Date: 2010-05-25 13:18 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/f9a202dd8899 Merge Changeset: de91a2f25c7e Author: jrose Date: 2010-05-27 09:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/de91a2f25c7e 6956164: nightly regressions from 6939207 Summary: Fix errors in 6939207. Reviewed-by: kvn ! src/share/vm/classfile/verifier.cpp ! src/share/vm/classfile/verifier.hpp ! src/share/vm/interpreter/bytecodeStream.hpp ! src/share/vm/interpreter/bytecodes.cpp ! src/share/vm/interpreter/bytecodes.hpp Changeset: 2d127394260e Author: kvn Date: 2010-05-27 18:01 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/2d127394260e 6916623: Align object to 16 bytes to use Compressed Oops with java heap up to 64Gb Summary: Added new product ObjectAlignmentInBytes flag to control object alignment. Reviewed-by: twisti, ysr, iveresov ! agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java ! src/cpu/sparc/vm/copy_sparc.hpp ! src/cpu/sparc/vm/sparc.ad ! src/cpu/x86/vm/assembler_x86.cpp ! src/cpu/x86/vm/x86_64.ad ! src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp ! src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp ! src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp ! src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp ! src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp ! src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp ! src/share/vm/gc_interface/collectedHeap.cpp ! src/share/vm/memory/space.cpp ! src/share/vm/memory/threadLocalAllocBuffer.inline.hpp ! src/share/vm/memory/universe.cpp ! src/share/vm/oops/arrayOop.hpp ! src/share/vm/oops/oop.hpp ! src/share/vm/oops/oop.inline.hpp ! src/share/vm/runtime/arguments.cpp ! src/share/vm/runtime/globals.hpp ! src/share/vm/runtime/vmStructs.cpp ! src/share/vm/utilities/copy.hpp ! src/share/vm/utilities/globalDefinitions.cpp ! src/share/vm/utilities/globalDefinitions.hpp Changeset: 87fc6aca31ab Author: iveresov Date: 2010-05-27 22:01 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/87fc6aca31ab 6955349: C1: Make G1 barriers work with x64 Summary: This fixes G1 barriers in c1 on x64. Reviewed-by: never ! src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp ! src/cpu/x86/vm/c1_LIRAssembler_x86.cpp ! src/cpu/x86/vm/c1_LIRGenerator_x86.cpp ! src/cpu/x86/vm/c1_Runtime1_x86.cpp ! src/share/vm/c1/c1_LIR.hpp ! src/share/vm/c1/c1_LIRGenerator.cpp Changeset: beb77f0d41b3 Author: jrose Date: 2010-05-28 16:23 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/beb77f0d41b3 6957004: MethodComparator uses the wrong CP index accessor Summary: Change two uses of get_index_u2 to get_index_u2_cpcache; also tweak some debugging print functions Reviewed-by: kvn ! src/share/vm/oops/constantPoolKlass.cpp ! src/share/vm/oops/methodKlass.cpp ! src/share/vm/prims/methodComparator.cpp Changeset: 1eb493f33423 Author: jrose Date: 2010-05-29 19:22 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/1eb493f33423 6957080: MethodComparator needs stress testing Summary: Add a stress-test flag for running MethodComparator over many inputs. Fix bugs that crop up. Reviewed-by: kvn ! src/share/vm/includeDB_core ! src/share/vm/interpreter/bytecode.cpp ! src/share/vm/interpreter/rewriter.cpp ! src/share/vm/prims/methodComparator.cpp ! src/share/vm/runtime/globals.hpp Changeset: 3657cb01ffc5 Author: kvn Date: 2010-06-02 09:49 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/3657cb01ffc5 6954029: Improve implicit null check generation with compressed oops Summary: Hoist DecodeN instruction above null check Reviewed-by: never, twisti ! src/cpu/sparc/vm/sparc.ad ! src/cpu/sparc/vm/vm_version_sparc.cpp ! src/cpu/x86/vm/x86_32.ad ! src/cpu/x86/vm/x86_64.ad ! src/share/vm/opto/compile.cpp ! src/share/vm/opto/connode.cpp ! src/share/vm/opto/lcm.cpp ! src/share/vm/opto/matcher.cpp ! src/share/vm/opto/matcher.hpp Changeset: 4a2e260bb13a Author: kvn Date: 2010-06-02 12:02 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/4a2e260bb13a 6957882: nsk/sajdi tests failed with NullPointerException Summary: VM.getObjectAlignmentInBytes() accesses intxType before it is created. Reviewed-by: never ! agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java Changeset: 852d0157c696 Author: never Date: 2010-06-02 14:23 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/852d0157c696 6956931: assert(SafepointSynchronize::is_at_safepoint()) failed: must be executed at a safepoint Reviewed-by: kvn, dcubed ! src/share/vm/code/nmethod.cpp ! src/share/vm/prims/jvmtiExport.cpp ! src/share/vm/prims/jvmtiExport.hpp Changeset: ca3dceda776c Author: never Date: 2010-06-02 20:15 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/ca3dceda776c 6930994: Code cache is full warning should be visible in product Reviewed-by: kvn, twisti, ysr ! src/share/vm/compiler/compileBroker.cpp Changeset: e9ff18c4ace7 Author: jrose Date: 2010-06-02 22:45 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/e9ff18c4ace7 Merge ! agent/src/share/classes/sun/jvm/hotspot/code/CodeBlob.java ! agent/src/share/classes/sun/jvm/hotspot/code/NMethod.java ! agent/src/share/classes/sun/jvm/hotspot/memory/CompactibleFreeListSpace.java ! agent/src/share/classes/sun/jvm/hotspot/oops/Oop.java ! agent/src/share/classes/sun/jvm/hotspot/runtime/VM.java ! agent/src/share/classes/sun/jvm/hotspot/utilities/PointerFinder.java ! make/solaris/makefiles/defs.make ! src/cpu/sparc/vm/assembler_sparc.hpp ! src/cpu/sparc/vm/c1_FrameMap_sparc.cpp ! src/cpu/sparc/vm/c1_FrameMap_sparc.hpp ! src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp ! src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp ! src/cpu/sparc/vm/c1_Runtime1_sparc.cpp ! src/cpu/sparc/vm/copy_sparc.hpp ! src/cpu/sparc/vm/frame_sparc.cpp ! src/cpu/sparc/vm/interp_masm_sparc.cpp ! src/cpu/sparc/vm/interp_masm_sparc.hpp ! src/cpu/sparc/vm/methodHandles_sparc.cpp ! src/cpu/sparc/vm/nativeInst_sparc.cpp ! src/cpu/sparc/vm/register_definitions_sparc.cpp ! src/cpu/sparc/vm/runtime_sparc.cpp ! src/cpu/sparc/vm/sharedRuntime_sparc.cpp ! src/cpu/sparc/vm/sparc.ad ! src/cpu/sparc/vm/stubGenerator_sparc.cpp ! src/cpu/sparc/vm/stubRoutines_sparc.hpp ! src/cpu/sparc/vm/templateInterpreter_sparc.cpp ! src/cpu/sparc/vm/templateTable_sparc.cpp ! src/cpu/sparc/vm/vm_version_sparc.cpp ! src/cpu/x86/vm/assembler_x86.cpp ! src/cpu/x86/vm/assembler_x86.hpp ! src/cpu/x86/vm/c1_FrameMap_x86.cpp ! src/cpu/x86/vm/c1_FrameMap_x86.hpp ! src/cpu/x86/vm/c1_LIRAssembler_x86.cpp ! src/cpu/x86/vm/c1_LIRGenerator_x86.cpp ! src/cpu/x86/vm/c1_Runtime1_x86.cpp ! src/cpu/x86/vm/interp_masm_x86_32.cpp ! src/cpu/x86/vm/interp_masm_x86_32.hpp ! src/cpu/x86/vm/interp_masm_x86_64.cpp ! src/cpu/x86/vm/interp_masm_x86_64.hpp ! src/cpu/x86/vm/register_definitions_x86.cpp ! src/cpu/x86/vm/runtime_x86_32.cpp ! src/cpu/x86/vm/sharedRuntime_x86_64.cpp ! src/cpu/x86/vm/templateInterpreter_x86_32.cpp ! src/cpu/x86/vm/templateInterpreter_x86_64.cpp ! src/cpu/x86/vm/templateTable_x86_32.cpp ! src/cpu/x86/vm/templateTable_x86_64.cpp ! src/cpu/x86/vm/x86_32.ad ! src/cpu/x86/vm/x86_64.ad ! src/os/solaris/dtrace/generateJvmOffsets.cpp ! src/os/solaris/dtrace/libjvm_db.c ! src/share/vm/asm/codeBuffer.hpp ! src/share/vm/c1/c1_FrameMap.hpp ! src/share/vm/c1/c1_GraphBuilder.cpp ! src/share/vm/c1/c1_IR.cpp ! src/share/vm/c1/c1_IR.hpp ! src/share/vm/c1/c1_LIR.cpp ! src/share/vm/c1/c1_LIR.hpp ! src/share/vm/c1/c1_LIRAssembler.cpp ! src/share/vm/c1/c1_LIRAssembler.hpp ! src/share/vm/c1/c1_LIRGenerator.cpp ! src/share/vm/ci/ciMethod.cpp ! src/share/vm/ci/ciStreams.cpp ! src/share/vm/ci/ciStreams.hpp ! src/share/vm/ci/ciTypeFlow.cpp ! src/share/vm/classfile/verifier.cpp ! src/share/vm/classfile/verifier.hpp ! src/share/vm/code/codeBlob.cpp ! src/share/vm/code/codeBlob.hpp ! src/share/vm/code/codeCache.cpp ! src/share/vm/code/compiledIC.cpp ! src/share/vm/code/nmethod.cpp ! src/share/vm/code/nmethod.hpp ! src/share/vm/code/oopRecorder.cpp ! src/share/vm/code/oopRecorder.hpp ! src/share/vm/code/relocInfo.cpp ! src/share/vm/code/relocInfo.hpp ! src/share/vm/compiler/compileBroker.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp ! src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp ! src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp ! src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp ! src/share/vm/gc_implementation/g1/g1CollectorPolicy.cpp ! src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.cpp ! src/share/vm/gc_implementation/parallelScavenge/psParallelCompact.hpp ! src/share/vm/gc_implementation/shared/mutableNUMASpace.cpp ! src/share/vm/gc_interface/collectedHeap.cpp ! src/share/vm/includeDB_core ! src/share/vm/interpreter/bytecode.cpp ! src/share/vm/interpreter/bytecode.hpp ! src/share/vm/interpreter/bytecodeStream.cpp ! src/share/vm/interpreter/bytecodeStream.hpp ! src/share/vm/interpreter/bytecodeTracer.cpp ! src/share/vm/interpreter/bytecodes.cpp ! src/share/vm/interpreter/bytecodes.hpp ! src/share/vm/interpreter/interpreter.cpp ! src/share/vm/interpreter/interpreterRuntime.cpp ! src/share/vm/interpreter/interpreterRuntime.hpp ! src/share/vm/interpreter/rewriter.cpp ! src/share/vm/interpreter/rewriter.hpp ! src/share/vm/interpreter/templateTable.cpp ! src/share/vm/interpreter/templateTable.hpp ! src/share/vm/memory/iterator.cpp ! src/share/vm/memory/space.cpp ! src/share/vm/memory/threadLocalAllocBuffer.inline.hpp ! src/share/vm/memory/universe.cpp ! src/share/vm/oops/arrayOop.hpp ! src/share/vm/oops/constantPoolKlass.cpp ! src/share/vm/oops/constantPoolOop.cpp ! src/share/vm/oops/constantPoolOop.hpp ! src/share/vm/oops/generateOopMap.cpp ! src/share/vm/oops/methodKlass.cpp ! src/share/vm/oops/oop.hpp ! src/share/vm/oops/oop.inline.hpp ! src/share/vm/opto/bytecodeInfo.cpp ! src/share/vm/opto/compile.cpp ! src/share/vm/opto/connode.cpp ! src/share/vm/opto/lcm.cpp ! src/share/vm/opto/matcher.cpp ! src/share/vm/opto/matcher.hpp ! src/share/vm/opto/parse2.cpp ! src/share/vm/prims/jvmtiClassFileReconstituter.cpp ! src/share/vm/prims/jvmtiExport.cpp ! src/share/vm/prims/jvmtiExport.hpp ! src/share/vm/prims/methodComparator.cpp ! src/share/vm/prims/methodHandleWalk.cpp ! src/share/vm/runtime/arguments.cpp ! src/share/vm/runtime/globals.hpp ! src/share/vm/runtime/sharedRuntime.cpp ! src/share/vm/runtime/vmStructs.cpp ! src/share/vm/utilities/copy.hpp ! src/share/vm/utilities/globalDefinitions.cpp ! src/share/vm/utilities/globalDefinitions.hpp Changeset: f56e28f22410 Author: trims Date: 2010-06-03 18:18 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/f56e28f22410 6958458: Bump the HS19 build number to 03 Summary: Update the HS19 build number to 03 Reviewed-by: jcoomes ! make/hotspot_version Changeset: 606df121c181 Author: trims Date: 2010-06-04 11:54 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/606df121c181 Merge Changeset: c69846936352 Author: trims Date: 2010-06-17 23:59 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/c69846936352 Merge Changeset: 02e771df338e Author: kvn Date: 2010-06-03 14:20 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/02e771df338e 6958254: -XX:+VerifyOops is broken on x86 Summary: save and restore r10 in verify_oop(). Reviewed-by: never ! src/cpu/x86/vm/assembler_x86.cpp ! src/cpu/x86/vm/stubGenerator_x86_64.cpp Changeset: b812ff5abc73 Author: iveresov Date: 2010-06-04 11:18 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/b812ff5abc73 6958292: C1: Enable parallel compilation Summary: Enable parallel compilation in C1 Reviewed-by: never, kvn ! src/cpu/sparc/vm/c1_FrameMap_sparc.cpp ! src/cpu/x86/vm/c1_FrameMap_x86.cpp ! src/share/vm/c1/c1_Canonicalizer.cpp ! src/share/vm/c1/c1_Compilation.cpp ! src/share/vm/c1/c1_Compilation.hpp ! src/share/vm/c1/c1_Compiler.cpp ! src/share/vm/c1/c1_Compiler.hpp ! src/share/vm/c1/c1_FrameMap.cpp ! src/share/vm/c1/c1_FrameMap.hpp ! src/share/vm/c1/c1_GraphBuilder.cpp ! src/share/vm/c1/c1_GraphBuilder.hpp ! src/share/vm/c1/c1_IR.cpp ! src/share/vm/c1/c1_IR.hpp ! src/share/vm/c1/c1_Instruction.cpp ! src/share/vm/c1/c1_Instruction.hpp ! src/share/vm/c1/c1_LIRGenerator.cpp ! src/share/vm/c1/c1_LinearScan.cpp ! src/share/vm/c1/c1_LinearScan.hpp ! src/share/vm/c1/c1_Optimizer.cpp ! src/share/vm/c1/c1_Runtime1.cpp ! src/share/vm/c1/c1_Runtime1.hpp ! src/share/vm/c1/c1_ValueStack.cpp ! src/share/vm/c1/c1_ValueStack.hpp ! src/share/vm/c1/c1_ValueType.cpp ! src/share/vm/c1/c1_ValueType.hpp ! src/share/vm/includeDB_compiler1 ! src/share/vm/runtime/mutexLocker.cpp ! src/share/vm/runtime/mutexLocker.hpp ! src/share/vm/runtime/thread.cpp ! src/share/vm/runtime/thread.hpp Changeset: 49fac4acd688 Author: never Date: 2010-06-07 14:17 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/49fac4acd688 6958485: fix for 6879921 was insufficient Reviewed-by: kvn ! src/share/vm/opto/superword.cpp + test/compiler/6958485/Test.java Changeset: 086d73ccd6c0 Author: kamg Date: 2010-05-27 17:06 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/086d73ccd6c0 6930553: classfile format checker allows invalid method descriptor in CONSTANT_NameAndType_info in some cases Summary: Check NameAndType_info signatures aggressively, even when unreferenced Reviewed-by: coleenp, acorn, never ! src/share/vm/classfile/classFileParser.cpp ! src/share/vm/classfile/classFileParser.hpp Changeset: b96a3e44582f Author: acorn Date: 2010-06-03 13:21 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/b96a3e44582f 6852873: Reduce safepoint cleanup time Summary: New optional flags to reduce inflated monitor cleanup times Reviewed-by: chrisphi, dice ! src/share/vm/runtime/globals.hpp ! src/share/vm/runtime/synchronizer.cpp ! src/share/vm/runtime/synchronizer.hpp ! src/share/vm/runtime/thread.cpp ! src/share/vm/runtime/thread.hpp Changeset: be0d50d3de2a Author: acorn Date: 2010-06-03 13:34 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/be0d50d3de2a Merge Changeset: 3a9de63b2209 Author: coleenp Date: 2010-06-04 17:44 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/3a9de63b2209 Merge ! src/share/vm/classfile/classFileParser.cpp ! src/share/vm/classfile/classFileParser.hpp ! src/share/vm/runtime/globals.hpp ! src/share/vm/runtime/synchronizer.cpp ! src/share/vm/runtime/synchronizer.hpp ! src/share/vm/runtime/thread.cpp ! src/share/vm/runtime/thread.hpp Changeset: b17deadc902e Author: coleenp Date: 2010-06-09 13:53 -0400 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/b17deadc902e Merge ! src/share/vm/runtime/thread.cpp ! src/share/vm/runtime/thread.hpp Changeset: f16f1d7893de Author: johnc Date: 2010-05-24 17:11 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/f16f1d7893de 6941378: G1: change default value of G1UseFixedWindowMMUTracker to true Summary: Rather than changing the default value of the G1UseFixedWindowMMUTracker, the flag and associated guarantee have been removed. Reviewed-by: jcoomes, tonyp, ysr ! src/share/vm/gc_implementation/g1/g1MMUTracker.cpp ! src/share/vm/gc_implementation/g1/g1_globals.hpp Changeset: 5b77884bd4b7 Author: jcoomes Date: 2010-05-27 13:09 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/5b77884bd4b7 6956472: test/runtime/6888954/vmerrors.sh uses ksh-specific syntax Reviewed-by: jmelvin, kvn ! test/runtime/6888954/vmerrors.sh Changeset: 2458a1f25356 Author: johnc Date: 2010-06-07 17:46 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/2458a1f25356 6953058: G1: A bigapp crashes with SIGSEGV in compiled code Summary: In C2's G1 post write barrier, the loads of the buffer and index fields from the DirtyCardQueue structure may be moved across a safepoint. Use the current value of "control" in the C2 IR to limit how far these loads can move. Reviewed-by: never, iveresov, kvn ! src/share/vm/opto/graphKit.cpp Changeset: b9bc732be7c0 Author: jmasa Date: 2010-06-10 08:27 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/b9bc732be7c0 Merge ! src/share/vm/gc_implementation/g1/g1MMUTracker.cpp ! src/share/vm/gc_implementation/g1/g1_globals.hpp ! src/share/vm/opto/graphKit.cpp Changeset: e848dd13e1b6 Author: trims Date: 2010-06-18 00:09 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/e848dd13e1b6 Merge Changeset: 6a236384a379 Author: trims Date: 2010-06-18 00:19 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/6a236384a379 Merge Changeset: b34c75c0b6b8 Author: mikejwre Date: 2010-06-24 20:03 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/hotspot/rev/b34c75c0b6b8 Added tag jdk7-b99 for changeset 6a236384a379 ! .hgtags From lana.steuck at oracle.com Tue Jun 29 21:03:17 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Tue, 29 Jun 2010 21:03:17 +0000 Subject: hg: jdk7/tl/jaxp: 3 new changesets Message-ID: <20100629210317.82E1447623@hg.openjdk.java.net> Changeset: 7ef8469021fb Author: mikejwre Date: 2010-06-17 16:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/7ef8469021fb Added tag jdk7-b98 for changeset d4adf4f2d14c ! .hgtags Changeset: 69a11eec2789 Author: mikejwre Date: 2010-06-24 20:03 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/69a11eec2789 Added tag jdk7-b99 for changeset 7ef8469021fb ! .hgtags Changeset: e46c304486c0 Author: lana Date: 2010-06-29 10:49 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxp/rev/e46c304486c0 Merge From lana.steuck at oracle.com Tue Jun 29 21:03:21 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Tue, 29 Jun 2010 21:03:21 +0000 Subject: hg: jdk7/tl/jaxws: 3 new changesets Message-ID: <20100629210321.53E4047624@hg.openjdk.java.net> Changeset: 818366ce23d8 Author: mikejwre Date: 2010-06-17 16:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxws/rev/818366ce23d8 Added tag jdk7-b98 for changeset 457109807109 ! .hgtags Changeset: 5bca7bc114a0 Author: mikejwre Date: 2010-06-24 20:03 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxws/rev/5bca7bc114a0 Added tag jdk7-b99 for changeset 818366ce23d8 ! .hgtags Changeset: 2dd6394ddec2 Author: lana Date: 2010-06-29 10:49 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jaxws/rev/2dd6394ddec2 Merge From lana.steuck at oracle.com Tue Jun 29 21:03:37 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Tue, 29 Jun 2010 21:03:37 +0000 Subject: hg: jdk7/tl/jdk: 12 new changesets Message-ID: <20100629210553.94F9E47625@hg.openjdk.java.net> Changeset: 57293ed264c4 Author: prr Date: 2010-06-14 10:37 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/57293ed264c4 6961061: make/tools/freetypecheck doesn't build with VS2010 : breaks openjdk builds Reviewed-by: ohair ! make/tools/freetypecheck/freetypecheck.c Changeset: 6cc8d40d94e7 Author: prr Date: 2010-06-16 09:42 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/6cc8d40d94e7 6961079: Build JDK7 for 64 bit Windows using free Windows 7.1 SDK 64 bit compilers Reviewed-by: ohair, jcoomes ! make/common/shared/Defs-windows.gmk Changeset: 82593186fa54 Author: mikejwre Date: 2010-06-16 15:49 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/82593186fa54 Merge Changeset: 9c0586509d75 Author: mikejwre Date: 2010-06-17 16:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/9c0586509d75 Added tag jdk7-b98 for changeset 82593186fa54 ! .hgtags Changeset: 0cd764a1c809 Author: jrose Date: 2010-04-30 23:48 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/0cd764a1c809 6939134: JSR 292 adjustments to method handle invocation Summary: split MethodHandle.invoke into invokeExact and invokeGeneric; also clean up JVM-to-Java interfaces Reviewed-by: twisti ! src/share/classes/java/dyn/CallSite.java ! src/share/classes/java/dyn/InvokeDynamic.java ! src/share/classes/java/dyn/InvokeDynamicBootstrapError.java ! src/share/classes/java/dyn/JavaMethodHandle.java ! src/share/classes/java/dyn/Linkage.java ! src/share/classes/java/dyn/LinkagePermission.java ! src/share/classes/java/dyn/MethodHandle.java ! src/share/classes/java/dyn/MethodHandles.java ! src/share/classes/java/dyn/MethodType.java ! src/share/classes/java/dyn/NoAccessException.java ! src/share/classes/java/dyn/package-info.java ! src/share/classes/sun/dyn/AdapterMethodHandle.java ! src/share/classes/sun/dyn/BoundMethodHandle.java ! src/share/classes/sun/dyn/CallSiteImpl.java ! src/share/classes/sun/dyn/FilterGeneric.java ! src/share/classes/sun/dyn/FilterOneArgument.java ! src/share/classes/sun/dyn/FromGeneric.java ! src/share/classes/sun/dyn/MemberName.java ! src/share/classes/sun/dyn/MethodHandleImpl.java ! src/share/classes/sun/dyn/MethodHandleNatives.java ! src/share/classes/sun/dyn/MethodTypeImpl.java ! src/share/classes/sun/dyn/SpreadGeneric.java ! src/share/classes/sun/dyn/ToGeneric.java ! src/share/classes/sun/dyn/package-info.java ! src/share/classes/sun/dyn/util/ValueConversions.java ! src/share/classes/sun/dyn/util/VerifyAccess.java ! test/java/dyn/MethodHandlesTest.java Changeset: 4a28a204b726 Author: jrose Date: 2010-05-03 23:32 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/4a28a204b726 6939196: method handle signatures off the boot class path get linkage errors Summary: Remove workaround from MethodHandleImpl lookup code; add JUnit regression test to MethodHandlesTest. Reviewed-by: twisti ! src/share/classes/sun/dyn/MethodHandleImpl.java ! test/java/dyn/MethodHandlesTest.java Changeset: 3cf85945abef Author: jrose Date: 2010-05-13 20:01 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3cf85945abef Merge Changeset: d742045bd30b Author: jrose Date: 2010-06-18 15:23 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/d742045bd30b Merge ! src/share/classes/java/dyn/CallSite.java ! src/share/classes/java/dyn/InvokeDynamic.java ! src/share/classes/java/dyn/InvokeDynamicBootstrapError.java ! src/share/classes/java/dyn/JavaMethodHandle.java ! src/share/classes/java/dyn/Linkage.java ! src/share/classes/java/dyn/LinkagePermission.java ! src/share/classes/java/dyn/MethodHandle.java ! src/share/classes/java/dyn/MethodHandles.java ! src/share/classes/java/dyn/MethodType.java ! src/share/classes/java/dyn/NoAccessException.java ! src/share/classes/java/dyn/package-info.java ! src/share/classes/sun/dyn/AdapterMethodHandle.java ! src/share/classes/sun/dyn/BoundMethodHandle.java ! src/share/classes/sun/dyn/CallSiteImpl.java ! src/share/classes/sun/dyn/FilterGeneric.java ! src/share/classes/sun/dyn/FilterOneArgument.java ! src/share/classes/sun/dyn/FromGeneric.java ! src/share/classes/sun/dyn/MemberName.java ! src/share/classes/sun/dyn/MethodHandleImpl.java ! src/share/classes/sun/dyn/MethodHandleNatives.java ! src/share/classes/sun/dyn/MethodTypeImpl.java ! src/share/classes/sun/dyn/SpreadGeneric.java ! src/share/classes/sun/dyn/ToGeneric.java ! src/share/classes/sun/dyn/package-info.java ! src/share/classes/sun/dyn/util/ValueConversions.java ! src/share/classes/sun/dyn/util/VerifyAccess.java ! test/java/dyn/MethodHandlesTest.java Changeset: 3d944ecfa470 Author: jrose Date: 2010-06-08 23:08 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3d944ecfa470 6939203: JSR 292 needs method handle constants Summary: Add new CP types CONSTANT_MethodHandle, CONSTANT_MethodType to verifier; put in runtime support upcall. Reviewed-by: twisti ! src/share/classes/java/dyn/MethodHandles.java ! src/share/classes/sun/dyn/MethodHandleNatives.java ! src/share/javavm/export/classfile_constants.h ! src/share/native/common/check_code.c ! test/java/dyn/MethodHandlesTest.java Changeset: 2587c9f0b60d Author: jrose Date: 2010-06-19 01:14 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/2587c9f0b60d Merge ! src/share/classes/java/dyn/MethodHandles.java ! src/share/classes/sun/dyn/MethodHandleNatives.java ! src/share/javavm/export/classfile_constants.h ! src/share/native/common/check_code.c ! test/java/dyn/MethodHandlesTest.java Changeset: 3956cdee6712 Author: mikejwre Date: 2010-06-24 20:03 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/3956cdee6712 Added tag jdk7-b99 for changeset 2587c9f0b60d ! .hgtags Changeset: b318df97820f Author: lana Date: 2010-06-29 10:50 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/jdk/rev/b318df97820f Merge From lana.steuck at oracle.com Tue Jun 29 21:13:33 2010 From: lana.steuck at oracle.com (lana.steuck at oracle.com) Date: Tue, 29 Jun 2010 21:13:33 +0000 Subject: hg: jdk7/tl/langtools: 6 new changesets Message-ID: <20100629211345.AD39B47626@hg.openjdk.java.net> Changeset: ab1356297c67 Author: mikejwre Date: 2010-06-17 16:28 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/ab1356297c67 Added tag jdk7-b98 for changeset 3b38f3aa3dc3 ! .hgtags Changeset: f0e3ec1f9d9f Author: jrose Date: 2010-05-01 15:05 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/f0e3ec1f9d9f 6939134: JSR 292 adjustments to method handle invocation Summary: split MethodHandle.invoke into invokeExact and invokeGeneric Reviewed-by: twisti ! src/share/classes/com/sun/tools/javac/code/Flags.java ! src/share/classes/com/sun/tools/javac/code/Source.java ! src/share/classes/com/sun/tools/javac/code/Symtab.java ! src/share/classes/com/sun/tools/javac/comp/Attr.java ! src/share/classes/com/sun/tools/javac/comp/MemberEnter.java ! src/share/classes/com/sun/tools/javac/comp/Resolve.java ! src/share/classes/com/sun/tools/javac/jvm/ClassReader.java ! src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java ! src/share/classes/com/sun/tools/javac/jvm/Gen.java ! src/share/classes/com/sun/tools/javac/main/Main.java ! src/share/classes/com/sun/tools/javac/util/Names.java ! test/tools/javac/meth/InvokeDyn.java ! test/tools/javac/meth/InvokeMH.java Changeset: 2a28dcbef3a7 Author: jrose Date: 2010-05-13 20:01 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/2a28dcbef3a7 Merge Changeset: 005bec70ca27 Author: jrose Date: 2010-06-18 15:12 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/005bec70ca27 Merge ! src/share/classes/com/sun/tools/javac/code/Flags.java ! src/share/classes/com/sun/tools/javac/code/Source.java ! src/share/classes/com/sun/tools/javac/code/Symtab.java ! src/share/classes/com/sun/tools/javac/comp/Attr.java ! src/share/classes/com/sun/tools/javac/comp/MemberEnter.java ! src/share/classes/com/sun/tools/javac/comp/Resolve.java ! src/share/classes/com/sun/tools/javac/jvm/ClassReader.java ! src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java ! src/share/classes/com/sun/tools/javac/jvm/Gen.java ! src/share/classes/com/sun/tools/javac/main/Main.java ! src/share/classes/com/sun/tools/javac/util/Names.java ! test/tools/javac/meth/InvokeDyn.java ! test/tools/javac/meth/InvokeMH.java Changeset: 9d02c4ce4275 Author: mikejwre Date: 2010-06-24 20:03 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/9d02c4ce4275 Added tag jdk7-b99 for changeset 005bec70ca27 ! .hgtags Changeset: 6386f0fd6205 Author: lana Date: 2010-06-29 12:06 -0700 URL: http://hg.openjdk.java.net/jdk7/tl/langtools/rev/6386f0fd6205 Merge ! src/share/classes/com/sun/tools/javac/code/Flags.java ! src/share/classes/com/sun/tools/javac/code/Source.java ! src/share/classes/com/sun/tools/javac/code/Symtab.java ! src/share/classes/com/sun/tools/javac/comp/Attr.java ! src/share/classes/com/sun/tools/javac/comp/MemberEnter.java ! src/share/classes/com/sun/tools/javac/comp/Resolve.java ! src/share/classes/com/sun/tools/javac/jvm/ClassReader.java ! src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java ! src/share/classes/com/sun/tools/javac/jvm/Gen.java ! src/share/classes/com/sun/tools/javac/main/Main.java ! src/share/classes/com/sun/tools/javac/util/Names.java