Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 183286
Collapse All | Expand All

(-)src/org/eclipse/core/internal/jobs/InternalJob.java (+20 lines)
Lines 42-47 Link Here
42
	private static final int M_STATE = 0xFF;
42
	private static final int M_STATE = 0xFF;
43
	private static final int M_SYSTEM = 0x0100;
43
	private static final int M_SYSTEM = 0x0100;
44
	private static final int M_USER = 0x0200;
44
	private static final int M_USER = 0x0200;
45
	
46
	/*
47
	 * flag on a job indicating that it was about to run, but has been canceled
48
	 */
49
	private static final int M_ABOUT_TO_RUN_CANCELED = 0x0400;
45
50
46
	protected static final JobManager manager = JobManager.getInstance();
51
	protected static final JobManager manager = JobManager.getInstance();
47
	private static int nextJobNumber = 0;
52
	private static int nextJobNumber = 0;
Lines 268-273 Link Here
268
		flags = (flags & ~M_STATE) | i;
273
		flags = (flags & ~M_STATE) | i;
269
	}
274
	}
270
275
276
	/**
277
	 * Returns whether this job was canceled when it was about to run
278
	 */
279
	final boolean isAboutToRunCanceled(){
280
		return (flags & M_ABOUT_TO_RUN_CANCELED) != 0;
281
	}
282
271
	/* (non-Javadoc)
283
	/* (non-Javadoc)
272
	 * @see Job#isBlocking()
284
	 * @see Job#isBlocking()
273
	 */
285
	 */
Lines 355-360 Link Here
355
		if (shouldSchedule())
367
		if (shouldSchedule())
356
			manager.schedule(this, delay, false);
368
			manager.schedule(this, delay, false);
357
	}
369
	}
370
	
371
	/**
372
	 * Sets whether this job was canceled when it was about to run
373
	 */
374
	final void setAboutToRunCanceled(boolean value) {
375
		flags = value ? flags | M_ABOUT_TO_RUN_CANCELED : flags & ~M_ABOUT_TO_RUN_CANCELED;
376
		
377
	}
358
378
359
	/* (non-Javadoc)
379
	/* (non-Javadoc)
360
	 * @see Job#setName(String)
380
	 * @see Job#setName(String)
(-)src/org/eclipse/core/internal/jobs/JobManager.java (-7 / +13 lines)
Lines 57-63 Link Here
57
	static boolean DEBUG_TIMING = false;
57
	static boolean DEBUG_TIMING = false;
58
	static boolean DEBUG_SHUTDOWN = false;
58
	static boolean DEBUG_SHUTDOWN = false;
59
	private static DateFormat DEBUG_FORMAT;
59
	private static DateFormat DEBUG_FORMAT;
60
	private static final IProgressMonitor NULL_MONITOR = new NullProgressMonitor();
61
60
62
	/**
61
	/**
63
	 * The singleton job manager instance. It must be a singleton because
62
	 * The singleton job manager instance. It must be a singleton because
Lines 241-247 Link Here
241
						monitor = job.getProgressMonitor();
240
						monitor = job.getProgressMonitor();
242
						break;
241
						break;
243
					}
242
					}
244
					//fall through for ABOUT_TO_RUN case
243
					//signal that the job should be canceled before it gets a chance to run
244
					job.setAboutToRunCanceled(true);
245
					return true;
245
				default :
246
				default :
246
					changeState(job, Job.NONE);
247
					changeState(job, Job.NONE);
247
			}
248
			}
Lines 538-544 Link Here
538
			if (JobManager.DEBUG && notify)
539
			if (JobManager.DEBUG && notify)
539
				JobManager.debug("Ending job: " + job); //$NON-NLS-1$
540
				JobManager.debug("Ending job: " + job); //$NON-NLS-1$
540
			job.setResult(result);
541
			job.setResult(result);
541
			job.setProgressMonitor(NULL_MONITOR);
542
			job.setProgressMonitor(null);
542
			job.setThread(null);
543
			job.setThread(null);
543
			rescheduleDelay = job.getStartTime();
544
			rescheduleDelay = job.getStartTime();
544
			changeState(job, Job.NONE);
545
			changeState(job, Job.NONE);
Lines 1125-1134 Link Here
1125
				synchronized (lock) {
1126
				synchronized (lock) {
1126
					if (job.getState() == Job.RUNNING) {
1127
					if (job.getState() == Job.RUNNING) {
1127
						InternalJob internal = job;
1128
						InternalJob internal = job;
1128
						internal.setProgressMonitor(createMonitor(job));
1129
						if (internal.isAboutToRunCanceled()) {
1129
						//change from ABOUT_TO_RUN to RUNNING
1130
							internal.setAboutToRunCanceled(false);
1130
						internal.internalSetState(Job.RUNNING);
1131
							//fall through and end the job below
1131
						break;
1132
						} else {
1133
							internal.setProgressMonitor(createMonitor(job));
1134
							//change from ABOUT_TO_RUN to RUNNING
1135
							internal.internalSetState(Job.RUNNING);
1136
							break;
1137
						}
1132
					}
1138
					}
1133
				}
1139
				}
1134
			}
1140
			}

Return to bug 183286