Bug 324740 - Test failure in N20100907 in YieldTest.testNestedAcquireJobIsNotRescheduled
diff --git a/tests/org.eclipse.core.tests.runtime/src/org/eclipse/core/tests/runtime/jobs/YieldTest.java b/tests/org.eclipse.core.tests.runtime/src/org/eclipse/core/tests/runtime/jobs/YieldTest.java
index 05c21a8..2ea218b 100644
--- a/tests/org.eclipse.core.tests.runtime/src/org/eclipse/core/tests/runtime/jobs/YieldTest.java
+++ b/tests/org.eclipse.core.tests.runtime/src/org/eclipse/core/tests/runtime/jobs/YieldTest.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
+ * Copyright (c) 2009, 2010 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -19,15 +19,15 @@
 import org.eclipse.core.tests.harness.TestJob;
 
 /**
- * Tests for {@link Job#yieldRule(IProgressMonitor))}.
+ * Tests for {@link Job#yieldRule(IProgressMonitor)}.
  */
 public class YieldTest extends AbstractJobManagerTest {
 
 	class TestJobListener extends JobChangeAdapter {
-		private Set scheduled = Collections.synchronizedSet(new HashSet());
+		private Set<Job> scheduled = Collections.synchronizedSet(new HashSet<Job>());
 
 		public void cancelAllJobs() {
-			Job[] jobs = (Job[]) scheduled.toArray(new Job[0]);
+			Job[] jobs = scheduled.toArray(new Job[0]);
 			for (int i = 0; i < jobs.length; i++) {
 				jobs[i].cancel();
 			}
@@ -645,7 +645,7 @@
 		final Object SYNC = new Object();
 		final int count = 100;
 		final Integer[] started = new Integer[] {new Integer(0)};
-		final List jobs = new ArrayList();
+		final List<Job> jobs = new ArrayList<Job>();
 		for (int i = 0; i < count; i++) {
 			Job conflictingJob = new Job(getName() + " ConflictingJob" + i) {
 				protected IStatus run(IProgressMonitor monitor) {
@@ -659,7 +659,7 @@
 						if (yieldRule(null) != null)
 							break;
 
-						if (getFinishedJobs((Job[]) jobs.toArray(new Job[jobs.size()])).size() == count - 1) {
+						if (getFinishedJobs(jobs.toArray(new Job[jobs.size()])).size() == count - 1) {
 							System.out.println(this + " Ended via no more jobs to yield");
 							break;
 						}
@@ -673,8 +673,8 @@
 			jobs.add(conflictingJob);
 		}
 
-		for (Iterator job = jobs.iterator(); job.hasNext();) {
-			Job conflict = (Job) job.next();
+		for (Iterator<Job> job = jobs.iterator(); job.hasNext();) {
+			Job conflict = job.next();
 			conflict.schedule();
 		}
 
@@ -691,10 +691,10 @@
 		// release all waiting jobs
 		barrier.setStatus(TestBarrier.STATUS_WAIT_FOR_START);
 		// wait for jobs to finish within 5s
-		waitForJobsCompletion((Job[]) jobs.toArray(new Job[jobs.size()]), 5000);
+		waitForJobsCompletion(jobs.toArray(new Job[jobs.size()]), 5000);
 
-		for (Iterator job = jobs.iterator(); job.hasNext();) {
-			Job conflict = (Job) job.next();
+		for (Iterator<Job> job = jobs.iterator(); job.hasNext();) {
+			Job conflict = job.next();
 			assertNotNull("Null result for " + conflict, conflict.getResult());
 			assertTrue(conflict.getResult().isOK());
 		}
@@ -714,7 +714,7 @@
 		final PathRule rule_A = new PathRule(getName() + "_ruleA");
 		final Object SYNC_A = new Object();
 		final Integer[] started_A = new Integer[] {new Integer(0)};
-		final List jobs_A = new ArrayList();
+		final List<Job> jobs_A = new ArrayList<Job>();
 		for (int i = 0; i < count; i++) {
 			Job conflictingJob = new Job(getName() + " ConflictingJob_A_" + i) {
 				protected IStatus run(IProgressMonitor monitor) {
@@ -728,7 +728,7 @@
 						if (yieldRule(null) != null)
 							break;
 
-						if (getFinishedJobs((Job[]) jobs_A.toArray(new Job[jobs_A.size()])).size() == count - 1) {
+						if (getFinishedJobs(jobs_A.toArray(new Job[jobs_A.size()])).size() == count - 1) {
 							System.out.println(this + " Ended via no more jobs to yield");
 							break;
 						}
@@ -742,8 +742,8 @@
 			jobs_A.add(conflictingJob);
 		}
 
-		for (Iterator job = jobs_A.iterator(); job.hasNext();) {
-			Job conflict = (Job) job.next();
+		for (Iterator<Job> job = jobs_A.iterator(); job.hasNext();) {
+			Job conflict = job.next();
 			conflict.schedule();
 		}
 
@@ -769,7 +769,7 @@
 		final Object SYNC_B = new Object();
 
 		final Integer[] started_B = new Integer[] {new Integer(0)};
-		final List jobs_B = new ArrayList();
+		final List<Job> jobs_B = new ArrayList<Job>();
 		for (int i = 0; i < count; i++) {
 			Job conflictingJob = new Job(getName() + " ConflictingJob_B_" + i) {
 				protected IStatus run(IProgressMonitor monitor) {
@@ -783,7 +783,7 @@
 						if (yieldRule(null) != null)
 							break;
 
-						if (getFinishedJobs((Job[]) jobs_B.toArray(new Job[jobs_B.size()])).size() == count - 1) {
+						if (getFinishedJobs(jobs_B.toArray(new Job[jobs_B.size()])).size() == count - 1) {
 							System.out.println(this + " Ended via no more jobs to yield");
 							break;
 						}
@@ -797,8 +797,8 @@
 			jobs_B.add(conflictingJob);
 		}
 
-		for (Iterator job = jobs_B.iterator(); job.hasNext();) {
-			Job conflict = (Job) job.next();
+		for (Iterator<Job> job = jobs_B.iterator(); job.hasNext();) {
+			Job conflict = job.next();
 			conflict.schedule();
 		}
 
@@ -816,19 +816,19 @@
 		barrier_B.setStatus(TestBarrier.STATUS_WAIT_FOR_START);
 
 		// wait for jobs to finish within 5s
-		waitForJobsCompletion((Job[]) jobs_A.toArray(new Job[jobs_A.size()]), 5000);
+		waitForJobsCompletion(jobs_A.toArray(new Job[jobs_A.size()]), 5000);
 
 		// wait for jobs to finish within 5s
-		waitForJobsCompletion((Job[]) jobs_B.toArray(new Job[jobs_B.size()]), 5000);
+		waitForJobsCompletion(jobs_B.toArray(new Job[jobs_B.size()]), 5000);
 
-		for (Iterator job = jobs_A.iterator(); job.hasNext();) {
-			Job conflict = (Job) job.next();
+		for (Iterator<Job> job = jobs_A.iterator(); job.hasNext();) {
+			Job conflict = job.next();
 			assertNotNull("Null result for " + conflict, conflict.getResult());
 			assertTrue(conflict.getResult().isOK());
 		}
 
-		for (Iterator job = jobs_B.iterator(); job.hasNext();) {
-			Job conflict = (Job) job.next();
+		for (Iterator<Job> job = jobs_B.iterator(); job.hasNext();) {
+			Job conflict = job.next();
 			assertNotNull("Null result for " + conflict, conflict.getResult());
 			assertTrue(conflict.getResult().isOK());
 		}
@@ -872,7 +872,7 @@
 
 		barrier.setStatus(TestBarrier.STATUS_START);
 
-		List jobs = new ArrayList();
+		List<Job> jobs = new ArrayList<Job>();
 		jobs.add(yieldA);
 		jobs.add(yieldB);
 
@@ -882,9 +882,9 @@
 		} catch (InterruptedException e) {
 			fail("4.99", e);
 		}
-		waitForJobsCompletion((Job[]) jobs.toArray(new Job[jobs.size()]), 5000);
-		for (Iterator job = jobs.iterator(); job.hasNext();) {
-			Job conflict = (Job) job.next();
+		waitForJobsCompletion(jobs.toArray(new Job[jobs.size()]), 5000);
+		for (Iterator<Job> job = jobs.iterator(); job.hasNext();) {
+			Job conflict = job.next();
 			assertTrue(conflict.getResult().isOK());
 
 		}
@@ -981,6 +981,7 @@
 		} finally {
 			//clean up even if the test fails
 			yieldA.cancel();
+			Job.getJobManager().removeJobChangeListener(a);
 		}
 
 	}
@@ -1020,22 +1021,22 @@
 		final int[] count = new int[1];
 		JobChangeAdapter a = new JobChangeAdapter() {
 			public void running(org.eclipse.core.runtime.jobs.IJobChangeEvent event) {
-				if (event.getJob() == conflicting || event.getJob() == yieldA)
-					return;
-				count[0]++;
+				if (event.getJob() == conflicting)
+					count[0]++;
 			}
 		};
 		Job.getJobManager().addJobChangeListener(a);
-
-		// start testing
-
-		yieldA.schedule();
-		b.waitForStatus(TestBarrier.STATUS_RUNNING);
-		conflicting.schedule();
-
-		waitForCompletion(yieldA);
-		waitForCompletion(conflicting);
-		assertEquals("While resuming from yieldRule, implicit Job should only run once", 0, count[0]);
+		try {
+			// start testing
+			yieldA.schedule();
+			b.waitForStatus(TestBarrier.STATUS_RUNNING);
+			conflicting.schedule();
+			waitForCompletion(yieldA);
+			waitForCompletion(conflicting);
+			assertEquals("While resuming from yieldRule, conflicting job should only run once", 1, count[0]);
+		} finally {
+			Job.getJobManager().removeJobChangeListener(a);
+		}
 	}
 
 }