diff --git a/WHATSNEW b/WHATSNEW
index d270d902a..1ff6c1c29 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -4,6 +4,9 @@ Changes from Ant 1.10.10 TO Ant 1.10.11
Fixed bugs:
-----------
+ * a race condition could lead to NullPointerExceptions when running
+ tasks in parallel.
+ Bugzilla Report 65316
Other changes:
--------------
diff --git a/src/main/org/apache/tools/ant/UnknownElement.java b/src/main/org/apache/tools/ant/UnknownElement.java
index f33dd525b..fce44660c 100644
--- a/src/main/org/apache/tools/ant/UnknownElement.java
+++ b/src/main/org/apache/tools/ant/UnknownElement.java
@@ -159,7 +159,8 @@ public class UnknownElement extends Task {
* @exception BuildException if the configuration fails
*/
public void maybeConfigure() throws BuildException {
- if (realThing != null) {
+ final Object copy = realThing;
+ if (copy != null) {
return;
}
configure(makeObject(this, getWrapper()));
@@ -177,10 +178,10 @@ public class UnknownElement extends Task {
}
realThing = realObject;
- getWrapper().setProxy(realThing);
+ getWrapper().setProxy(realObject);
Task task = null;
- if (realThing instanceof Task) {
- task = (Task) realThing;
+ if (realObject instanceof Task) {
+ task = (Task) realObject;
task.setRuntimeConfigurableWrapper(getWrapper());
@@ -188,7 +189,7 @@ public class UnknownElement extends Task {
// targets to work. *very* Ugly
// The reference is replaced by RuntimeConfigurable
if (getWrapper().getId() != null) {
- this.getOwningTarget().replaceChild(this, (Task) realThing);
+ this.getOwningTarget().replaceChild(this, (Task) realObject);
}
}
@@ -203,7 +204,7 @@ public class UnknownElement extends Task {
getWrapper().maybeConfigure(getProject());
}
- handleChildren(realThing, getWrapper());
+ handleChildren(realObject, getWrapper());
}
/**
@@ -212,8 +213,9 @@ public class UnknownElement extends Task {
* @param output The output to log. Should not be null
.
*/
protected void handleOutput(String output) {
- if (realThing instanceof Task) {
- ((Task) realThing).handleOutput(output);
+ final Object copy = realThing;
+ if (copy instanceof Task) {
+ ((Task) copy).handleOutput(output);
} else {
super.handleOutput(output);
}
@@ -233,8 +235,9 @@ public class UnknownElement extends Task {
*/
protected int handleInput(byte[] buffer, int offset, int length)
throws IOException {
- if (realThing instanceof Task) {
- return ((Task) realThing).handleInput(buffer, offset, length);
+ final Object copy = realThing;
+ if (copy instanceof Task) {
+ return ((Task) copy).handleInput(buffer, offset, length);
}
return super.handleInput(buffer, offset, length);
}
@@ -245,8 +248,9 @@ public class UnknownElement extends Task {
* @param output The output to log. Should not be null
.
*/
protected void handleFlush(String output) {
- if (realThing instanceof Task) {
- ((Task) realThing).handleFlush(output);
+ final Object copy = realThing;
+ if (copy instanceof Task) {
+ ((Task) copy).handleFlush(output);
} else {
super.handleFlush(output);
}
@@ -258,8 +262,9 @@ public class UnknownElement extends Task {
* @param output The error output to log. Should not be null
.
*/
protected void handleErrorOutput(String output) {
- if (realThing instanceof Task) {
- ((Task) realThing).handleErrorOutput(output);
+ final Object copy = realThing;
+ if (copy instanceof Task) {
+ ((Task) copy).handleErrorOutput(output);
} else {
super.handleErrorOutput(output);
}
@@ -271,8 +276,9 @@ public class UnknownElement extends Task {
* @param output The error output to log. Should not be null
.
*/
protected void handleErrorFlush(String output) {
- if (realThing instanceof Task) {
- ((Task) realThing).handleErrorFlush(output);
+ final Object copy = realThing;
+ if (copy instanceof Task) {
+ ((Task) copy).handleErrorFlush(output);
} else {
super.handleErrorFlush(output);
}
@@ -283,13 +289,14 @@ public class UnknownElement extends Task {
* (e.g. a data type) then this method does nothing.
*/
public void execute() {
- if (realThing == null) {
+ final Object copy = realThing;
+ if (copy == null) {
// Got here if the runtimeconfigurable is not enabled.
return;
}
try {
- if (realThing instanceof Task) {
- ((Task) realThing).execute();
+ if (copy instanceof Task) {
+ ((Task) copy).execute();
}
} finally {
// Finished executing the task
@@ -503,8 +510,9 @@ public class UnknownElement extends Task {
* @return the name to use in logging messages.
*/
public String getTaskName() {
- return !(realThing instanceof Task) ? super.getTaskName()
- : ((Task) realThing).getTaskName();
+ final Object copy = realThing;
+ return !(copy instanceof Task) ? super.getTaskName()
+ : ((Task) copy).getTaskName();
}
/**
@@ -514,8 +522,9 @@ public class UnknownElement extends Task {
* a task.
*/
public Task getTask() {
- if (realThing instanceof Task) {
- return (Task) realThing;
+ final Object copy = realThing;
+ if (copy instanceof Task) {
+ return (Task) copy;
}
return null;
}