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

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Jun 5 10:22:56 EDT 2009


Author: jhalliday
Date: 2009-06-05 10:22:56 -0400 (Fri, 05 Jun 2009)
New Revision: 26852

Modified:
   labs/jbosstm/branches/JBOSSTS_4_2_3_GA_CP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
Log:
backport _syncs concurrency handling fix. JBTM-365


Modified: labs/jbosstm/branches/JBOSSTS_4_2_3_GA_CP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_2_3_GA_CP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2009-06-05 14:17:48 UTC (rev 26851)
+++ labs/jbosstm/branches/JBOSSTS_4_2_3_GA_CP/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TwoPhaseCoordinator.java	2009-06-05 14:22:56 UTC (rev 26852)
@@ -143,11 +143,14 @@
 					}
 				}
 
-				if (_synchs.add(sr))
-				{
-					result = AddOutcome.AR_ADDED;
-				}
-			}
+                // 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;
@@ -230,14 +233,20 @@
 			 */
 
 			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) {
 
-				// if new Synchronization have been registered, refresh our copy of the collection:
-				if(copiedSynchs.length != _synchs.size()) {
-					copiedSynchs = (SynchronizationRecord[])_synchs.toArray(new SynchronizationRecord[] {});
-				}
+                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;
 				_currentRecord = copiedSynchs[lastIndexProcessed];
@@ -359,8 +368,10 @@
 				}
 			}
 
-			_synchs = null;
-			_currentRecord = null;
+            synchronized (_synchs) {
+                // nulling _syncs causes concurrency problems, so dispose contents instead:
+                _synchs.clear();
+            }
 		}
 
 		return !problem;




More information about the jboss-svn-commits mailing list