You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ba...@apache.org on 2007/08/24 22:22:04 UTC

svn commit: r569511 - /webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java

Author: barrettj
Date: Fri Aug 24 13:22:04 2007
New Revision: 569511

URL: http://svn.apache.org/viewvc?rev=569511&view=rev
Log:
Make initialization of the CallbackReceiver threadsafe

Modified:
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java?rev=569511&r1=569510&r2=569511&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/description/OutInAxisOperation.java Fri Aug 24 13:22:04 2007
@@ -227,16 +227,21 @@
          * We are following the async path. If the user hasn't set a callback object then we must
          * block until the whole MEP is complete, as they have no other way to get their reply message.
          */
+        // THREADSAFE issue: Multiple threads could be trying to initialize the callback receiver
+        // so it is synchronized.  It is not done within the else clause to avoid the 
+        // double-checked lock antipattern.
         CallbackReceiver callbackReceiver;
-        if (axisOp.getMessageReceiver() != null &&
-                axisOp.getMessageReceiver() instanceof CallbackReceiver) {
-            callbackReceiver = (CallbackReceiver) axisOp.getMessageReceiver();
-        } else {
-            if (log.isDebugEnabled()) {
-                log.debug("Creating new callback receiver");
+        synchronized (axisOp) {
+            if (axisOp.getMessageReceiver() != null &&
+                    axisOp.getMessageReceiver() instanceof CallbackReceiver) {
+                callbackReceiver = (CallbackReceiver) axisOp.getMessageReceiver();
+            } else {
+                if (log.isDebugEnabled()) {
+                    log.debug("Creating new callback receiver");
+                }
+                callbackReceiver = new CallbackReceiver();
+                axisOp.setMessageReceiver(callbackReceiver);
             }
-            callbackReceiver = new CallbackReceiver();
-            axisOp.setMessageReceiver(callbackReceiver);
         }
 
         SyncCallBack internalCallback = null;



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org