[jboss-svn-commits] JBL Code SVN: r5400 - in labs/jbosstm/trunk: ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore ArjunaJTA/jta/classes/com/arjuna/ats/jta/common ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspe! cific/hporb/interceptors/interposition ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts atsintegration/classes/com/arjuna/ats/jbossatx/jta atsintegration/classes/com/arjuna/ats/jbossatx/jts

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Wed Aug 2 04:42:36 EDT 2006


Author: kevin.conner at jboss.com
Date: 2006-08-02 04:42:06 -0400 (Wed, 02 Aug 2006)
New Revision: 5400

Modified:
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java
   labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl
   labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java
   labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
   labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java
   labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java
   labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java
   labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java
Log:
4.2.1 update to JTA/JTS/core/integration

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/AtomicAction.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -129,7 +129,7 @@
 	public int begin (int timeout)
 	{
 		int status = super.start();
-
+        
 		if (status == ActionStatus.RUNNING)
 		{
 			/*

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/BasicAction.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -849,7 +849,8 @@
 				if (_childThreads == null)
 					_childThreads = new Hashtable();
 
-				_childThreads.put(t.getName(), t); // makes sure so we don't get
+                final String threadId = Integer.toHexString(System.identityHashCode(t)) ;
+				_childThreads.put(threadId, t); // makes sure so we don't get
 												   // duplicates
 
 				result = true;
@@ -880,7 +881,8 @@
 
 	public final boolean removeChildThread () // current thread
 	{
-		return removeChildThread(Thread.currentThread().getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		return removeChildThread(threadId);
 	}
 
 	/**

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/coordinator/TransactionReaper.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -113,8 +113,16 @@
 		_list = null;
 	}
 
-	public final long checkingPeriod ()
+	public final synchronized long checkingPeriod ()
 	{
+        if (_dynamic)
+        {
+            final ReaperElement head = (ReaperElement)_list.peak() ;
+            if (head != null)
+            {
+                return head._absoluteTimeout - System.currentTimeMillis() ;
+            }
+        }
 		return _checkPeriod;
 	}
 
@@ -129,12 +137,11 @@
 	 * Timeout is given in milliseconds.
 	 */
 
-	public final boolean check (long timeout)
+	public final boolean check()
 	{
 		if (tsLogger.arjLogger.debugAllowed())
 		{
-			tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "TransactionReaper::check ( "
-					+ timeout + " )");
+			tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "TransactionReaper::check ()");
 		}
 
 		if (_list.size() == 0)
@@ -151,97 +158,86 @@
 				{ Long.toString(e._absoluteTimeout) });
 			}
 
-			if (timeout >= e._absoluteTimeout)
-				break;
-			else
-			{
-				iter = null;
-				return true;
-			}
-		}
+            final long now = System.currentTimeMillis() ; 
+			if (now >= e._absoluteTimeout)
+            {
+                if (e._control.running())
+                {
+                    /*
+                     * If this is a local transaction, then we can roll it back
+                     * completely. Otherwise, just mark it as rollback only.
+                     */
 
-		iter = null;
+                    boolean problem = false;
 
-		if (e != null)
-		{
-			/*
-			 * Only force rollback if the transaction is still running.
-			 */
+                    try
+                    {
+                        if (e._control.cancel() == ActionStatus.ABORTED)
+                        {
+                            if (tsLogger.arjLoggerI18N.debugAllowed())
+                            {
+                                tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
+                                { e._control.get_uid() });
+                            }
+                        }
+                        else
+                            problem = true;
+                    }
+                    catch (Exception ex2)
+                    {
+                        if (tsLogger.arjLoggerI18N.isWarnEnabled())
+                        {
+                            tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_4", new Object[]
+                            { e._control });
+                        }
 
-			if (e._control.running())
-			{
-				/*
-				 * If this is a local transaction, then we can roll it back
-				 * completely. Otherwise, just mark it as rollback only.
-				 */
+                        problem = true;
+                    }
 
-				boolean problem = false;
+                    if (problem)
+                    {
+                        boolean error = false;
+                        boolean printDebug = tsLogger.arjLoggerI18N.isWarnEnabled();
 
-				try
-				{
-					if (e._control.cancel() == ActionStatus.ABORTED)
-					{
-						if (tsLogger.arjLoggerI18N.debugAllowed())
-						{
-							tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
-							{ e._control.get_uid() });
-						}
-					}
-					else
-						problem = true;
-				}
-				catch (Exception ex2)
-				{
-					if (tsLogger.arjLoggerI18N.isWarnEnabled())
-					{
-						tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_4", new Object[]
-						{ e._control });
-					}
+                        try
+                        {
+                            error = !e._control.preventCommit();
+                        }
+                        catch (Exception ex3)
+                        {
+                            error = true;
+                        }
 
-					problem = true;
-				}
+                        if (error || printDebug)
+                        {
+                            if (error)
+                            {
+                                if (tsLogger.arjLoggerI18N.isWarnEnabled())
+                                {
+                                    tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_5", new Object[]
+                                    { e._control });
+                                }
+                            }
+                            else
+                            {
+                                if (tsLogger.arjLoggerI18N.debugAllowed())
+                                {
+                                    tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
+                                    { e._control });
+                                }
+                            }
+                        }
+                    }
+                }
 
-				if (problem)
-				{
-					boolean error = false;
-					boolean printDebug = tsLogger.arjLoggerI18N.isWarnEnabled();
-
-					try
-					{
-						error = !e._control.preventCommit();
-					}
-					catch (Exception ex3)
-					{
-						error = true;
-					}
-
-					if (error || printDebug)
-					{
-						if (error)
-						{
-							if (tsLogger.arjLoggerI18N.isWarnEnabled())
-							{
-								tsLogger.arjLoggerI18N.warn("com.arjuna.ats.arjuna.coordinator.TransactionReaper_5", new Object[]
-								{ e._control });
-							}
-						}
-						else
-						{
-							if (tsLogger.arjLoggerI18N.debugAllowed())
-							{
-								tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC, FacilityCode.FAC_ATOMIC_ACTION, "com.arjuna.ats.arjuna.coordinator.TransactionReaper_3", new Object[]
-								{ e._control });
-							}
-						}
-					}
-				}
+                _list.remove(e);
+            }
+			else
+			{
+				break;
 			}
-
-			_list.remove(e);
 		}
 
-		System.gc(); // do some garbage collection while we're at it!
-
 		return true;
 	}
 
@@ -275,24 +271,25 @@
 		if (timeout == 0)
 			return true;
 
-		TransactionReaper._lifetime += timeout;
-
-		/*
-		 * If the timeout for this transaction is less than the current timeout
-		 * for the reaper thread (or one is not set for the reaper thread) then
-		 * use that timeout and interrupt the thread to get it to recheck.
-		 */
-
-		if ((timeout < _checkPeriod) || (_checkPeriod == Long.MAX_VALUE))
-		{
-			_checkPeriod = timeout * 1000; // convert to milliseconds!
-			TransactionReaper._reaperThread.interrupt();
-		}
-
 		ReaperElement e = new ReaperElement(control, timeout);
 
 		synchronized (this)
 		{
+            TransactionReaper._lifetime += timeout;
+
+            /*
+             * If the timeout for this transaction is less than the current timeout
+             * for the reaper thread (or one is not set for the reaper thread) then
+             * use that timeout and interrupt the thread to get it to recheck.
+             */
+
+            final long timeoutms = timeout*1000 ;
+            if ((timeoutms < _checkPeriod) || (_checkPeriod == Long.MAX_VALUE))
+            {
+                _checkPeriod = timeoutms ; // convert to milliseconds!
+                notify();
+            }
+
 			if (_list.insert(e))
 				return true;
 			else
@@ -491,7 +488,7 @@
 	 * Don't bother synchronizing as this is only an estimate anyway.
 	 */
 
-	public static final long transactionLifetime ()
+	public static final synchronized long transactionLifetime ()
 	{
 		return TransactionReaper._lifetime;
 	}

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/thread/TransactionalThread.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -56,7 +56,8 @@
     {
 	if (action != null)
 	{
-	    action.removeChildThread(this.getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(this)) ;
+	    action.removeChildThread(threadId);
 	    action = null;
 	}
     }
@@ -68,14 +69,15 @@
 	 * should work!
 	 */
 
-	if (actions.get(thread.getName()) == null)
+    final String threadId = Integer.toHexString(System.identityHashCode(thread)) ;
+	if (actions.get(threadId) == null)
 	{
 	    BasicAction currentAction = BasicAction.Current();
 
 	    if (currentAction != null)
 	    {
 		currentAction.addChildThread(thread);
-		actions.put(thread.getName(), currentAction);
+		actions.put(threadId, currentAction);
 		
 		currentAction = null;
 	    }
@@ -86,13 +88,14 @@
 
 public static void destroy (Thread thread) throws IllegalArgumentException
     {
-	BasicAction currentAction = (BasicAction) actions.remove(thread.getName());
+    final String threadId = Integer.toHexString(System.identityHashCode(thread)) ;
+	BasicAction currentAction = (BasicAction) actions.remove(threadId);
 
 	if (currentAction != null)
 	{
 	    if (currentAction != null)
 	    {
-		currentAction.removeChildThread(thread.getName());
+		currentAction.removeChildThread(threadId);
 		currentAction = null;
 	    }
 	}

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/coordinator/ReaperThread.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -34,8 +34,6 @@
 import com.arjuna.ats.arjuna.logging.tsLogger;
 import com.arjuna.ats.arjuna.logging.FacilityCode;
 
-import com.arjuna.ats.arjuna.coordinator.BasicAction;
-import com.arjuna.ats.arjuna.coordinator.ActionStatus;
 import com.arjuna.ats.arjuna.coordinator.TransactionReaper;
 
 import com.arjuna.common.util.logging.*;
@@ -66,80 +64,48 @@
 
 public void run ()
     {
-	if (tsLogger.arjLogger.debugAllowed())
-	{
-	    tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
-				     FacilityCode.FAC_ATOMIC_ACTION, "ReaperThread.run ()");
-	}
-	
-	for (;;)
-	{
-	    /*
-	     * Cannot assume we sleep for the entire period. We may
-	     * be interrupted. If we are, just run a check anyway and
-	     * ignore.
-	     */
-
-	    boolean done = false;
-	    
-	    while (!done)
-	    {
-		sleepPeriod = reaperObject.checkingPeriod();
-
-		long oldPeriod = sleepPeriod;
-		long beforeTime = System.currentTimeMillis();
-
-		try
-		{
-		    if (tsLogger.arjLoggerI18N.debugAllowed())
-		    {
-			tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
-						     FacilityCode.FAC_ATOMIC_ACTION,
-						     "com.arjuna.ats.internal.arjuna.coordinator.ReaperThread_1", 
-						     new Object[]{Thread.currentThread(),
-								  Long.toString(sleepPeriod)});
-		    }
-
-		    Thread.sleep(sleepPeriod);
-
-		    done = true;
-		}
-		catch (InterruptedException e1)
-		{
-		    /*
-		     * Has timeout been changed?
-		     */
-
-		    if (reaperObject.checkingPeriod() != oldPeriod)
-		    {
-			done = true;
-		    }
-		    else
-		    {
-			long afterTime = System.currentTimeMillis();
-
-			if (afterTime - beforeTime < reaperObject.checkingPeriod())
-			{
-			    done = true;
-			}
-		    }
-		}
-		catch (Exception e2)
-		{
-		    done = true;
-		}
-	    }
-
-	    if (_shutdown)
-		return;
-
-	    reaperObject.check(System.currentTimeMillis());
-
-	    if (reaperObject.numberOfTransactions() == 0)
-	    {
-		sleepPeriod = Long.MAX_VALUE;
-	    }
-	}
+    	if (tsLogger.arjLogger.debugAllowed())
+    	{
+    	    tsLogger.arjLogger.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
+    				     FacilityCode.FAC_ATOMIC_ACTION, "ReaperThread.run ()");
+    	}
+    	
+    	for (;;)
+    	{
+    	    /*
+    	     * Cannot assume we sleep for the entire period. We may
+    	     * be interrupted. If we are, just run a check anyway and
+    	     * ignore.
+    	     */
+    
+            synchronized(reaperObject)
+            {
+        		sleepPeriod = reaperObject.checkingPeriod();
+        
+                if (sleepPeriod > 0)
+                {
+            		try
+            		{
+            		    if (tsLogger.arjLoggerI18N.isDebugEnabled())
+            		    {
+            		        tsLogger.arjLoggerI18N.debug(DebugLevel.FUNCTIONS, VisibilityLevel.VIS_PUBLIC,
+            						     FacilityCode.FAC_ATOMIC_ACTION,
+            						     "com.arjuna.ats.internal.arjuna.coordinator.ReaperThread_1", 
+            						     new Object[]{Thread.currentThread(),
+            								  Long.toString(sleepPeriod)});
+            		    }
+            
+            		    reaperObject.wait(sleepPeriod);
+            		}
+            		catch (InterruptedException e1) {}
+                }
+            }
+    
+    	    if (_shutdown)
+    	        return;
+    
+    	    reaperObject.check();
+    	}
     }
 
     public void shutdown ()
@@ -153,4 +119,3 @@
 
     
 }
-

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/objectstore/jdbc/oracle_driver.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -41,10 +41,7 @@
  */
 package com.arjuna.ats.internal.arjuna.objectstore.jdbc;
 
-import java.io.IOException;
-
 import java.sql.Blob;
-import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -67,6 +64,8 @@
 
 public class oracle_driver extends JDBCImple
 {
+    private static final int MAX_RETRIES = 10 ;
+    
 	public InputObjectState read_state (Uid objUid, String tName, int ft, String tableName) throws ObjectStoreException
 	{
 		InputObjectState newImage = null;
@@ -81,47 +80,62 @@
 				int pool = getPool();
 				ResultSet rs = null;
 
-				try
-				{
-					PreparedStatement pstmt = _preparedStatements[pool][READ_STATE];
+                try
+                {
+                    for(int count = 0 ; count < MAX_RETRIES ; count++)
+                    {
+        				try
+        				{
+        					PreparedStatement pstmt = _preparedStatements[pool][READ_STATE];
+        
+        					if (pstmt == null)
+        					{
+        						pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ?");
+        
+        						_preparedStatements[pool][READ_STATE] = pstmt;
+        					}
+        
+        					pstmt.setString(1, objUid.stringForm());
+        					pstmt.setString(2, tName);
+        					pstmt.setInt(3, ft);
+        
+        					rs = pstmt.executeQuery();
+        
+        					if(! rs.next()) {
+        						return null; // no matching state in db
+        					}
+        					
+        					Blob myBlob = (Blob)rs.getBlob(1);
+        					byte[] buffer = myBlob.getBytes(1, (int)myBlob.length());
+        
+        					if (buffer != null)
+        					{
+        						newImage = new InputObjectState(objUid, tName, buffer);
+        					}
+        					else {
+        					    if (tsLogger.arjLoggerI18N.isWarnEnabled())
+        						tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_1");
+        					}
 
-					if (pstmt == null)
-					{
-						pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ?");
-
-						_preparedStatements[pool][READ_STATE] = pstmt;
-					}
-
-					pstmt.setString(1, objUid.stringForm());
-					pstmt.setString(2, tName);
-					pstmt.setInt(3, ft);
-
-					rs = pstmt.executeQuery();
-
-					if(! rs.next()) {
-						return null; // no matching state in db
-					}
-					
-					Blob myBlob = (Blob)rs.getBlob(1);
-					byte[] buffer = myBlob.getBytes(1, (int)myBlob.length());
-
-					if (buffer != null)
-					{
-						newImage = new InputObjectState(objUid, tName, buffer);
-					}
-					else {
-					    if (tsLogger.arjLoggerI18N.isWarnEnabled())
-						tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_1");
-					}
-				}
-				catch (Throwable e)
-				{
-					if(retryConnection(e, pool)) {
-						return read_state(objUid, tName, ft, tableName);
-					} else {
-						throw new ObjectStoreException(e.toString());
-					}
-				}
+                            return newImage;
+        				}
+        				catch (Throwable e)
+        				{
+                            if (count == MAX_RETRIES-1)
+                            {
+                                throw new ObjectStoreException(e.toString());
+                            }
+                            try
+                            {
+                                reconnect(pool) ;
+                            }
+                            catch (final Throwable th)
+                            {
+                                throw new ObjectStoreException(e.toString());
+                            }
+        				}
+                    }
+                }
 				finally
 				{
 					try
@@ -134,18 +148,15 @@
 					freePool(pool);
 				}
 			}
+            return newImage;
 		}
 		else
 			throw new ObjectStoreException("oracle.read_state - object with uid "+objUid+" has no TypeName");
-
-		return newImage;
 	}
 
 	
 	public boolean write_state (Uid objUid, String tName, OutputObjectState state, int s, String tableName) throws ObjectStoreException
 	{
-		boolean result = false;
-
 		int imageSize = (int) state.length();
 
 		if (imageSize > _maxStateSize)
@@ -159,75 +170,90 @@
 			ResultSet rs = null;
 			ResultSet rs3 = null;
 
-			try
-			{
-				PreparedStatement pstmt = _preparedStatements[pool][READ_WRITE_SHORTCUT];
-
-				_theConnection[pool].setAutoCommit(false);
-
-				if (pstmt == null)
-				{
-					pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND StateType = ? AND TypeName = ? FOR UPDATE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
-					_preparedStatements[pool][READ_WRITE_SHORTCUT] = pstmt;
-				}
-				pstmt.setString(1, objUid.stringForm());
-				pstmt.setInt(2, s);
-				pstmt.setString(3, tName);
-
-				rs = pstmt.executeQuery();
-
-				if( rs.next() ) {
-
-					BLOB myBlob = (BLOB)rs.getBlob(1);
-					myBlob.putBytes(1, b);
-
-				} else {
-					// not in database, do insert:
-					PreparedStatement pstmt2 = _preparedStatements[pool][WRITE_STATE_NEW];
-
-					if (pstmt2 == null)
-					{
-						pstmt2 = _theConnection[pool].prepareStatement("INSERT INTO "+tableName+" (StateType,TypeName,UidString,ObjectState) VALUES (?,?,?,empty_blob())");
-
-						_preparedStatements[pool][WRITE_STATE_NEW] = pstmt2;
-					}
-
-					pstmt2.setInt(1, s);
-					pstmt2.setString(2, tName);
-					pstmt2.setString(3, objUid.stringForm());
-
-					pstmt2.executeUpdate();
-					_theConnection[pool].commit();
-
-					PreparedStatement pstmt3 = _preparedStatements[pool][SELECT_FOR_WRITE_STATE];
-					if(pstmt3 == null) {
-						pstmt3 = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ? FOR UPDATE");
-						_preparedStatements[pool][SELECT_FOR_WRITE_STATE] = pstmt3;
-					}
-
-					pstmt3.setString(1, objUid.stringForm());
-					pstmt3.setString(2, tName);
-					pstmt3.setInt(3, s);
-
-					rs3 = pstmt3.executeQuery();
-					rs3.next();
-					BLOB myBlob = (BLOB)rs3.getBlob(1);
-					myBlob.putBytes(1, b);
-				}
-
-				_theConnection[pool].commit();
-				result = true;
-
-			}
-			catch(Throwable e)
-			{
-				if(retryConnection(e, pool)) {
-					return write_state(objUid, tName, state, s, tableName);
-				} else {
-				    if (tsLogger.arjLoggerI18N.isWarnEnabled())
-					tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_2", new Object[] {e});
-				}
-			}
+            try
+            {
+                for(int count = 0 ; count < MAX_RETRIES ; count++)
+                {
+        			try
+        			{
+        				PreparedStatement pstmt = _preparedStatements[pool][READ_WRITE_SHORTCUT];
+        
+        				_theConnection[pool].setAutoCommit(false);
+        
+        				if (pstmt == null)
+        				{
+        					pstmt = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND StateType = ? AND TypeName = ? FOR UPDATE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);
+        					_preparedStatements[pool][READ_WRITE_SHORTCUT] = pstmt;
+        				}
+        				pstmt.setString(1, objUid.stringForm());
+        				pstmt.setInt(2, s);
+        				pstmt.setString(3, tName);
+        
+        				rs = pstmt.executeQuery();
+        
+        				if( rs.next() ) {
+        
+        					BLOB myBlob = (BLOB)rs.getBlob(1);
+        					myBlob.putBytes(1, b);
+        
+        				} else {
+        					// not in database, do insert:
+        					PreparedStatement pstmt2 = _preparedStatements[pool][WRITE_STATE_NEW];
+        
+        					if (pstmt2 == null)
+        					{
+        						pstmt2 = _theConnection[pool].prepareStatement("INSERT INTO "+tableName+" (StateType,TypeName,UidString,ObjectState) VALUES (?,?,?,empty_blob())");
+        
+        						_preparedStatements[pool][WRITE_STATE_NEW] = pstmt2;
+        					}
+        
+        					pstmt2.setInt(1, s);
+        					pstmt2.setString(2, tName);
+        					pstmt2.setString(3, objUid.stringForm());
+        
+        					pstmt2.executeUpdate();
+        					_theConnection[pool].commit();
+        
+        					PreparedStatement pstmt3 = _preparedStatements[pool][SELECT_FOR_WRITE_STATE];
+        					if(pstmt3 == null) {
+        						pstmt3 = _theConnection[pool].prepareStatement("SELECT ObjectState FROM "+tableName+" WHERE UidString = ? AND TypeName = ? AND StateType = ? FOR UPDATE");
+        						_preparedStatements[pool][SELECT_FOR_WRITE_STATE] = pstmt3;
+        					}
+        
+        					pstmt3.setString(1, objUid.stringForm());
+        					pstmt3.setString(2, tName);
+        					pstmt3.setInt(3, s);
+        
+        					rs3 = pstmt3.executeQuery();
+        					rs3.next();
+        					BLOB myBlob = (BLOB)rs3.getBlob(1);
+        					myBlob.putBytes(1, b);
+        				}
+        
+        				_theConnection[pool].commit();
+                        return true ;
+        
+        			}
+        			catch(Throwable e)
+        			{
+                        if (count == MAX_RETRIES-1)
+                        {
+                            if (tsLogger.arjLoggerI18N.isWarnEnabled()) {
+                                tsLogger.arjLoggerI18N.warn("com.arjuna.ats.internal.arjuna.objectstore.jdbc.oracle_2", new Object[] {e});
+                            }
+                            return false ;
+                        }
+                        try
+                        {
+                            reconnect(pool) ;
+                        }
+                        catch (final Throwable th)
+                        {
+                            throw new ObjectStoreException(e.toString());
+                        }
+        			}
+                }
+            }
 			finally
 			{
 				try
@@ -254,7 +280,7 @@
 				freePool(pool);
 			}
 		}
-		return result;
+		return false ;
 	}
 
 

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedList.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -217,20 +217,16 @@
 	{
 	    if (ptr.car() == element)  // we mean '==' rather than equals
 	    {
-		OrderedListEntry oldcons = ptr;
-	    
 		// unlink the cons cell for the element we're removing
 		
 		if (prev != null)
 		    prev.setfCdr(ptr.cdr());
 		else
 		    _headOfList = ptr.cdr();
+        ptr.setfCdr(null) ;
 
 		_entryCount--;
 	    
-		// flush the dead cons cell
-		oldcons = null;
-	    
 		return true;
 	    }
 	}
@@ -250,6 +246,7 @@
 	    OrderedListElement p = _headOfList.car();
 
 	    _headOfList = remove.cdr();
+        remove.setfCdr(null) ;
 	    _entryCount--;
 
 	    remove = null;
@@ -259,6 +256,20 @@
 	else
 	    return null;
     }
+    
+    public final synchronized OrderedListElement peak()
+    {
+        if (_headOfList != null)
+        {
+            return _headOfList.car();
+        }
+        return null;
+    }
+    
+    final synchronized OrderedListEntry head()
+    {
+        return _headOfList;
+    }
 
     /**
      * Empty the list.
@@ -283,8 +294,8 @@
 	return _entryCount;
     }
 
-protected OrderedListEntry _headOfList;
-protected long             _entryCount;
+private OrderedListEntry _headOfList;
+private long             _entryCount;
     
 private boolean _increasing;
 

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListEntry.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -51,17 +51,17 @@
 	return _theElement;
     }
 
-public final OrderedListEntry cdr ()
+public synchronized final OrderedListEntry cdr ()
     {
 	return _next;
     }
 
-public final void setfCdr (OrderedListEntry n)
+public synchronized final void setfCdr (OrderedListEntry n)
     {
 	_next = n;
     }
 
-private OrderedListElement _theElement;
+private final OrderedListElement _theElement;
 private OrderedListEntry _next;
 
 };

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/template/OrderedListIterator.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -48,7 +48,7 @@
 
 public OrderedListIterator (OrderedList L)
     {
-	ptr = L._headOfList;
+	ptr = L.head();
     }
 
 public void finalize ()
@@ -60,7 +60,7 @@
      * Return the next item in the list.
      */
 
-public synchronized OrderedListElement iterate ()
+public OrderedListElement iterate ()
     {
 	if (ptr != null)
 	{

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/thread/ThreadActionData.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -145,13 +145,15 @@
 
 	public static BasicAction popAction () throws EmptyStackException
 	{
-		return popAction(Thread.currentThread().getName(), true);
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		return popAction(threadId, true);
 	}
 
 	public static BasicAction popAction (boolean unregister)
 			throws EmptyStackException
 	{
-		return popAction(Thread.currentThread().getName(), unregister);
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		return popAction(threadId, unregister);
 	}
 
 	public static BasicAction popAction (String threadId)
@@ -206,7 +208,10 @@
 			throws NoSuchElementException
 	{
 		if ((act != null) && (unregister))
-			act.removeChildThread(t.getName());
+        {
+            final String threadId = Integer.toHexString(System.identityHashCode(t)) ;
+			act.removeChildThread(threadId);
+        }
 
 		Stack txs = (Stack) _threadList.get();
 
@@ -246,7 +251,10 @@
 					BasicAction act = (BasicAction) txs.pop();
 
 					if (act != null)
-						act.removeChildThread(t.getName());
+                    {
+                        final String threadId = Integer.toHexString(System.identityHashCode(t)) ;
+						act.removeChildThread(threadId);
+                    }
 				}
 			}
 		}

Modified: labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java
===================================================================
--- labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaCore/arjuna/classes/com/arjuna/ats/internal/arjuna/utils/XATxConverter.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -168,7 +168,7 @@
 
 	    System.arraycopy(xid.data, nodeNameIndex, buff, 0, buff.length);
 
-	    Uid tx = new Uid(new String(buff), false);
+	    Uid tx = new Uid(new String(buff), true);
 
 	    buff = null;
 

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/BaseTransaction.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -83,8 +83,8 @@
 			}
 		}
 
-		Integer value = (Integer) _timeouts.get(Thread.currentThread()
-				.getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		Integer value = (Integer) _timeouts.get(threadId);
 		int v = 0; // if not set then assume 0. What else can we do?
 
 		if (value != null)
@@ -213,13 +213,14 @@
 	public void setTransactionTimeout(int seconds)
 			throws javax.transaction.SystemException
 	{
-		_timeouts.put(Thread.currentThread().getName(), new Integer(seconds));
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		_timeouts.put(threadId, new Integer(seconds));
 	}
 
 	public int getTimeout() throws javax.transaction.SystemException
 	{
-		Integer value = (Integer) _timeouts.get(Thread.currentThread()
-				.getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		Integer value = (Integer) _timeouts.get(threadId);
 
 		if (value != null)
 		{
@@ -262,7 +263,8 @@
 			throw new javax.transaction.SystemException(e2.toString());
 		}
 		
-		Integer value = (Integer) _timeouts.get(Thread.currentThread().getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		Integer value = (Integer) _timeouts.get(threadId);
 		int v = 0; // if not set then assume 0. What else can we do?
 		
 		if (value != null)

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/TransactionImple.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -37,6 +37,9 @@
 import com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple;
 import com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord;
 
+import com.arjuna.ats.jta.common.Configuration;
+import com.arjuna.ats.jta.common.Environment;
+import com.arjuna.ats.jta.common.jtaPropertyManager;
 import com.arjuna.ats.jta.utils.XAHelper;
 import com.arjuna.ats.jta.xa.XidImple;
 import com.arjuna.ats.jta.logging.*;
@@ -98,6 +101,7 @@
 		_resources = new Hashtable();
 		_duplicateResources = new Hashtable();
 		_suspendCount = 0;
+		_xaTransactionTimeoutEnabled = getXATransactionTimeoutEnabled() ;
 	}
 
 	/**
@@ -629,29 +633,32 @@
 				{
 					try
 					{
+                        if (_xaTransactionTimeoutEnabled)
+                        {
+                            int timeout = _theTransaction.getTimeout();
+
+                            if (timeout > 0)
+                            {
+                                try
+                                {
+                                    xaRes.setTransactionTimeout(timeout);
+                                }
+                                catch (XAException te)
+                                {
+                                    if (jtaLogger.loggerI18N.isWarnEnabled())
+                                    {
+                                        jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
+                                        { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
+                                    }
+                                }
+                            }
+                        }
+
 						int xaStartNormal = ((theModifier == null) ? XAResource.TMNOFLAGS
 								: theModifier.xaStartParameters(XAResource.TMNOFLAGS));
 
 						xaRes.start(xid, xaStartNormal);
 
-						int timeout = _theTransaction.getTimeout();
-
-						if (timeout > 0)
-						{
-							try
-							{
-								xaRes.setTransactionTimeout(timeout);
-							}
-							catch (XAException te)
-							{
-								if (jtaLogger.loggerI18N.isWarnEnabled())
-								{
-									jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
-									{ "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
-								}
-							}
-						}
-
 						associatedWork = true;
 
 						_resources.put(xaRes, new TxInfo(xid));
@@ -690,8 +697,8 @@
 						{
 							if (jtaLogger.loggerI18N.isWarnEnabled())
 							{
-								jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.enliststartfailed", new Object[]
-								{ "TransactionImple.enlistResource", xid });
+								jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.enliststarterror", new Object[]
+                                { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(e), xid });
 							}
 
 							markRollbackOnly();
@@ -1116,6 +1123,7 @@
 		}
 		
 		_suspendCount = 0;
+		_xaTransactionTimeoutEnabled = getXATransactionTimeoutEnabled() ;
 	}
 
 	final com.arjuna.ats.arjuna.AtomicAction getAtomicAction()
@@ -1541,12 +1549,38 @@
 		_transactions.remove(tx.get_uid());
 	}
 
+	private static boolean getXATransactionTimeoutEnabled()
+	{
+		final Boolean xaTransactionTimeoutEnabled = Configuration.getXATransactionTimeoutEnabled() ;
+		if (xaTransactionTimeoutEnabled != null)
+		{
+			return xaTransactionTimeoutEnabled.booleanValue() ;
+		}
+		return XA_TRANSACTION_TIMEOUT_ENABLED ;
+	}
+
 	protected com.arjuna.ats.arjuna.AtomicAction _theTransaction;
 
 	private Hashtable _resources;
 	private Hashtable _duplicateResources;
 	private int _suspendCount;
+	private final boolean _xaTransactionTimeoutEnabled ;
 
+	private static final boolean XA_TRANSACTION_TIMEOUT_ENABLED ;
+
+	static
+	{
+		final String xaTransactionTimeoutEnabled = jtaPropertyManager.propertyManager.getProperty(Environment.XA_TRANSACTION_TIMEOUT_ENABLED) ;
+		if (xaTransactionTimeoutEnabled != null)
+		{
+			XA_TRANSACTION_TIMEOUT_ENABLED = Boolean.valueOf(xaTransactionTimeoutEnabled).booleanValue() ;
+		}
+		else
+		{
+			XA_TRANSACTION_TIMEOUT_ENABLED = true ;
+		}
+	}
+
 	private static Hashtable _transactions = new Hashtable();
 
 }

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Configuration.javatmpl	2006-08-02 08:42:06 UTC (rev 5400)
@@ -66,8 +66,19 @@
 	_propFile = file;
     }
 
+    public static synchronized final Boolean getXATransactionTimeoutEnabled()
+    {
+        return _xaTransactionTimeoutEnabled ;
+    }
+
+    public static synchronized final void setXATransactionTimeoutEnabled(final Boolean xaTransactionTimeoutEnabled)
+    {
+        _xaTransactionTimeoutEnabled = xaTransactionTimeoutEnabled ;
+    }
+
 private static String _lockStore = null;
 private static String _propFile = "@PROPERTIES_FILE@";
+private static Boolean _xaTransactionTimeoutEnabled ;
     
 }
 

Modified: labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTA/jta/classes/com/arjuna/ats/jta/common/Environment.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -54,6 +54,7 @@
     public static final String TM_JNDI_CONTEXT = "com.arjuna.ats.jta.utils.TMJNDIContext";
 
     public static final String XA_ERROR_HANDLER = "com.arjuna.ats.jta.xaErrorHandler";
+    public static final String XA_TRANSACTION_TIMEOUT_ENABLED = "com.arjuna.ats.jta.xaTransactionTimeoutEnabled";
 
 }
 

Modified: labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jtax/classes/com/arjuna/ats/internal/jta/transaction/jts/TransactionImple.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -46,7 +46,10 @@
 import com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator;
 
 import com.arjuna.ats.jta.xa.*;
+import com.arjuna.ats.jta.common.Configuration;
+import com.arjuna.ats.jta.common.Environment;
 import com.arjuna.ats.jta.logging.*;
+import com.arjuna.ats.jts.common.jtsPropertyManager;
 
 import com.arjuna.ats.internal.jta.xa.TxInfo;
 
@@ -685,25 +688,28 @@
 				{
 					try
 					{
-						xaRes.start(xid, XAResource.TMNOFLAGS);
+                        if (_xaTransactionTimeoutEnabled)
+                        {
+                            int timeout = _theTransaction.getTimeout();
 
-						int timeout = _theTransaction.getTimeout();
+                            if (timeout > 0)
+                            {
+                                try
+                                {
+                                    xaRes.setTransactionTimeout(timeout);
+                                }
+                                catch (XAException te)
+                                {
+                                    if (jtaLogger.loggerI18N.isWarnEnabled())
+                                    {
+                                        jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
+                                        { "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
+                                    }
+                                }
+                            }
+                        }
 
-						if (timeout > 0)
-						{
-							try
-							{
-								xaRes.setTransactionTimeout(timeout);
-							}
-							catch (XAException te)
-							{
-								if (jtaLogger.loggerI18N.isWarnEnabled())
-								{
-									jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.arjunacore.timeouterror", new Object[]
-									{ "TransactionImple.enlistResource", XAHelper.printXAErrorCode(te), xid });
-								}
-							}
-						}
+						xaRes.start(xid, XAResource.TMNOFLAGS);
 
 						associatedWork = true;
 
@@ -1218,6 +1224,7 @@
 
 			jtaLogger.loggerI18N.warn("com.arjuna.ats.internal.jta.transaction.jts.syncproblem", ex);
 		}
+		_xaTransactionTimeoutEnabled = getXATransactionTimeoutEnabled() ;
 	}
 
 	protected void commitAndDisassociate ()
@@ -1641,11 +1648,37 @@
 		}
 	}
 
+	private static boolean getXATransactionTimeoutEnabled()
+	{
+		final Boolean xaTransactionTimeoutEnabled = Configuration.getXATransactionTimeoutEnabled() ;
+		if (xaTransactionTimeoutEnabled != null)
+		{
+			return xaTransactionTimeoutEnabled.booleanValue() ;
+		}
+		return XA_TRANSACTION_TIMEOUT_ENABLED ;
+	}
+
 	protected AtomicTransaction _theTransaction;
 
 	private Hashtable _resources;
 	private Hashtable _duplicateResources;
 	private int _suspendCount;
+	private final boolean _xaTransactionTimeoutEnabled ;
+
+	private static final boolean XA_TRANSACTION_TIMEOUT_ENABLED ;
+
+	static
+	{
+		final String xaTransactionTimeoutEnabled = jtsPropertyManager.propertyManager.getProperty(Environment.XA_TRANSACTION_TIMEOUT_ENABLED) ;
+		if (xaTransactionTimeoutEnabled != null)
+		{
+			XA_TRANSACTION_TIMEOUT_ENABLED = Boolean.valueOf(xaTransactionTimeoutEnabled).booleanValue() ;
+		}
+		else
+		{
+			XA_TRANSACTION_TIMEOUT_ENABLED = true ;
+		}
+	}
 	
 	private static Hashtable _transactions = new Hashtable();
 

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/context/ContextManager.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -60,7 +60,6 @@
 import java.io.PrintStream;
 import java.util.*;
 import java.lang.Object;
-import org.omg.CORBA.CompletionStatus;
 import org.omg.CORBA.*;
 
 import org.omg.PortableInterceptor.*;
@@ -180,7 +179,8 @@
 						 com.arjuna.ats.jts.logging.FacilityCode.FAC_OTS, "ContextManager::current ()");
 	}
 
-	Object arg = otsCurrent.get(Thread.currentThread().getName());
+    final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+	Object arg = otsCurrent.get(threadId);
 	ControlWrapper wrapper = null;
 
 	if (arg != null)
@@ -317,7 +317,8 @@
 
     public final ControlWrapper popAction ()
     {
-	return popAction(Thread.currentThread().getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+        return popAction(threadId);
     }
 
     public final void purgeActions (String threadId)
@@ -348,7 +349,8 @@
 
     public final void purgeActions ()
     {
-	purgeActions(Thread.currentThread().getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+        purgeActions(threadId);
     }
 
     /**
@@ -592,8 +594,8 @@
 						 com.arjuna.ats.jts.logging.FacilityCode.FAC_OTS, "ContextManager::pushAction ()");
 	}
 
-	Thread ct = Thread.currentThread();
-	Stack sl = (Stack) otsCurrent.get(ct.getName());
+    final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+	Stack sl = (Stack) otsCurrent.get(threadId);
 	boolean isNew = false;
 	
 	if (sl == null)
@@ -621,7 +623,7 @@
 	sl.push(action);
 
 	if (isNew)
-	    otsCurrent.put(ct.getName(), sl);
+	    otsCurrent.put(threadId, sl);
 
 	associateContext();
 
@@ -684,7 +686,8 @@
 
 		    org.omg.CORBA.Any threadData = ORBManager.getORB().orb().create_any();
 
-		    threadData.insert_string(Thread.currentThread().getName());
+            final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		    threadData.insert_string(threadId);
 
 		    _piCurrent.set_slot(slotId, threadData);
 
@@ -835,7 +838,8 @@
 		{
 		    org.omg.CORBA.Any localDataAny = ORBManager.getORB().orb().create_any();
 
-		    localDataAny.insert_string(Thread.currentThread().getName());
+            final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		    localDataAny.insert_string(threadId);
 
 		    _piCurrent.set_slot(slotId, localDataAny);
 		}

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/internal/jts/coordinator/CheckedActions.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -42,23 +42,28 @@
 
     public static final synchronized void remove () throws SystemException
     {
-	otsCheckedAction.remove(Thread.currentThread().getName());
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+        otsCheckedAction.remove(threadId);
     }
     
     public static final synchronized CheckedAction get () throws SystemException
     {
-	if (otsCheckedAction != null)
-	    return (CheckedAction) otsCheckedAction.get(Thread.currentThread().getName());
-	else
-	    return null;
+    	if (otsCheckedAction != null)
+        {
+            final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+    	    return (CheckedAction) otsCheckedAction.get(threadId);
+        }
+    	else
+    	    return null;
     }
 
     public static final synchronized void set (CheckedAction ca) throws SystemException
     {
-	if (otsCheckedAction == null)
-	    otsCheckedAction = new Hashtable();
-
-	otsCheckedAction.put(Thread.currentThread().getName(), ca);
+    	if (otsCheckedAction == null)
+    	    otsCheckedAction = new Hashtable();
+    
+        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+    	otsCheckedAction.put(threadId, ca);
     }
 
     private static Hashtable otsCheckedAction = null;

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -181,7 +181,7 @@
 			throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.hporb.interceptors.context.invalidparam"));
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/hporb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -176,7 +176,7 @@
 			throw new UNKNOWN("Invalid PI tx parameter!");
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 		
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -183,7 +183,7 @@
 			throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.jacorb.interceptors.context.invalidparam"));
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/jacorb/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -181,7 +181,7 @@
 			throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.jacorb.interceptors.interposition.invalidparam"));
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -198,7 +198,7 @@
 			throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.javaidl.interceptors.context.invalidparam"));
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/javaidl/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -196,7 +196,7 @@
 			throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.javaidl.interceptors.interposition.invalidparam"));
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 		
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/context/ContextClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -178,7 +178,7 @@
 			throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.orbix2000.interceptors.context.invalidparam"));
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java
===================================================================
--- labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/ArjunaJTS/jts/classes/com/arjuna/ats/jts/orbspecific/orbix2000/interceptors/interposition/InterpositionClientRequestInterceptorImpl.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -178,7 +178,7 @@
 			throw new UNKNOWN(jtsLogger.logMesg.getString("com.arjuna.ats.internal.jts.orbspecific.orbix2000.interceptors.interposition.invalidparam"));
 		}
 		else
-		    threadId = Thread.currentThread().getName();
+		    threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
 		
 		if (threadId != null)
 		{

Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jta/PropagationContextManager.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -66,8 +66,6 @@
 			log.debug("PropagationContextManager.getTransactionPropagationContext - called");
 		}
 
-		String threadId = Thread.currentThread().getName();
-
 		String txid = ((BasicAction.Current() == null) ? null : BasicAction.Current().get_uid().stringForm());
 
 		return txid;

Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/internal/jbossatx/jts/PropagationContextManager.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -18,4 +18,5 @@
  * (C) 2005-2006,
  * @author JBoss Inc.
  */
-/*
 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
 *
 * Arjuna Technologies Ltd.
 * Newcastle upon Tyne,
 * Tyne and Wear,
 * UK.
 *
 * $Id: PropagationContextManager.java,v 1.5 2004/10/04 09:48:19 nmcl Exp $
 */

package com.arjuna.ats.internal.jbossatx.jts;

import org.jboss.tm.TransactionPropagationContextFactory;
import org.jboss.tm.TransactionPropagationContextImporter;
import org.jboss.logging.Logger;

import org.omg.CosTransactions.*;

import javax.transaction.Transaction;
import javax.naming.spi.ObjectFactory;
import javax.naming.Name;
import javax.naming.Context;

import java.util.Hashtable;
import java.io.Serializable;

import com.arjuna.ats.internal.jts.ControlWrapper;
import com.arjuna.ats.internal.jts.OTSImpleManager;
import com.arjuna.ats.jta.TransactionManager;
import com.arjuna.ats.jts.ExplicitInterposition;

public class PropagationContextManager
		implements TransactionPropagationContextFactory, TransactionPropagationContextImporter, ObjectFactory, Serializable
{
	private Logger log = org.jboss.logging.Logger.getLogger(PropagationContextManager.class);

	/**
	 *  Return a transaction propagation context for the transaction
	 *  currently associated with the invoking thread, or <code>null</code>
	 *  if the invoking thread is not associated with a transaction.
	 */

	public Object getTransactionPropagationContext()
	{
		if (log.isDebugEnabled())
		{
			log.debug("PropagationContextManager.getTransactionPropagationContext - called");
		}

		String threadId = Thread.currentThread().getName();
		ControlWrapper theControl;

		if (threadId != null)
		{
			theControl = OTSImpleManager.current().contextManager().current(threadId);
		}
		else
		{
			theControl = OTSImpleManager.current().contextManager().current();
		}

		try
		{
			PropagationContext cxt = theControl.get_coordinator().get_txcontext();

			return new PropagationContextWrapper(cxt);
		}
		catch (Exception e)
		{
		}

		return null;
	}

	/**
	 *  Return a transaction propagation context for the transaction
	 *  given as an argument, or <code>null</code>
	 *  if the argument is <code>null</code> or of a type unknown to
	 *  this factory.
	 */

	public Object getTransactionPropagationContext(Transaction tx)
	{
		if (log.isDebugEnabled())
		{
			log.debug("PropagationContextManager.getTransactionPropagationContext(Transaction) - called tx = " + tx);
		}

		Transaction oldTx = null;
		Object tpc = null;
		javax.transaction.TransactionManager tm = TransactionManager.transactionManager();

		try
		{
			oldTx = tm.getTransaction();

			if ((tx == null) || (tx.equals(oldTx)))
			{
				// we are being called in the context of this transaction
				tpc = getTransactionPropagationContext();
			}
			else
			{
				tm.suspend();
				tm.resume(tx);

				tpc = getTransactionPropagationContext();

				tm.suspend();
				tm.resume(oldTx);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			return tpc;
		}
	}

	/**
	 *  Import the transaction propagation context into the transaction
	 *  manager, and return the resulting transaction.
	 *  If this transaction propagation context has already been imported
	 *  into the transaction manager, this method simply returns the
	 *  <code>Transaction</code> representing the transaction propagation
	 *  context in the local VM.
	 *  Returns <code>null</code> if the transaction propagation context is
	 *  <code>null</code>, or if it represents a <code>null</code> transaction.
	 */

	public Transaction importTransactionPropagationContext(Object tpc)
	{
		if (log.isDebugEnabled())
		{
			log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - called tpc = " + tpc);
		}

		javax.transaction.TransactionManager tm = TransactionManager.transactionManager();

		if (tpc instanceof PropagationContextWrapper)
		{
			try
			{
				PropagationContext omgTpc = ((PropagationContextWrapper) tpc).getPropagationContext();
				ExplicitInterposition ei = new ExplicitInterposition(omgTpc, true);
				Transaction newTx = tm.getTransaction();

				if (log.isDebugEnabled())
				{
					log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - transaction = " + newTx);
				}


				ei.unregisterTransaction();

				return newTx;
			}
			catch (Exception e)
			{
				log.error("Unexpected exception occurred", e);

				return null;
			}
		}
		else
		{
			log.error("jboss-atx: unknown Tx PropagationContext");

			return null;
		}
	}

	public Object getObjectInstance(Object obj, Name name, Context nameCtx,
									Hashtable environment) throws Exception
	{
		return new PropagationContextManager();
	}
}
+/*
 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
 *
 * Arjuna Technologies Ltd.
 * Newcastle upon Tyne,
 * Tyne and Wear,
 * UK.
 *
 * $Id: PropagationContextManager.java,v 1.5 2004/10/04 09:48:19 nmcl Exp $
 */

package com.arjuna.ats.internal.jbossatx.jts;

import org.jboss.tm.TransactionPropagationContextFactory;
import org.jboss.tm.TransactionPropagationContextImporter;
import org.jboss.logging.Logger;

import org.omg.CosTransactions.*;

import javax.transaction.Transaction;
import javax.naming.spi.ObjectFactory;
import javax.naming.Name;
import javax.naming.Context;

import java.util.Hashtable;
import java.io.Serializable;

import com.arjuna.ats.internal.jts.ControlWrapper;
import com.arjuna.ats.internal.jts.OTSImpleManager;
import com.arjuna.ats.jta.TransactionManager;
import com.arjuna.ats.jts.ExplicitInterposition;

public class PropagationContextManager
		implements TransactionPropagationContextFactory, TransactionPropagationContextImporter, ObjectFactory, Serializable
{
	private Logger log = org.jboss.logging.Logger.getLogger(PropagationContextManager.class);

	/**
	 *  Return a transaction propagation context for the transaction
	 *  currently associated with the invoking thread, or <code>null</code>
	 *  if the invoking thread is not associated with a transaction.
	 */

	public Object getTransactionPropagationContext()
	{
		if (log.isDebugEnabled())
		{
			log.debug("PropagationContextManager.getTransactionPropagationContext - called");
		}

        final String threadId = Integer.toHexString(System.identityHashCode(Thread.currentThread())) ;
+		ControlWrapper theControl;

		if (threadId != null)
		{
			theControl = OTSImpleManager.current().contextManager().current(threadId);
		}
		else
		{
			theControl = OTSImpleManager.current().contextManager().current();
		}

		try
		{
			PropagationContext cxt = theControl.get_coordinator().get_txcontext();

			return new PropagationContextWrapper(cxt);
		}
		catch (Exception e)
		{
		}

		return null;
	}

	/**
	 *  Return a transaction propagation context for the transaction
	 *  given as an argument, or <code>null</code>
	 *  if the argument is <code>null</code> or of a type unknown to
	 *  this factory.
	 */

	public Object getTransactionPropagationContext(Transaction tx)
	{
		if (log.isDebugEnabled())
		{
			log.debug("PropagationContextManager.getTransactionPropagationContext(Transaction) - called tx = " + tx);
		}

		Transaction oldTx = null;
		Object tpc = null;
		javax.transaction.TransactionManager tm = TransactionManager.transactionManager();

		try
		{
			oldTx = tm.getTransaction();

			if ((tx == null) || (tx.equals(oldTx)))
			{
				// we are being called in the context of this transaction
				tpc = getTransactionPropagationContext();
			}
			else
			{
				tm.suspend();
				tm.resume(tx);

				tpc = getTransactionPropagationContext();

				tm.suspend();
				tm.resume(oldTx);
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		return tpc;
	}

	/**
	 *  Import the transaction propagation context into the transaction
	 *  manager, and return the resulting transaction.
	 *  If this transaction propagation context has already been imported
	 *  into the transaction manager, this method simply returns the
	 *  <code>Transaction</code> representing the transaction propagation
	 *  context in the local VM.
	 *  Returns <code>null</code> if the transaction propagation context is
	 *  <code>null</code>, or if it represents a <code>null</code> transaction.
	 */

	public Transaction importTransactionPropagationContext(Object tpc)
	{
		if (log.isDebugEnabled())
		{
			log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - called tpc = " + tpc);
		}

		javax.transaction.TransactionManager tm = TransactionManager.transactionManager();

		if (tpc instanceof PropagationContextWrapper)
		{
			try
			{
				PropagationContext omgTpc = ((PropagationContextWrapper) tpc).getPropagationContext();
				ExplicitInterposition ei = new ExplicitInterposition(omgTpc, true);
				Transaction newTx = tm.getTransaction();

				if (log.isDebugEnabled())
				{
					log.debug("PropagationContextManager.importTransactionPropagationContext(Object) - transaction = " + newTx);
				}


				ei.unregisterTransaction();

				return newTx;
			}
			catch (Exception e)
			{
				log.error("Unexpected exception occurred", e);

				return null;
			}
		}
		else
		{
			log.error("jboss-atx: unknown Tx PropagationContext");

			return null;
		}
	}

	public Object getObjectInstance(Object obj, Name name, Context nameCtx,
									Hashtable environment) throws Exception
	{
		return new PropagationContextManager();
	}
}

Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jta/TransactionManagerService.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -30,7 +30,9 @@
  */
 package com.arjuna.ats.jbossatx.jta;
 
+import org.jboss.mx.util.ObjectNameFactory;
 import org.jboss.system.ServiceMBeanSupport;
+import org.jboss.system.server.Server;
 import org.jboss.tm.JBossXATerminator;
 import org.jboss.tm.XAExceptionFormatter;
 
@@ -40,7 +42,7 @@
 import com.arjuna.ats.jta.utils.JNDIManager;
 import com.arjuna.ats.jta.common.Environment;
 import com.arjuna.ats.jta.common.jtaPropertyManager;
-import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.ats.arjuna.coordinator.TxControl;
 import com.arjuna.ats.arjuna.coordinator.TxStats;
 import com.arjuna.ats.arjuna.recovery.RecoveryManager;
 
@@ -48,6 +50,11 @@
 import com.arjuna.common.util.propertyservice.PropertyManagerFactory;
 import com.arjuna.common.util.propertyservice.PropertyManager;
 
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import javax.management.NotificationFilterSupport;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
 import javax.naming.Reference;
 import javax.naming.InitialContext;
 import javax.transaction.TransactionManager;
@@ -64,7 +71,7 @@
  * @author Richard A. Begg (richard.begg at arjuna.com)
  * @version $Id: TransactionManagerService.java,v 1.5 2005/06/24 15:24:15 kconner Exp $
  */
-public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean
+public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean, NotificationListener
 {
     public final static String PROPAGATE_FULL_CONTEXT_PROPERTY = "com.arjuna.ats.jbossatx.jta.propagatefullcontext";
 
@@ -74,9 +81,7 @@
     private static final JBossXATerminator TERMINATOR = new XATerminator() ;
 
     private RecoveryManager _recoveryManager;
-    private boolean _initialised = false;
     private boolean _runRM = true;
-    private int _transactionTimeout = -1;
 
     /**
      * Use the short class name as the default for the service name.
@@ -125,11 +130,7 @@
         {
             if (_runRM)
             {
-                this.getLog().info("Starting recovery manager");
-
-                _recoveryManager = RecoveryManager.manager() ;
-
-                this.getLog().info("Recovery manager started");
+                registerNotification() ;
             }
             else
             {
@@ -158,19 +159,20 @@
         jtaPropertyManager.propertyManager.setProperty(Environment.JTA_UT_IMPLEMENTATION, UserTransactionImple.class.getName());
 
         JNDIManager.bindJTATransactionManagerImplementation();
+    }
+    
+    /**
+     * Handle JMX notification.
+     * @param notification The JMX notification event.
+     * @param param The notification parameter.
+     */
+    public void handleNotification(final Notification notification, final Object param)
+    {
+        this.getLog().info("Starting recovery manager");
 
-        /** Signal that the transaction manager has been bound **/
-        _initialised = true;
+        _recoveryManager = RecoveryManager.manager() ;
 
-        /**
-         * If a call to set transaction has been called before the transaction
-         * manager is bound then set the transaction timeout now
-         */
-        if (_transactionTimeout != -1)
-        {
-            this.getLog().info("Transaction timeout set to " + _transactionTimeout);
-            setTransactionTimeout(_transactionTimeout);
-        }
+        this.getLog().info("Recovery manager started");
     }
 
     private boolean isRecoveryManagerRunning() throws Exception
@@ -268,19 +270,12 @@
      */
     public void setTransactionTimeout(int timeout) throws javax.transaction.SystemException
     {
-        if (_initialised)
+        if (timeout > 0)
         {
-            javax.transaction.TransactionManager tm = com.arjuna.ats.jta.TransactionManager.transactionManager();
-
-            tm.setTransactionTimeout(timeout);
+            TxControl.setDefaultTimeout(timeout);
         }
         else
-        {
-            if (timeout > 0)
-                _transactionTimeout = timeout;
-            else
-                throw new javax.transaction.SystemException("Transaction Timeout < 0");
-        }
+            throw new javax.transaction.SystemException("Transaction Timeout < 0");
     }
 
     /**
@@ -409,6 +404,17 @@
         _runRM = runRM;
     }
 
+    private void registerNotification()
+        throws InstanceNotFoundException
+    {
+        final NotificationFilterSupport notificationFilter = new NotificationFilterSupport() ;
+        notificationFilter.enableType(Server.START_NOTIFICATION_TYPE) ;
+        
+        final ObjectName serverName = ObjectNameFactory.create("jboss.system:type=Server") ;
+        
+        getServer().addNotificationListener(serverName, this, notificationFilter, null) ;
+    }
+    
     private void bindRef(String jndiName, String className)
             throws Exception
     {

Modified: labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java
===================================================================
--- labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java	2006-08-02 04:20:31 UTC (rev 5399)
+++ labs/jbosstm/trunk/atsintegration/classes/com/arjuna/ats/jbossatx/jts/TransactionManagerService.java	2006-08-02 08:42:06 UTC (rev 5400)
@@ -31,7 +31,9 @@
 package com.arjuna.ats.jbossatx.jts;
 
 import org.jboss.system.ServiceMBeanSupport;
+import org.jboss.system.server.Server;
 import org.jboss.iiop.CorbaORBService;
+import org.jboss.mx.util.ObjectNameFactory;
 import org.jboss.tm.JBossXATerminator;
 import org.jboss.tm.XAExceptionFormatter;
 import com.arjuna.ats.internal.jbossatx.jts.PropagationContextWrapper;
@@ -42,7 +44,6 @@
 import com.arjuna.ats.jta.common.Environment;
 import com.arjuna.ats.jta.common.jtaPropertyManager;
 import com.arjuna.ats.jts.common.jtsPropertyManager;
-import com.arjuna.ats.arjuna.common.Uid;
 import com.arjuna.ats.arjuna.coordinator.TxStats;
 import com.arjuna.ats.arjuna.recovery.RecoveryManager;
 import com.arjuna.orbportability.ORB;
@@ -53,6 +54,11 @@
 import com.arjuna.common.util.propertyservice.PropertyManagerFactory;
 import com.arjuna.common.util.propertyservice.PropertyManager;
 
+import javax.management.InstanceNotFoundException;
+import javax.management.Notification;
+import javax.management.NotificationFilterSupport;
+import javax.management.NotificationListener;
+import javax.management.ObjectName;
 import javax.naming.Reference;
 import javax.naming.InitialContext;
 import javax.transaction.TransactionManager;
@@ -69,7 +75,7 @@
  * @author Richard A. Begg (richard.begg at arjuna.com)
  * @version $Id: TransactionManagerService.java,v 1.17 2005/06/24 15:24:14 kconner Exp $
  */
-public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean
+public class TransactionManagerService extends ServiceMBeanSupport implements TransactionManagerServiceMBean, NotificationListener
 {
     public final static String PROPAGATE_FULL_CONTEXT_PROPERTY = "com.arjuna.ats.jbossatx.jts.propagatefullcontext";
 
@@ -79,7 +85,6 @@
     private static final JBossXATerminator TERMINATOR = new XATerminator() ;
 
     private RecoveryManager _recoveryManager;
-    private boolean _initialised = false;
     private boolean _runRM = true;
 
     /**
@@ -146,11 +151,7 @@
         {
             if (_runRM)
             {
-                this.getLog().info("Starting recovery manager");
-
-                _recoveryManager = RecoveryManager.manager() ;
-
-                this.getLog().info("Recovery manager started");
+                registerNotification() ;
             }
             else
             {
@@ -179,9 +180,20 @@
         jtaPropertyManager.propertyManager.setProperty(Environment.JTA_UT_IMPLEMENTATION, UserTransactionImple.class.getName());
 
         JNDIManager.bindJTATransactionManagerImplementation();
+    }
+    
+    /**
+     * Handle JMX notification.
+     * @param notification The JMX notification event.
+     * @param param The notification parameter.
+     */
+    public void handleNotification(final Notification notification, final Object param)
+    {
+        this.getLog().info("Starting recovery manager");
 
-        /** Signal that the transaction manager has been bound **/
-        _initialised = true;
+        _recoveryManager = RecoveryManager.manager() ;
+
+        this.getLog().info("Recovery manager started");
     }
 
     private boolean isRecoveryManagerRunning() throws Exception
@@ -414,6 +426,17 @@
     {
         _runRM = runRM;
     }
+    
+    private void registerNotification()
+        throws InstanceNotFoundException
+    {
+        final NotificationFilterSupport notificationFilter = new NotificationFilterSupport() ;
+        notificationFilter.enableType(Server.START_NOTIFICATION_TYPE) ;
+        
+        final ObjectName serverName = ObjectNameFactory.create("jboss.system:type=Server") ;
+        
+        getServer().addNotificationListener(serverName, this, notificationFilter, null) ;
+    }
 
     private void bindRef(String jndiName, String className)
             throws Exception




More information about the jboss-svn-commits mailing list