| /******************************************************************************* |
| * Copyright (c) 2004, 2012 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 |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM - Initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.core.tests.runtime.jobs; |
| |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.core.runtime.jobs.*; |
| import org.eclipse.core.tests.harness.TestBarrier; |
| |
| /** |
| * A test job that begins and ends a scheduling rule, waiting on signals |
| * at each step to allow synchronization with the thread that is running the test. |
| */ |
| class JobRuleRunner extends Job { |
| private ISchedulingRule rule; |
| private TestBarrier barrier; |
| private int numRepeats; |
| private boolean reportBlocking; |
| |
| /** |
| * This job will start applying the given rule in the manager |
| */ |
| public JobRuleRunner(String name, ISchedulingRule rule, int[] status, int index, int numRepeats, boolean reportBlocking) { |
| this(name, rule, new TestBarrier(status, index), numRepeats, reportBlocking); |
| } |
| /** |
| * This job will start applying the given rule in the manager |
| */ |
| public JobRuleRunner(String name, ISchedulingRule rule, TestBarrier barrier, int numRepeats, boolean reportBlocking) { |
| super(name); |
| this.rule = rule; |
| this.barrier = barrier; |
| this.numRepeats = numRepeats; |
| this.reportBlocking = reportBlocking; |
| } |
| /** |
| * This job will start applying the given rule in the manager |
| */ |
| public JobRuleRunner(String name, ISchedulingRule rule, TestBarrier barrier) { |
| this(name, rule, barrier, 1, false); |
| } |
| |
| protected IStatus run(IProgressMonitor monitor) { |
| //begin executing the job |
| monitor.beginTask(getName(), numRepeats); |
| try { |
| //set the status flag to START |
| barrier.setStatus(TestBarrier.STATUS_START); |
| for (int i = 0; i < numRepeats; i++) { |
| monitor.worked(1); |
| //wait until the tester allows this job to run again |
| barrier.waitForStatusNoFail(TestBarrier.STATUS_WAIT_FOR_RUN); |
| //create a hook that would notify this thread when this job was blocked on a rule (if needed) |
| TestBlockingMonitor bMonitor = null; |
| if (reportBlocking) |
| bMonitor = new TestBlockingMonitor(barrier); |
| |
| //start the given rule in the manager |
| manager.beginRule(rule, bMonitor); |
| //set status to RUNNING |
| barrier.setStatus(TestBarrier.STATUS_RUNNING); |
| |
| if (monitor.isCanceled()) |
| return Status.CANCEL_STATUS; |
| |
| //wait until tester allows this job to finish |
| barrier.waitForStatusNoFail(TestBarrier.STATUS_WAIT_FOR_DONE); |
| //end the given rule |
| manager.endRule(rule); |
| //set status to DONE |
| barrier.setStatus(TestBarrier.STATUS_DONE); |
| |
| Thread.yield(); |
| } |
| |
| } finally { |
| monitor.done(); |
| } |
| return Status.OK_STATUS; |
| } |
| |
| } |