[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