Skip to content

Commit 40c5d59

Browse files
author
dlsmith
committed
Cleaned up synchronization strategy in AbstractMasterJVM and MainJVM. Introduced immutable state objects in MainJVM to deal cleanly with concurrent state-change requests. Tests failures related to discard() invocations should no longer occur. Also updated plt.jar (and related dependents).
git-svn-id: file:///tmp/test-svn/trunk@4776 fe72c1cf-3628-48e9-8b72-1c46755d3cff
1 parent 6ec50bb commit 40c5d59

17 files changed

+307
-258
lines changed

drjava/lib/dynamicjava-base.jar

106 Bytes
Binary file not shown.

drjava/lib/javalanglevels-base.jar

2 Bytes
Binary file not shown.

drjava/lib/plt.jar

60.8 KB
Binary file not shown.

drjava/lib/readme.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ VERSIONS:
77

88
asm-3.1.jar: ASM 3.1 (http://asm.objectweb.org)
99
docs.jar: docs-20060901-2010
10-
dynamicjava-base.jar: dynamicjava-20090115-r4705
10+
dynamicjava-base.jar: dynamicjava-20090225-r4773
1111
forms-1.0.7.jar: JGoodies Forms
12-
javalanglevels-base.jar: javalanglevels-20090115-r4704
12+
javalanglevels-base.jar: javalanglevels-20090223-r4766
1313
junit.jar: JUnit 4.4
1414
looks-2.1.4.jar: JGoodies Looks
1515
platform.jar: platform-20090103-r4686
16-
plt.jar: plt-20090115-r4703
16+
plt.jar: plt-20090224-r4770
1717

1818
buildlib/ant-contrib.jar: ANT Contrib 1.0b3
1919
buildlib/cenquatasks.jar: Distributed with Clover 1.3.9

drjava/src/edu/rice/cs/drjava/model/DefaultGlobalModel.java

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ public class DefaultGlobalModel extends AbstractGlobalModel {
110110
/** RMI interface to the Interactions JVM. */
111111
final MainJVM _jvm;
112112

113+
private final Thread _jvmStarter; // thread that invokes _jvm.startInterpreterJVM()
114+
113115
/** Interface between the InteractionsDocument and the JavaInterpreter, which runs in a separate JVM. */
114116
protected final DefaultInteractionsModel _interactionsModel;
115117

@@ -218,9 +220,10 @@ public DefaultGlobalModel() {
218220
// This is obnoxiously order-dependent, but it works for now.
219221
_compilerModel.addListener(_clearInteractionsListener);
220222

221-
new Thread("Start interpreter JVM") {
223+
_jvmStarter = new Thread("Start interpreter JVM") {
222224
public void run() { _jvm.startInterpreterJVM(); }
223-
}.start();
225+
};
226+
_jvmStarter.start();
224227

225228
// Any lightweight parsing has been disabled until we have something that is beneficial and works better in the background.
226229
// _parsingControl = new DefaultLightWeightParsingControl(this);
@@ -295,17 +298,14 @@ public void setBuildDirectory(File f) {
295298

296299
/** Prepares this model to be thrown away. Never called in practice outside of quit(), except in tests. */
297300
public void dispose() {
298-
// dispose() was previously commented out, with a note simply saying it called UnicastRemoteObject.unexport().
299-
// If there's some problem with unexport(), this call can be replaced with killInterpreterJVM(null).
301+
try { _jvmStarter.join(); } // some tests were reach this point before _jvmStarter has completed
302+
catch (InterruptedException e) { throw new UnexpectedException(e); }
300303
_jvm.dispose();
301304
_notifier.removeAllListeners(); // removes the global model listeners!
302305
}
303306

304307
/** Disposes of external resources. Kills the slave JVM. */
305-
public void disposeExternalResources() {
306-
// Kill the interpreter
307-
_jvm.killInterpreterJVM(null);
308-
}
308+
public void disposeExternalResources() { _jvm.stopInterpreterJVM(); }
309309

310310
public void resetInteractions(File wd) { resetInteractions(wd, false); }
311311

@@ -321,18 +321,11 @@ public void resetInteractions(File wd, boolean forceReset) {
321321
debug.logStart();
322322
File workDir = _interactionsModel.getWorkingDirectory();
323323
if (wd == null) { wd = workDir; }
324-
325-
if (! forceReset && ! _jvm.slaveJVMUsed() && ! isClassPathChanged() && wd.equals(workDir)) {
326-
debug.log();
327-
// Eliminate resetting interpreter (slaveJVM) since it has already been reset appropriately.
328-
_interactionsModel._notifyInterpreterReady(wd);
329-
debug.logEnd();
330-
return;
331-
}
324+
forceReset |= isClassPathChanged();
325+
forceReset |= !wd.equals(workDir);
332326
// update the setting
333-
debug.log();
334327
DrJava.getConfig().setSetting(LAST_INTERACTIONS_DIRECTORY, wd);
335-
_interactionsModel.resetInterpreter(wd);
328+
_interactionsModel.resetInterpreter(wd, forceReset);
336329
debug.logEnd();
337330
}
338331

drjava/src/edu/rice/cs/drjava/model/GlobalModel.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import edu.rice.cs.drjava.model.javadoc.JavadocModel;
5555
import edu.rice.cs.drjava.project.DocumentInfoGetter;
5656
import edu.rice.cs.drjava.project.MalformedProjectFileException;
57-
import edu.rice.cs.plt.io.IOUtil;
5857
import edu.rice.cs.util.FileOpenSelector;
5958
import edu.rice.cs.util.OperationCanceledException;
6059
import edu.rice.cs.util.docnavigation.IDocumentNavigator;

drjava/src/edu/rice/cs/drjava/model/SingleDisplayModelTest.java

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ public class SingleDisplayModelTest extends GlobalModelTestCase {
5454

5555
// _log is inherited from GlobalModelTestCase
5656

57-
private Object _readyLock = new Object(); // lock used for wait/notify on interpreterReady event
58-
5957
/** Get the instance of the SingleDisplayModel.*/
6058
private DefaultGlobalModel getSDModel() { return _model; }
6159

@@ -234,12 +232,6 @@ public synchronized boolean canAbandonFile(OpenDefinitionsDocument doc) {
234232
public synchronized void newFileCreated(OpenDefinitionsDocument doc) { newCount++; }
235233
public synchronized void fileClosed(OpenDefinitionsDocument doc) { closeCount++; }
236234
public synchronized void activeDocumentChanged(OpenDefinitionsDocument doc) { switchCount++; }
237-
public synchronized void interpreterReady(File wd) { // closing all files calls resetInteractions
238-
// Utilities.show("interpreterReady(" + wd + ") called");
239-
// Utilities.show("Traceback is:\n" + StringOps.getStackTrace());
240-
interpreterReadyCount++;
241-
synchronized(_readyLock) { _readyLock.notify(); }
242-
}
243235
};
244236

245237
_model.addListener(listener);
@@ -290,14 +282,6 @@ public synchronized void interpreterReady(File wd) { // closing all files calls
290282
assertNumOpenDocs(1);
291283
assertLength(0, _model.getActiveDocument());
292284

293-
// wait for interpreter to be ready
294-
try {
295-
synchronized(_readyLock) {
296-
if (listener.getInterpreterReadyCount() == 0) _readyLock.wait(10000); // intentionally not a while
297-
}
298-
}
299-
catch(InterruptedException e) { fail("Wait for interpreterReady event was interrupted by " + e); }
300-
listener.assertInterpreterReadyCount(1);
301285
listener.assertNewCount(4);
302286
listener.assertCloseCount(4);
303287
listener.assertAbandonCount(4);

drjava/src/edu/rice/cs/drjava/model/repl/InteractionsDJDocumentTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ public void interpreterReady(File wd) {
140140

141141
// Reset the interactions pane, restarting the interpreter
142142
File f = _model.getWorkingDirectory();
143-
_model.resetInterpreter(f);
143+
_model.resetInterpreter(f, true);
144144

145145
// System.err.println("Interpreter reset");
146146

drjava/src/edu/rice/cs/drjava/model/repl/InteractionsModel.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -304,15 +304,15 @@ private void _prepareToInterpret(String text) {
304304
*/
305305
public abstract String getVariableType(String var);
306306

307-
/** Resets the Java interpreter with working directry wd. */
308-
public final void resetInterpreter(File wd) {
307+
/** Resets the Java interpreter with working directory wd. */
308+
public final void resetInterpreter(File wd, boolean force) {
309309
_workingDirectory = wd;
310310
_autoImportSet.clear(); // clear list when interpreter is reset
311-
_resetInterpreter(wd);
311+
_resetInterpreter(wd, force);
312312
}
313313

314314
/** Resets the Java interpreter. This should only be called from resetInterpreter, never directly. */
315-
protected abstract void _resetInterpreter(File wd);
315+
protected abstract void _resetInterpreter(File wd, boolean force);
316316

317317
/** Returns the working directory for the current interpreter. */
318318
public File getWorkingDirectory() { return _workingDirectory; }

drjava/src/edu/rice/cs/drjava/model/repl/InteractionsModelTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ public String getVariableType(String var) {
585585
public void addProjectFilesClassPath(File path) { fail("cannot add to classpath in a test"); }
586586
public void addExternalFilesClassPath(File path) { fail("cannot add to classpath in a test"); }
587587
public void addExtraClassPath(File path) { fail("cannot add to classpath in a test"); }
588-
protected void _resetInterpreter(File wd) { fail("cannot reset interpreter in a test"); }
588+
protected void _resetInterpreter(File wd, boolean force) { fail("cannot reset interpreter in a test"); }
589589

590590
public void _notifyInteractionStarted() { }
591591
protected void _notifySyntaxErrorOccurred(int offset, int length) { }

0 commit comments

Comments
 (0)