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]