Russell,

Thanks for fixing that. But why didn't you simply declare firstCall as
synchronized, thus:

protected synchronized boolean firstCall() {
    boolean ret = firstCall;
    firstCall = false;
    return ret;
}

which would have the effect of serialising the use of firstCall relative to
the stub instance? I think this is equivalent to the code below, but a bit
simpler and faster.

Glyn



                                                                                       
                           
                    [EMAIL PROTECTED]                                                     
                           
                    rg                   To:     [EMAIL PROTECTED]               
                           
                                         cc:                                           
                           
                    20/02/02 16:49       Subject:     cvs commit: 
xml-axis/java/src/org/apache/axis/wsdl/toJava   
                    Please respond        JavaStubWriter.java                          
                           
                    to axis-dev                                                        
                           
                                                                                       
                           
                                                                                       
                           



butek       02/02/20 08:49:53

  Modified:    java/src/org/apache/axis/client Stub.java
               java/src/org/apache/axis/wsdl/toJava JavaStubWriter.java
  Log:
  Make type mapping registration in the stubs thread safe.

  Revision  Changes    Path
  1.5       +16 -0     xml-axis/java/src/org/apache/axis/client/Stub.java

  Index: Stub.java
  ===================================================================
  RCS file: /home/cvs/xml-axis/java/src/org/apache/axis/client/Stub.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- Stub.java           20 Feb 2002 13:55:19 -0000          1.4
  +++ Stub.java           20 Feb 2002 16:49:53 -0000          1.5
  @@ -97,6 +97,22 @@
       protected URL        cachedEndpoint     = null;
       protected Integer    cachedTimeout      = null;

  +    // Flag to determine whether this is the first call to register type
mappings.
  +    // firstCallLock is used to access this in a thread-safe manner.
  +    private boolean firstCall     = true;
  +    private Object  firstCallLock = new Object();
  +
  +    /**
  +     * Is this the first time the type mappings are being registered?
  +     */
  +    protected boolean firstCall() {
  +        synchronized (firstCallLock) {
  +            boolean ret = firstCall;
  +            firstCall = false;
  +            return ret;
  +        }
  +    } // firstCall
  +
       /**
        * Sets the value for a named property. JAX-RPC 1.0 specification
        * specifies a standard set of properties that may be passed



  1.33      +1 -3
xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java

  Index: JavaStubWriter.java
  ===================================================================
  RCS file:
/home/cvs/xml-axis/java/src/org/apache/axis/wsdl/toJava/JavaStubWriter.java,v

  retrieving revision 1.32
  retrieving revision 1.33
  diff -u -r1.32 -r1.33
  --- JavaStubWriter.java           20 Feb 2002 13:55:20 -0000
1.32
  +++ JavaStubWriter.java           20 Feb 2002 16:49:53 -0000
1.33
  @@ -133,7 +133,6 @@
               pw.println("    private java.util.Vector cachedSerQNames =
new java.util.Vector();");
               pw.println("    private java.util.Vector cachedSerFactories
= new java.util.Vector();");
               pw.println("    private java.util.Vector
cachedDeserFactories = new java.util.Vector();");
  -            pw.println("    private boolean firstCall = true;");
           }
           pw.println();

  @@ -199,8 +198,7 @@
               pw.println("            // The type mapping information is
actually registered in");
               pw.println("            // the TypeMappingRegistry of the
service, which");
               pw.println("            // is the reason why registration is
only needed for the first call.");
  -            pw.println("            if (firstCall) {");
  -            pw.println("                firstCall = false;");
  +            pw.println("            if (firstCall()) {");
               pw.println("                for (int i = 0; i <
cachedSerFactories.size(); ++i) {");
               pw.println("                    Class cls = (Class)
cachedSerClasses.get(i);");
               pw.println("
javax.xml.rpc.namespace.QName qName =");







Reply via email to