annotate dwtx/core/internal/jobs/ThreadJob.d @ 163:e5dd0081ccba

exclude jface.text from dsss.conf
author Frank Benoit <benoit@tionex.de>
date Mon, 08 Sep 2008 01:01:30 +0200
parents 9d0585bcb7aa
children 862b05e0334a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
122
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
1 /*******************************************************************************
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
2 * Copyright (c) 2004, 2007 IBM Corporation and others.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
3 * All rights reserved. This program and the accompanying materials
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
4 * are made available under the terms of the Eclipse Public License v1.0
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
5 * which accompanies this distribution, and is available at
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
6 * http://www.eclipse.org/legal/epl-v10.html
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
7 *
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
8 * Contributors:
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
9 * IBM - Initial API and implementation
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
10 * Port to the D programming language:
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
11 * Frank Benoit <benoit@tionex.de>
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
12 *******************************************************************************/
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
13 module dwtx.core.internal.jobs.ThreadJob;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
14
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
15 import dwt.dwthelper.utils;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
16 import tango.text.convert.Format;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
17 import tango.io.Stdout;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
18 import tango.core.Thread;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
19 import tango.core.sync.Mutex;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
20 import tango.core.sync.Condition;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
21
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
22 import dwtx.core.internal.runtime.RuntimeLog;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
23 import dwtx.core.runtime.Assert;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
24 import dwtx.core.runtime.IProgressMonitor;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
25 import dwtx.core.runtime.IStatus;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
26 import dwtx.core.runtime.OperationCanceledException;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
27 import dwtx.core.runtime.Status;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
28 import dwtx.core.runtime.jobs.ISchedulingRule;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
29 import dwtx.core.runtime.jobs.Job;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
30 import dwtx.core.internal.jobs.JobManager;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
31 import dwtx.core.internal.jobs.InternalJob;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
32 import dwtx.core.internal.jobs.LockManager;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
33
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
34 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
35 * Captures the implicit job state for a given thread.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
36 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
37 class ThreadJob : Job {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
38 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
39 * The notifier is a shared object used to wake up waiting thread jobs
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
40 * when another job completes that is releasing a scheduling rule.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
41 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
42
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
43 static const Mutex mutex;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
44 static const Condition condition;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
45 static this(){
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
46 mutex = new Mutex();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
47 condition = new Condition(mutex);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
48 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
49
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
50 private const JobManager manager;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
51 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
52 * Set to true if this thread job is running in a thread that did
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
53 * not own a rule already. This means it needs to acquire the
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
54 * rule during beginRule, and must release the rule during endRule.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
55 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
56 /+protected+/ bool acquireRule = false;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
57
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
58 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
59 * Indicates that this thread job did report to the progress manager
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
60 * that it will be blocked, and therefore when it begins it must
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
61 * be reported to the job manager when it is no longer blocked.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
62 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
63 bool isBlocked = false;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
64
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
65 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
66 * True if this ThreadJob has begun execution
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
67 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
68 /+protected+/ bool isRunning_ = false;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
69
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
70 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
71 * Used for diagnosing mismatched begin/end pairs. This field
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
72 * is only used when in debug mode, to capture the stack trace
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
73 * of the last call to beginRule.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
74 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
75 private RuntimeException lastPush = null;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
76 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
77 * The actual job that is running in the thread that this
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
78 * ThreadJob represents. This will be null if this thread
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
79 * job is capturing a rule acquired outside of a job.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
80 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
81 protected package Job realJob;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
82 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
83 * The stack of rules that have been begun in this thread, but not yet ended.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
84 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
85 private ISchedulingRule[] ruleStack;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
86 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
87 * Rule stack pointer.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
88 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
89 private int top;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
90
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
91 this(JobManager manager, ISchedulingRule rule) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
92 super("Implicit Job"); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
93 this.manager = manager;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
94 setSystem(true);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
95 setPriority(Job.INTERACTIVE);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
96 ruleStack = new ISchedulingRule[2];
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
97 top = -1;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
98 setRule(rule);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
99 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
100
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
101 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
102 * An endRule was called that did not match the last beginRule in
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
103 * the stack. Report and log a detailed informational message.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
104 * @param rule The rule that was popped
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
105 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
106 private void illegalPop(ISchedulingRule rule) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
107 StringBuffer buf = new StringBuffer("Attempted to endRule: "); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
108 buf.append(Format("{}",rule));
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
109 if (top >= 0 && top < ruleStack.length) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
110 buf.append(", does not match most recent begin: "); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
111 buf.append(Format("{}",ruleStack[top]));
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
112 } else {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
113 if (top < 0)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
114 buf.append(", but there was no matching beginRule"); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
115 else
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
116 buf.append( Format(", but the rule stack was out of bounds: {}", top)); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
117 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
118 buf.append(". See log for trace information if rule tracing is enabled."); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
119 String msg = buf.toString();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
120 if (JobManager.DEBUG || JobManager.DEBUG_BEGIN_END) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
121 Stdout.formatln("{}",msg);
163
e5dd0081ccba exclude jface.text from dsss.conf
Frank Benoit <benoit@tionex.de>
parents: 122
diff changeset
122 Exception t = lastPush is null ? cast(Exception)new IllegalArgumentException("") : cast(Exception)lastPush;
122
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
123 IStatus error = new Status(IStatus.ERROR, JobManager.PI_JOBS, 1, msg, t);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
124 RuntimeLog.log(error);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
125 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
126 Assert.isLegal(false, msg);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
127 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
128
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
129 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
130 * Client has attempted to begin a rule that is not contained within
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
131 * the outer rule.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
132 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
133 private void illegalPush(ISchedulingRule pushRule, ISchedulingRule baseRule) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
134 StringBuffer buf = new StringBuffer("Attempted to beginRule: "); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
135 buf.append(Format("{}",pushRule));
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
136 buf.append(", does not match outer scope rule: "); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
137 buf.append(Format("{}",baseRule));
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
138 String msg = buf.toString();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
139 if (JobManager.DEBUG) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
140 Stdout.formatln("{}",msg);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
141 IStatus error = new Status(IStatus.ERROR, JobManager.PI_JOBS, 1, msg, new IllegalArgumentException(""));
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
142 RuntimeLog.log(error);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
143 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
144 Assert.isLegal(false, msg);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
145
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
146 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
147
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
148 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
149 * Returns true if the monitor is canceled, and false otherwise.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
150 * Protects the caller from exception in the monitor implementation.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
151 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
152 private bool isCanceled(IProgressMonitor monitor) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
153 try {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
154 return monitor.isCanceled();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
155 } catch (RuntimeException e) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
156 //logged message should not be translated
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
157 IStatus status = new Status(IStatus.ERROR, JobManager.PI_JOBS, JobManager.PLUGIN_ERROR, "ThreadJob.isCanceled", e); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
158 RuntimeLog.log(status);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
159 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
160 return false;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
161 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
162
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
163 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
164 * Returns true if this thread job was scheduled and actually started running.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
165 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
166 bool isRunning() {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
167 synchronized(mutex){
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
168 return isRunning_;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
169 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
170 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
171
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
172 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
173 * Schedule the job and block the calling thread until the job starts running.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
174 * Returns the ThreadJob instance that was started.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
175 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
176 ThreadJob joinRun(IProgressMonitor monitor) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
177 if (isCanceled(monitor))
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
178 throw new OperationCanceledException();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
179 //check if there is a blocking thread before waiting
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
180 InternalJob blockingJob = manager.findBlockingJob_package(this);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
181 Thread blocker = blockingJob is null ? null : blockingJob.getThread_package();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
182 ThreadJob result = this;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
183 try {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
184 //just return if lock listener decided to grant immediate access
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
185 if (manager.getLockManager().aboutToWait(blocker))
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
186 return this;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
187 try {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
188 waitStart(monitor, blockingJob);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
189 final Thread getThis = Thread.getThis();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
190 while (true) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
191 if (isCanceled(monitor))
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
192 throw new OperationCanceledException();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
193 //try to run the job
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
194 if (manager.runNow_package(this))
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
195 return this;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
196 //update blocking job
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
197 blockingJob = manager.findBlockingJob_package(this);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
198 //the rule could have been transferred to this thread while we were waiting
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
199 blocker = blockingJob is null ? null : blockingJob.getThread_package();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
200 if (blocker is getThis && cast(ThreadJob)blockingJob ) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
201 //now we are just the nested acquire case
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
202 result = cast(ThreadJob) blockingJob;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
203 result.push(getRule());
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
204 result.isBlocked = this.isBlocked;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
205 return result;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
206 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
207 //just return if lock listener decided to grant immediate access
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
208 if (manager.getLockManager().aboutToWait(blocker))
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
209 return this;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
210 //must lock instance before calling wait
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
211 synchronized (mutex) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
212 try {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
213 condition.wait(0.250);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
214 } catch (InterruptedException e) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
215 //ignore
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
216 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
217 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
218 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
219 } finally {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
220 if (this is result)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
221 waitEnd(monitor);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
222 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
223 } finally {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
224 manager.getLockManager().aboutToRelease();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
225 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
226 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
227
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
228 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
229 * Pops a rule. Returns true if it was the last rule for this thread
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
230 * job, and false otherwise.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
231 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
232 bool pop(ISchedulingRule rule) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
233 if (top < 0 || ruleStack[top] !is rule)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
234 illegalPop(rule);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
235 ruleStack[top--] = null;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
236 return top < 0;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
237 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
238
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
239 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
240 * Adds a new scheduling rule to the stack of rules for this thread. Throws
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
241 * a runtime exception if the new rule is not compatible with the base
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
242 * scheduling rule for this thread.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
243 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
244 void push(ISchedulingRule rule) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
245 ISchedulingRule baseRule = getRule();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
246 if (++top >= ruleStack.length) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
247 ISchedulingRule[] newStack = new ISchedulingRule[ruleStack.length * 2];
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
248 SimpleType!(ISchedulingRule).arraycopy(ruleStack, 0, newStack, 0, ruleStack.length);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
249 ruleStack = newStack;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
250 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
251 ruleStack[top] = rule;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
252 if (JobManager.DEBUG_BEGIN_END)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
253 lastPush = new RuntimeException()/+).fillInStackTrace()+/;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
254 //check for containment last because we don't want to fail again on endRule
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
255 if (baseRule !is null && rule !is null && !baseRule.contains(rule))
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
256 illegalPush(rule, baseRule);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
257 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
258
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
259 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
260 * Reset all of this job's fields so it can be reused. Returns false if
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
261 * reuse is not possible
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
262 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
263 bool recycle() {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
264 //don't recycle if still running for any reason
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
265 if (getState() !is Job.NONE)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
266 return false;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
267 //clear and reset all fields
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
268 acquireRule = isRunning_ = isBlocked = false;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
269 realJob = null;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
270 setRule(null);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
271 setThread(null);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
272 if (ruleStack.length !is 2)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
273 ruleStack = new ISchedulingRule[2];
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
274 else
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
275 ruleStack[0] = ruleStack[1] = null;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
276 top = -1;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
277 return true;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
278 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
279
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
280 /** (non-Javadoc)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
281 * @see dwtx.core.runtime.jobs.Job#run(dwtx.core.runtime.IProgressMonitor)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
282 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
283 public IStatus run(IProgressMonitor monitor) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
284 synchronized (this) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
285 isRunning_ = true;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
286 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
287 return ASYNC_FINISH;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
288 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
289
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
290 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
291 * Records the job that is actually running in this thread, if any
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
292 * @param realJob The running job
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
293 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
294 void setRealJob(Job realJob) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
295 this.realJob = realJob;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
296 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
297
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
298 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
299 * Returns true if this job should cause a self-canceling job
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
300 * to cancel itself, and false otherwise.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
301 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
302 bool shouldInterrupt() {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
303 return realJob is null ? true : !realJob.isSystem();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
304 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
305
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
306 /* (non-javadoc)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
307 * For debugging purposes only
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
308 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
309 public String toString() {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
310 StringBuffer buf = new StringBuffer("ThreadJob"); //$NON-NLS-1$
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
311 buf.append('(').append(Format("{}",realJob)).append(',').append('[');
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
312 for (int i = 0; i <= top && i < ruleStack.length; i++)
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
313 buf.append(Format("{}",ruleStack[i])).append(',');
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
314 buf.append(']').append(')');
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
315 return buf.toString();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
316 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
317
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
318 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
319 * Reports that this thread was blocked, but is no longer blocked and is able
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
320 * to proceed.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
321 * @param monitor The monitor to report unblocking to.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
322 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
323 private void waitEnd(IProgressMonitor monitor) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
324 final LockManager lockManager = manager.getLockManager();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
325 final Thread getThis = Thread.getThis();
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
326 if (isRunning()) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
327 lockManager.addLockThread(getThis, getRule());
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
328 //need to re-acquire any locks that were suspended while this thread was blocked on the rule
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
329 lockManager.resumeSuspendedLocks(getThis);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
330 } else {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
331 //tell lock manager that this thread gave up waiting
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
332 lockManager.removeLockWaitThread(getThis, getRule());
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
333 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
334 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
335
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
336 /**
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
337 * Indicates the start of a wait on a scheduling rule. Report the
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
338 * blockage to the progress manager and update the lock manager.
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
339 * @param monitor The monitor to report blocking to
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
340 * @param blockingJob The job that is blocking this thread, or <code>null</code>
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
341 */
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
342 private void waitStart(IProgressMonitor monitor, InternalJob blockingJob) {
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
343 manager.getLockManager().addLockWaitThread(Thread.getThis(), getRule());
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
344 isBlocked = true;
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
345 manager.reportBlocked(monitor, blockingJob);
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
346 }
9d0585bcb7aa Add core.jobs package
Frank Benoit <benoit@tionex.de>
parents:
diff changeset
347 }