[jboss-svn-commits] JBL Code SVN: r20099 - labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed May 21 06:50:09 EDT 2008


Author: adinn
Date: 2008-05-21 06:50:09 -0400 (Wed, 21 May 2008)
New Revision: 20099

Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
Log:
added synchronization around uses of _synchs treeset under addSynch and beforeCompletion processing to guard against potential concurrent updates from client code. fix for JBTM-365

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2008-05-21 09:26:47 UTC (rev 20098)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2008-05-21 10:50:09 UTC (rev 20099)
@@ -145,12 +145,14 @@
 						return AddOutcome.AR_REJECTED;
 					}
 				}
-
+                // need to guard against synchs being added while we are performing beforeCompletion processing
+                synchronized (_synchs) {
 				if (_synchs.add(sr))
 				{
 					result = AddOutcome.AR_ADDED;
 				}
-			}
+                }
+            }
 			break;
 		default:
 			break;
@@ -239,16 +241,21 @@
 					 */
 
 					int lastIndexProcessed = -1;
-					SynchronizationRecord[] copiedSynchs = (SynchronizationRecord[])_synchs.toArray(new SynchronizationRecord[] {});
-
+                    SynchronizationRecord[] copiedSynchs;
+                    // need to guard against synchs being added while we are performing beforeCompletion processing
+                    synchronized (_synchs) {
+                        copiedSynchs = (SynchronizationRecord[])_synchs.toArray(new SynchronizationRecord[] {});
+                    }
 					while( (lastIndexProcessed < _synchs.size()-1) && !problem) {
 
+                        synchronized (_synchs) {
 						// if new Synchronization have been registered, refresh our copy of the collection:
 						if(copiedSynchs.length != _synchs.size()) {
 							copiedSynchs = (SynchronizationRecord[])_synchs.toArray(new SynchronizationRecord[] {});
 						}
+                        }
 
-						lastIndexProcessed = lastIndexProcessed+1;
+                        lastIndexProcessed = lastIndexProcessed+1;
 						_currentRecord = copiedSynchs[lastIndexProcessed];
 
 						try




More information about the jboss-svn-commits mailing list