Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Arthorne2012-05-01 20:08:52 +0000
committerJohn Arthorne2012-05-01 20:08:52 +0000
commit6e56a143857adfeb19011ef8f5478d658a5bd87c (patch)
tree13426223b749da01d213f518035b8d315593d9ea
parent1bd802a18c81b1a7000658018baf643a4622202e (diff)
downloadeclipse.platform.resources-6e56a143857adfeb19011ef8f5478d658a5bd87c.tar.gz
eclipse.platform.resources-6e56a143857adfeb19011ef8f5478d658a5bd87c.tar.xz
eclipse.platform.resources-6e56a143857adfeb19011ef8f5478d658a5bd87c.zip
Bug 378156 - build cancelled by waiting (not run) jobv20120501-2008
-rw-r--r--bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java16
-rw-r--r--tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java4
-rw-r--r--tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java69
3 files changed, 63 insertions, 26 deletions
diff --git a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java
index 926db4e4b..920a3ba05 100644
--- a/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java
+++ b/bundles/org.eclipse.core.resources/src/org/eclipse/core/internal/resources/WorkManager.java
@@ -68,16 +68,16 @@ public class WorkManager implements IManager {
* modifying the workspace tree.
*/
private final ILock lock;
-
+
/**
* The current depth of running nested operations.
*/
private int nestedOperations = 0;
-
+
private NotifyRule notifyRule = new NotifyRule();
-
+
private boolean operationCanceled = false;
-
+
/**
* The current depth of prepared operations.
*/
@@ -89,7 +89,7 @@ public class WorkManager implements IManager {
this.jobManager = Job.getJobManager();
this.lock = jobManager.newLock();
}
-
+
/**
* Releases the workspace lock without changing the nested operation depth.
* Must be followed eventually by endUnprotected. Any
@@ -154,7 +154,9 @@ public class WorkManager implements IManager {
rebalanceNestedOperations();
//reset state if this is the end of a top level operation
if (preparedOperations == 0)
- operationCanceled = hasBuildChanges = false;
+ hasBuildChanges = false;
+ //don't let cancelation of this operation affect other operations
+ operationCanceled = false;
try {
lock.release();
} finally {
@@ -188,7 +190,7 @@ public class WorkManager implements IManager {
ILock getLock() {
return lock;
}
-
+
/**
* Returns the scheduling rule used during resource change notifications.
*/
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java
index 1b86ec460..50ba99b11 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/AllTests.java
@@ -13,6 +13,9 @@ package org.eclipse.core.tests.resources.regression;
import junit.framework.*;
+/**
+ * A suite that runs all regression tests.
+ */
public class AllTests extends TestCase {
/**
* AllTests constructor comment.
@@ -63,6 +66,7 @@ public class AllTests extends TestCase {
suite.addTest(Bug_329836.suite());
suite.addTest(Bug_331445.suite());
suite.addTest(Bug_332543.suite());
+ suite.addTest(Bug_378156.suite());
suite.addTest(IFileTest.suite());
suite.addTest(IFolderTest.suite());
suite.addTest(IProjectTest.suite());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java
index 3e398d377..d432c5f47 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java
@@ -15,7 +15,6 @@ import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
-import org.eclipse.core.tests.harness.CancelingProgressMonitor;
import org.eclipse.core.tests.resources.ResourceTest;
import org.eclipse.core.tests.resources.usecase.SignaledBuilder;
@@ -26,9 +25,9 @@ import org.eclipse.core.tests.resources.usecase.SignaledBuilder;
public class Bug_378156 extends ResourceTest {
class ModifyFileJob extends WorkspaceJob {
+ private boolean cancel;
private IFile jobFile;
private Semaphore jobFlag;
- private boolean cancel;
/**
* Modifies a file and then waits for a signal before returning.
@@ -40,8 +39,9 @@ public class Bug_378156 extends ResourceTest {
}
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
- IProgressMonitor pm = cancel ? new CancelingProgressMonitor() : null;
- jobFile.setContents(getRandomContents(), IResource.NONE, pm);
+ if (cancel)
+ throw new OperationCanceledException();
+ jobFile.setContents(getRandomContents(), IResource.NONE, null);
//wait for signal
try {
jobFlag.acquire();
@@ -59,25 +59,11 @@ public class Bug_378156 extends ResourceTest {
}
}
- class BuildListener implements IResourceChangeListener {
- private boolean buildEvent = false;
-
- public void resourceChanged(IResourceChangeEvent event) {
- if (event.getType() == IResourceChangeEvent.PRE_BUILD)
- buildEvent = true;
- }
-
- public boolean buildEventReceived() {
- return buildEvent;
- }
-
- }
-
public static Test suite() {
return new TestSuite(Bug_378156.class);
}
- public void testBug() throws Exception {
+ public void testBugTwoThreads() throws Exception {
//setup
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
final IProject project1 = root.getProject("Bug_378156");
@@ -90,6 +76,8 @@ public class Bug_378156 extends ResourceTest {
desc.setBuildSpec(new ICommand[] {command});
project1.setDescription(desc, getMonitor());
ensureExistsInWorkspace(file, getRandomContents());
+ //build may not be triggered immediately
+ Thread.sleep(2000);
waitForBuild();
//initialize the builder
@@ -111,8 +99,51 @@ public class Bug_378156 extends ResourceTest {
//now let the first job finish
semaphore.release();
runningJob.join();
+ waitForBuild();
//the builder should have run if the bug is fixed
assertTrue("1.0", builder.wasExecuted());
}
+
+ public void testBugOneThread() throws Exception {
+ //setup
+ IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+ final IProject project1 = root.getProject("Bug_378156");
+ final IFile file = project1.getFile("content.txt");
+ ensureExistsInWorkspace(project1, true);
+ //add a builder that can tell us if it was called
+ IProjectDescription desc = project1.getDescription();
+ ICommand command = desc.newCommand();
+ command.setBuilderName(SignaledBuilder.BUILDER_ID);
+ desc.setBuildSpec(new ICommand[] {command});
+ project1.setDescription(desc, getMonitor());
+ ensureExistsInWorkspace(file, getRandomContents());
+ waitForBuild();
+
+ //initialize the builder
+ SignaledBuilder builder = SignaledBuilder.getInstance(project1);
+ builder.reset();
+
+ getWorkspace().run(new IWorkspaceRunnable() {
+
+ public void run(IProgressMonitor monitor) throws CoreException {
+ //modify the file so autobuild is needed
+ file.setContents(getRandomContents(), IResource.NONE, null);
+ //create a nested operation that immediately cancels
+ try {
+ getWorkspace().run(new IWorkspaceRunnable() {
+ public void run(IProgressMonitor monitor) throws CoreException {
+ throw new OperationCanceledException();
+ }
+ }, null);
+ } catch (OperationCanceledException e) {
+ //don't let this propagate - we changed our mind about canceling
+ }
+ }
+ }, null);
+ waitForBuild();
+ //the builder should have run if the bug is fixed
+ assertTrue("1.0", builder.wasExecuted());
+ }
+
}

Back to the top