peterreilly    2005/01/14 08:19:43

  Modified:    src/main/org/apache/tools/ant PropertyHelper.java
  Log:
  Attempt to cut down on memory usage of local properties
  for threads that do not use properties.
  This is a quick fix and not tested too much.
  The whole thing may be scrapped...
  
  Revision  Changes    Path
  1.22      +56 -20    ant/src/main/org/apache/tools/ant/PropertyHelper.java
  
  Index: PropertyHelper.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/PropertyHelper.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- PropertyHelper.java       14 Jan 2005 08:12:04 -0000      1.21
  +++ PropertyHelper.java       14 Jan 2005 16:19:42 -0000      1.22
  @@ -244,7 +244,7 @@
        */
       public void setLocalProperties(LocalProperties localProperties) {
           if (localProperties == null) {
  -            localProperties = new LocalPropertyStack();
  +            localProperties = new LocalPropertyStack(null);
           }
           threadLocalProperties.set(localProperties);
       }
  @@ -258,7 +258,7 @@
       public void setNotOverrideLocalProperties(
           LocalProperties localProperties) {
           if (localProperties == null) {
  -            localProperties = new LocalPropertyStack();
  +            localProperties = new LocalPropertyStack(null);
           }
           LocalPropertyStack s = (LocalPropertyStack) localProperties;
           for (Iterator i = s.props.entrySet().iterator(); i.hasNext();) {
  @@ -775,22 +775,39 @@
        */
       private class LocalPropertyStack
           implements LocalProperties {
  +        LocalPropertyStack(LocalPropertyStack owner) {
  +            if (owner == null) {
  +                init();
  +            }
  +            this.owner = owner;
  +        }
           private int level = 0;
  +        private  LocalPropertyStack owner;
           // HashMap<String, ListArray<LocalPropertyValue>>
  -        private HashMap props = new HashMap();
  +        private HashMap props;
  +        
   
           // ArrayList<ArrayList<String>>
  -        private List    stack = new ArrayList();
  +        private List    stack;
  +
  +        private void init() {
  +            props = new HashMap();
  +            stack = new ArrayList();
  +        }
  +
  +        private List getStack() {
  +            return stack == null ? owner.stack : stack;
  +        }
   
           public LocalProperties copy() {
  -            LocalPropertyStack copy = new LocalPropertyStack();
  +            LocalPropertyStack copy = new LocalPropertyStack(null);
               copy.stack = new ArrayList();
               copy.level = level;
  -            for (int i = 0; i < stack.size(); ++i) {
  -                copy.stack.add(((ArrayList) stack.get(i)).clone());
  +            for (int i = 0; i < getStack().size(); ++i) {
  +                copy.stack.add(((ArrayList) getStack().get(i)).clone());
               }
               copy.props = new HashMap();
  -            for (Iterator i = props.entrySet().iterator(); i.hasNext();) {
  +            for (Iterator i = getProps().entrySet().iterator(); 
i.hasNext();) {
                   Map.Entry entry = (Map.Entry) i.next();
                   ArrayList from = (ArrayList) entry.getValue();
                   List l2 = new ArrayList();
  @@ -803,15 +820,17 @@
               return copy;
           }
   
  -        public LocalProperties shallowCopy() {
  -            LocalPropertyStack copy = new LocalPropertyStack();
  -            copy.stack = new ArrayList();
  -            copy.level = level;
  +        private void shallowCopyParent() {
  +            if (stack != null) {
  +                return;
  +            }
  +            stack = new ArrayList();
  +            level = owner.level;
               for (int i = 0; i < stack.size(); ++i) {
  -                copy.stack.add(((ArrayList) stack.get(i)).clone());
  +                stack.add(((ArrayList) owner.stack.get(i)).clone());
               }
  -            copy.props = new HashMap();
  -            for (Iterator i = props.entrySet().iterator(); i.hasNext();) {
  +            props = new HashMap();
  +            for (Iterator i = owner.props.entrySet().iterator(); 
i.hasNext();) {
                   Map.Entry entry = (Map.Entry) i.next();
                   ArrayList from = (ArrayList) entry.getValue();
                   List l2 = new ArrayList();
  @@ -819,17 +838,22 @@
                       LocalProperty v = (LocalProperty) l.next();
                       l2.add(v);
                   }
  -                copy.props.put(entry.getKey(), l2);
  +                props.put(entry.getKey(), l2);
               }
  -            return copy;
           }
   
           public void enterLocalPropertyScope() {
  +            if (stack == null) {
  +                shallowCopyParent();
  +            }
               stack.add(new ArrayList());
               level++;
           }
   
           public void addProperty(String name, Object value) {
  +            if (stack == null) {
  +                shallowCopyParent();
  +            }
               if (stack.size() == 0) {
                   return;
               }
  @@ -851,6 +875,9 @@
           }
   
           public void exitLocalPropertyScope() {
  +            if (stack == null) {
  +                shallowCopyParent();
  +            }
               if (stack.size() == 0) {
                   return;
               }
  @@ -868,7 +895,14 @@
               }
           }
   
  +        
           public LocalProperty getLocalProperty(String name) {
  +            if (stack == null) {
  +                shallowCopyParent();
  +            }
  +            if (props == null) {
  +                return owner.getLocalProperty(name);
  +            }
               List l = (List) props.get(name);
               if (l != null && l.size() != 0) {
                   return (LocalProperty) l.get(l.size() - 1);
  @@ -877,8 +911,9 @@
           }
   
           public Map getProps() {
  -            return props;
  +            return props == null ? owner.props : props;
           }
  +
       }
   
       /**
  @@ -887,10 +922,11 @@
   
       private class ThreadLocalProperties extends InheritableThreadLocal {
           protected synchronized Object initialValue() {
  -            return new LocalPropertyStack();
  +            return new LocalPropertyStack(null);
           }
           protected synchronized Object childValue(Object obj) {
  -            return ((LocalPropertyStack) obj).shallowCopy();
  +            //return ((LocalPropertyStack) obj).shallowCopy();
  +            return new LocalPropertyStack((LocalPropertyStack) obj);
           }
           public LocalProperty getLocalProperty(String name) {
               return ((LocalPropertyStack) get()).getLocalProperty(name);
  
  
  

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

Reply via email to