blob: fe3ac7f9fc0ad7eee4da60cadb458113fb428c2f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005 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 Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.tests.concurrency;
import java.lang.reflect.InvocationTargetException;
import junit.framework.*;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.operation.IThreadListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
/**
* Tests the following sequence of events:
* 1) Lock is acquired in UI thread
* 2) Modal context thread is started using IThreadListener
* 3) Lock is transferred to modal context thread
* 4) Modal context thread performs an asyncExec
* 5) The asyncExec tries to acquire the same lock held by the modal context
* 6) The modal context thread exits, thus transferring the rule back to the UI thread
* <p>
* Now the rule has been transferred back to the UI thread, but the UI thread
* is in a wait loop waiting to obtain the rule. The UI thread should realize that
* it now owns the lock it is waiting for, and continue with its execution.
* <p>
* See bug 98621 for more details.
* @since 3.2
*/
public class TestBug98621 extends TestCase {
class TransferTestOperation extends WorkspaceModifyOperation implements IThreadListener {
public void execute(final IProgressMonitor pm) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
try {
workspace.run(new IWorkspaceRunnable() {
public void run(IProgressMonitor mon) {
//
}
}, workspace.getRoot(), IResource.NONE, null);
} catch (CoreException ex) {
ex.printStackTrace();
}
}
});
//wait until the asyncExec is blocking the UI thread
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//ignore
}
}
public void threadChange(Thread thread) {
Platform.getJobManager().transferRule(workspace.getRoot(), thread);
}
}
private IWorkspace workspace = ResourcesPlugin.getWorkspace();
public TestBug98621() {
super();
}
public TestBug98621(String name) {
super(name);
}
/**
* Performs the test
*/
public void testBug() throws CoreException {
workspace.run(new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) {
ProgressMonitorDialog dialog = new ProgressMonitorDialog(new Shell());
try {
dialog.run(true, false, new TransferTestOperation());
} catch (InvocationTargetException e) {
e.printStackTrace();
fail(e.getMessage());
} catch (InterruptedException e) {
//ignore
}
}
}, workspace.getRoot(), IResource.NONE, null);
}
}