craigmcc    02/03/15 18:17:35

  Modified:    src/share/org/apache/struts/action Tag: STRUTS_1_0_BRANCH
                        ActionServlet.java
  Log:
  Port fix for 7060 (double checked locking allocating Action instances)
  to the 1.0 branch.
  
  PR: Bugzilla #7060
  Submitted by: Michael Rimov <rimovm at centercomp.com>
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.68.2.5  +34 -33    
jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java
  
  Index: ActionServlet.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v
  retrieving revision 1.68.2.4
  retrieving revision 1.68.2.5
  diff -u -r1.68.2.4 -r1.68.2.5
  --- ActionServlet.java        7 Oct 2001 04:49:15 -0000       1.68.2.4
  +++ ActionServlet.java        16 Mar 2002 02:17:34 -0000      1.68.2.5
  @@ -1,7 +1,7 @@
   /*
  - * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 
1.68.2.4 2001/10/07 04:49:15 martinc Exp $
  - * $Revision: 1.68.2.4 $
  - * $Date: 2001/10/07 04:49:15 $
  + * $Header: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/action/ActionServlet.java,v 
1.68.2.5 2002/03/16 02:17:34 craigmcc Exp $
  + * $Revision: 1.68.2.5 $
  + * $Date: 2002/03/16 02:17:34 $
    *
    * ====================================================================
    *
  @@ -231,7 +231,7 @@
    * </ul>
    *
    * @author Craig R. McClanahan
  - * @version $Revision: 1.68.2.4 $ $Date: 2001/10/07 04:49:15 $
  + * @version $Revision: 1.68.2.5 $ $Date: 2002/03/16 02:17:34 $
    */
   
   public class ActionServlet
  @@ -245,7 +245,7 @@
        * The set of Action instances that have been created and initialized,
        * keyed by the fully qualified Java class name.
        */
  -    protected FastHashMap actions = new FastHashMap();
  +    protected HashMap actions = new HashMap();
   
   
       /**
  @@ -999,9 +999,7 @@
       protected void initActions() {
   
           synchronized (actions) {
  -            actions.setFast(false);
               actions.clear();
  -            actions.setFast(true);
           }
   
       }
  @@ -1609,37 +1607,40 @@
       protected Action processActionCreate(ActionMapping mapping,
                                            HttpServletRequest request) {
   
  -        // Acquire the Action instance we will be using
  +        // Acquire the Action instance we will be using (if there is one)
           String actionClass = mapping.getType();
  -        if (debug >= 1)
  +        if (debug >= 1) {
               log(" Looking for Action instance for class " + actionClass);
  -        Action actionInstance = (Action) actions.get(actionClass);
  -        if (actionInstance == null) {
  -            synchronized (actions) {
  -                if (debug >= 1)
  -                    log("  Double checking for Action instance already there");
  -                // Double check to avoid a race condition
  -                actionInstance = (Action) actions.get(actionClass);
  -                if (actionInstance != null)
  -                    return (actionInstance);
  -                // Go ahead and create the new Action instance
  -                // ASSERT:  This will never ever happen more than once
  -                //  for a particular action class name
  -                try {
  -                    if (debug >= 1)
  -                        log("  Creating new Action instance");
  -                    Class clazz = Class.forName(actionClass);
  -                    actionInstance = (Action) clazz.newInstance();
  -                    actionInstance.setServlet(this);
  -                    actions.put(actionClass, actionInstance);
  -                } catch (Throwable t) {
  -                    log("Error creating Action instance for path '" +
  -                        mapping.getPath() + "', class name '" +
  -                        actionClass + "'", t);
  -                    return (null);
  +        }
  +        Action actionInstance = null;
  +        synchronized (actions) {
  +
  +            // Return any existing Action instance of this class
  +            actionInstance = (Action) actions.get(actionClass);
  +            if (actionInstance != null) {
  +                if (debug >= 2) {
  +                    log("  Returning existing Action instance");
                   }
  +                return (actionInstance);
  +            }
  +
  +            // Create and return a new Action instance
  +            if (debug >= 2) {
  +                log("  Creating new Action instance");
  +            }
  +            try {
  +                Class clazz = Class.forName(actionClass);
  +                actionInstance = (Action) clazz.newInstance();
  +                actionInstance.setServlet(this);
  +                actions.put(actionClass, actionInstance);
  +            } catch (Throwable t) {
  +                log("Error creating Action instance for path '" +
  +                    mapping.getPath() + "', class name '" +
  +                    actionClass + "'", t);
  +                return (null);
               }
           }
  +
           return (actionInstance);
   
       }
  
  
  

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to