[jboss-svn-commits] JBL Code SVN: r12190 - in labs/jbossrules/trunk/drools-core/src/main/java/org/drools: util and 1 other directory.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon May 28 19:16:22 EDT 2007
Author: tirelli
Date: 2007-05-28 19:16:22 -0400 (Mon, 28 May 2007)
New Revision: 12190
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleMemory.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
Log:
JBRULES-792: fixing concurrent modification problem in collect and accumulate nodes
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java 2007-05-28 22:28:05 UTC (rev 12189)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/AccumulateNode.java 2007-05-28 23:16:22 UTC (rev 12190)
@@ -28,6 +28,7 @@
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.PropagationContext;
import org.drools.util.ArrayUtils;
+import org.drools.util.Entry;
import org.drools.util.Iterator;
import org.drools.util.AbstractHashTable.FactEntry;
import org.drools.util.ObjectHashMap.ObjectEntry;
@@ -203,10 +204,13 @@
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
memory.getFactHandleMemory().add( handle );
- final Iterator it = memory.getTupleMemory().iterator();
this.constraints.updateFromFactHandle( workingMemory,
handle );
- for ( ReteTuple tuple = (ReteTuple) it.next(); tuple != null; tuple = (ReteTuple) it.next() ) {
+
+ // need to clone the tuples to avoid concurrent modification exceptions
+ Entry[] tuples = memory.getTupleMemory().toArray();
+ for ( int i = 0; i < tuples.length; i++ ) {
+ ReteTuple tuple = (ReteTuple) tuples[i];
if ( this.constraints.isAllowedCachedRight( tuple ) ) {
this.retractTuple( tuple,
context,
@@ -232,10 +236,12 @@
return;
}
- final Iterator it = memory.getTupleMemory().iterator();
this.constraints.updateFromFactHandle( workingMemory,
handle );
- for ( ReteTuple tuple = (ReteTuple) it.next(); tuple != null; tuple = (ReteTuple) it.next() ) {
+ // need to clone the tuples to avoid concurrent modification exceptions
+ Entry[] tuples = memory.getTupleMemory().toArray();
+ for ( int i = 0; i < tuples.length; i++ ) {
+ ReteTuple tuple = (ReteTuple) tuples[i];
if ( this.constraints.isAllowedCachedRight( tuple ) ) {
this.retractTuple( tuple,
context,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java 2007-05-28 22:28:05 UTC (rev 12189)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/CollectNode.java 2007-05-28 23:16:22 UTC (rev 12190)
@@ -27,6 +27,7 @@
import org.drools.spi.AlphaNodeFieldConstraint;
import org.drools.spi.PropagationContext;
import org.drools.util.ArrayUtils;
+import org.drools.util.Entry;
import org.drools.util.Iterator;
import org.drools.util.AbstractHashTable.FactEntry;
import org.drools.util.ObjectHashMap.ObjectEntry;
@@ -204,10 +205,13 @@
final BetaMemory memory = (BetaMemory) workingMemory.getNodeMemory( this );
memory.getFactHandleMemory().add( handle );
- final Iterator it = memory.getTupleMemory().iterator();
this.constraints.updateFromFactHandle( workingMemory,
handle );
- for ( ReteTuple tuple = (ReteTuple) it.next(); tuple != null; tuple = (ReteTuple) it.next() ) {
+
+ // need to clone the tuples to avoid concurrent modification exceptions
+ Entry[] tuples = memory.getTupleMemory().toArray();
+ for ( int i = 0; i < tuples.length; i++ ) {
+ ReteTuple tuple = (ReteTuple) tuples[i];
if ( this.constraints.isAllowedCachedRight( tuple ) ) {
this.retractTuple( tuple,
context,
@@ -234,10 +238,13 @@
return;
}
- final Iterator it = memory.getTupleMemory().iterator();
this.constraints.updateFromFactHandle( workingMemory,
handle );
- for ( ReteTuple tuple = (ReteTuple) it.next(); tuple != null; tuple = (ReteTuple) it.next() ) {
+
+ // need to clone the tuples to avoid concurrent modification exceptions
+ Entry[] tuples = memory.getTupleMemory().toArray();
+ for ( int i = 0; i < tuples.length; i++ ) {
+ ReteTuple tuple = (ReteTuple) tuples[i];
if ( this.constraints.isAllowedCachedRight( tuple ) ) {
this.retractTuple( tuple,
context,
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleMemory.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleMemory.java 2007-05-28 22:28:05 UTC (rev 12189)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/TupleMemory.java 2007-05-28 23:16:22 UTC (rev 12190)
@@ -20,5 +20,7 @@
public int size();
public Entry[] getTable();
+
+ public Entry[] toArray();
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2007-05-28 22:28:05 UTC (rev 12189)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/util/AbstractHashTable.java 2007-05-28 23:16:22 UTC (rev 12190)
@@ -96,6 +96,19 @@
this.table = newTable;
this.threshold = (int) (newCapacity * this.loadFactor);
}
+
+ public Entry[] toArray() {
+ Entry[] result = new Entry[this.size];
+ int index = 0;
+ for ( int i = 0; i < this.table.length; i++ ) {
+ Entry entry = this.table[i];
+ while ( entry != null ) {
+ result[index++] = entry;
+ entry = entry.getNext();
+ }
+ }
+ return result;
+ }
// public void add(Entry entry) {
// int index = indexOf( entry.hashCode(), table.length );
More information about the jboss-svn-commits
mailing list