You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2009/09/07 19:56:31 UTC
svn commit: r812236 - in
/commons/proper/lang/trunk/src/java/org/apache/commons/lang/math:
DoubleRange.java FloatRange.java IntRange.java LongRange.java
NumberRange.java
Author: bayard
Date: Mon Sep 7 17:56:30 2009
New Revision: 812236
URL: http://svn.apache.org/viewvc?rev=812236&view=rev
Log:
Applying Boris' patch in LANG-481 to improve thread safety in the Range classes. The previous code's reuse of the hashCode variable for local operations means it is utterly non-thread-safe. Now uses a local variable so that the worst case should be the hashCode being calculated multiple times, but not ending up with different values.
Modified:
commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/DoubleRange.java
commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/FloatRange.java
commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/IntRange.java
commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/LongRange.java
commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/NumberRange.java
Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/DoubleRange.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/DoubleRange.java?rev=812236&r1=812235&r2=812236&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/DoubleRange.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/DoubleRange.java Mon Sep 7 17:56:30 2009
@@ -398,13 +398,15 @@
*/
@Override
public int hashCode() {
- if (hashCode == 0) {
- hashCode = 17;
- hashCode = 37 * hashCode + getClass().hashCode();
+ int temp = hashCode;
+ if (temp == 0) {
+ temp = 17;
+ temp = 37 * temp + getClass().hashCode();
long lng = Double.doubleToLongBits(min);
- hashCode = 37 * hashCode + ((int) (lng ^ (lng >> 32)));
+ temp = 37 * temp + ((int) (lng ^ (lng >> 32)));
lng = Double.doubleToLongBits(max);
- hashCode = 37 * hashCode + ((int) (lng ^ (lng >> 32)));
+ temp = 37 * temp + ((int) (lng ^ (lng >> 32)));
+ hashCode = temp;
}
return hashCode;
}
Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/FloatRange.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/FloatRange.java?rev=812236&r1=812235&r2=812236&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/FloatRange.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/FloatRange.java Mon Sep 7 17:56:30 2009
@@ -394,11 +394,13 @@
*/
@Override
public int hashCode() {
- if (hashCode == 0) {
- hashCode = 17;
- hashCode = 37 * hashCode + getClass().hashCode();
- hashCode = 37 * hashCode + Float.floatToIntBits(min);
- hashCode = 37 * hashCode + Float.floatToIntBits(max);
+ int temp = hashCode;
+ if (temp == 0) {
+ temp = 17;
+ temp = 37 * temp + getClass().hashCode();
+ temp = 37 * temp + Float.floatToIntBits(min);
+ temp = 37 * temp + Float.floatToIntBits(max);
+ hashCode = temp;
}
return hashCode;
}
Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/IntRange.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/IntRange.java?rev=812236&r1=812235&r2=812236&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/IntRange.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/IntRange.java Mon Sep 7 17:56:30 2009
@@ -368,11 +368,13 @@
*/
@Override
public int hashCode() {
- if (hashCode == 0) {
- hashCode = 17;
- hashCode = 37 * hashCode + getClass().hashCode();
- hashCode = 37 * hashCode + min;
- hashCode = 37 * hashCode + max;
+ int temp = hashCode;
+ if (temp == 0) {
+ temp = 17;
+ temp = 37 * temp + getClass().hashCode();
+ temp = 37 * temp + min;
+ temp = 37 * temp + max;
+ hashCode = temp;
}
return hashCode;
}
Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/LongRange.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/LongRange.java?rev=812236&r1=812235&r2=812236&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/LongRange.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/LongRange.java Mon Sep 7 17:56:30 2009
@@ -381,11 +381,13 @@
*/
@Override
public int hashCode() {
- if (hashCode == 0) {
- hashCode = 17;
- hashCode = 37 * hashCode + getClass().hashCode();
- hashCode = 37 * hashCode + ((int) (min ^ (min >> 32)));
- hashCode = 37 * hashCode + ((int) (max ^ (max >> 32)));
+ int temp = hashCode;
+ if (temp == 0) {
+ temp = 17;
+ temp = 37 * temp + getClass().hashCode();
+ temp = 37 * temp + ((int) (min ^ (min >> 32)));
+ temp = 37 * temp + ((int) (max ^ (max >> 32)));
+ hashCode = temp;
}
return hashCode;
}
Modified: commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/NumberRange.java
URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/NumberRange.java?rev=812236&r1=812235&r2=812236&view=diff
==============================================================================
--- commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/NumberRange.java (original)
+++ commons/proper/lang/trunk/src/java/org/apache/commons/lang/math/NumberRange.java Mon Sep 7 17:56:30 2009
@@ -215,11 +215,13 @@
*/
@Override
public int hashCode() {
- if (hashCode == 0) {
- hashCode = 17;
- hashCode = 37 * hashCode + getClass().hashCode();
- hashCode = 37 * hashCode + min.hashCode();
- hashCode = 37 * hashCode + max.hashCode();
+ int temp = hashCode;
+ if (temp == 0) {
+ temp = 17;
+ temp = 37 * temp + getClass().hashCode();
+ temp = 37 * temp + min.hashCode();
+ temp = 37 * temp + max.hashCode();
+ hashCode = temp;
}
return hashCode;
}