openjpa-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ppod...@apache.org
Subject svn commit: r1240302 - in /openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib: conf/ImmutableBooleanValue.java util/FlexibleThreadLocal.java
Date Fri, 03 Feb 2012 19:09:31 GMT
Author: ppoddar
Date: Fri Feb  3 19:09:30 2012
New Revision: 1240302

URL: http://svn.apache.org/viewvc?rev=1240302&view=rev
Log:
OPENJPA-2099: relax thread and bind parameter affinity. allow immutable value at construction

Modified:
    openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ImmutableBooleanValue.java
    openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/FlexibleThreadLocal.java

Modified: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ImmutableBooleanValue.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ImmutableBooleanValue.java?rev=1240302&r1=1240301&r2=1240302&view=diff
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ImmutableBooleanValue.java
(original)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/conf/ImmutableBooleanValue.java
Fri Feb  3 19:09:30 2012
@@ -31,6 +31,12 @@ public class ImmutableBooleanValue exten
 		super(prop);
 	}
 	
+	public ImmutableBooleanValue(String prop, boolean value) {
+		super(prop);
+		set(value);
+	}
+
+	
     public void set(boolean value) {
     	if (_dirty) {
     		if (value != get().booleanValue())

Modified: openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/FlexibleThreadLocal.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/FlexibleThreadLocal.java?rev=1240302&r1=1240301&r2=1240302&view=diff
==============================================================================
--- openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/FlexibleThreadLocal.java
(original)
+++ openjpa/trunk/openjpa-lib/src/main/java/org/apache/openjpa/lib/util/FlexibleThreadLocal.java
Fri Feb  3 19:09:30 2012
@@ -22,7 +22,13 @@ import java.util.HashMap;
 import java.util.Map;
 
 /**
- * A thread-specific storage similar to {@link ThreadLocal}.
+ * A thread-specific storage similar to {@link ThreadLocal} that 
+ * <em>heuristically</em> relaxes the affinity of a value to a thread.
+ * <br>
+ * A thread <tt>t1</tt> can {@linkplain #set(Object) set} a value, while
+ * a different thread <tt>t2</tt> can {@linkplain #get() access} the same
+ * value, if <tt>t1</tt> and <tt>t2</tt> are <em>{@link #isEquivalent(Thread,
Thread)
+ * equivalent}</em>.
  *  
  * @author Pinaki Poddar
  * @since 2.2.0
@@ -41,12 +47,16 @@ public class FlexibleThreadLocal<T>  {
 		if (_values.containsKey(current)) {
 			return _values.get(current);
 		} else {
-			for (Map.Entry<Thread, T> e : _values.entrySet()) {
-				if (isEquivalent(e.getKey(), current))
-					return e.getValue();
+			if (_values.size() == 1) {
+				return _values.values().iterator().next();
+			} else {
+				for (Map.Entry<Thread, T> e : _values.entrySet()) {
+					if (isEquivalent(e.getKey(), current))
+						return e.getValue();
+				}
 			}
-		}
-		return null;
+			throw new RuntimeException(current + " is not a known thread. Known threads are " + _values);
+		} 
 	}
 	
 	/**
@@ -58,11 +68,17 @@ public class FlexibleThreadLocal<T>  {
 	
 	/**
 	 * Affirms if the two given thread are equivalent.
-	 * Equivalence takes asymmetric equality in account.
+	 * Two threads are equivalent if the they are identical (of course),
+	 * or they belong to the same thread group or they are <em>equal</em>.
+	 * The equality can be defined <em>asymmetrically</em> by the 
+	 * thread implementation. For example, a child thread (as done in Slice)
+	 * can equal its parent thread which is a native thread. But the parent
+	 * (native) thread is not equal to the child thread.   
 	 */
 	protected boolean isEquivalent(Thread a, Thread b) {
 		if (a == b) return true;
-		if (a == null || b== null) return false;
+		if (a.getThreadGroup() == b.getThreadGroup()) return true;
+		if (a == null || b == null) return false;
 		return a.equals(b) || b.equals(a);
 	}
 



Mime
View raw message