mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-14 20:45:22 +02:00
[190613] Properly wait for InitRSEJob to run on remotecdt initialization
This commit is contained in:
parent
8c67a49a89
commit
99e111ceea
1 changed files with 58 additions and 5 deletions
|
@ -18,7 +18,11 @@ import org.eclipse.cdt.launch.ui.CMainTab;
|
||||||
import org.eclipse.core.resources.IProject;
|
import org.eclipse.core.resources.IProject;
|
||||||
import org.eclipse.core.runtime.CoreException;
|
import org.eclipse.core.runtime.CoreException;
|
||||||
import org.eclipse.core.runtime.IPath;
|
import org.eclipse.core.runtime.IPath;
|
||||||
|
import org.eclipse.core.runtime.IProgressMonitor;
|
||||||
|
import org.eclipse.core.runtime.IStatus;
|
||||||
import org.eclipse.core.runtime.Path;
|
import org.eclipse.core.runtime.Path;
|
||||||
|
import org.eclipse.core.runtime.Status;
|
||||||
|
import org.eclipse.core.runtime.jobs.Job;
|
||||||
import org.eclipse.debug.core.ILaunchConfiguration;
|
import org.eclipse.debug.core.ILaunchConfiguration;
|
||||||
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
|
||||||
import org.eclipse.jface.window.Window;
|
import org.eclipse.jface.window.Window;
|
||||||
|
@ -40,6 +44,7 @@ import org.eclipse.swt.layout.GridLayout;
|
||||||
import org.eclipse.swt.widgets.Button;
|
import org.eclipse.swt.widgets.Button;
|
||||||
import org.eclipse.swt.widgets.Combo;
|
import org.eclipse.swt.widgets.Combo;
|
||||||
import org.eclipse.swt.widgets.Composite;
|
import org.eclipse.swt.widgets.Composite;
|
||||||
|
import org.eclipse.swt.widgets.Display;
|
||||||
import org.eclipse.swt.widgets.Label;
|
import org.eclipse.swt.widgets.Label;
|
||||||
import org.eclipse.swt.widgets.Text;
|
import org.eclipse.swt.widgets.Text;
|
||||||
import org.eclipse.ui.PlatformUI;
|
import org.eclipse.ui.PlatformUI;
|
||||||
|
@ -66,6 +71,8 @@ public class RemoteCMainTab extends CMainTab {
|
||||||
protected Button skipDownloadButton;
|
protected Button skipDownloadButton;
|
||||||
protected Button useLocalPathButton;
|
protected Button useLocalPathButton;
|
||||||
|
|
||||||
|
private static int initializedRSE = 0; //0=not initialized; -1=initializing; 1=initialized
|
||||||
|
|
||||||
SystemNewConnectionAction action = null;
|
SystemNewConnectionAction action = null;
|
||||||
|
|
||||||
public RemoteCMainTab(boolean terminalOption) {
|
public RemoteCMainTab(boolean terminalOption) {
|
||||||
|
@ -329,11 +336,57 @@ public class RemoteCMainTab extends CMainTab {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void waitForRSEInit(final Runnable callback) {
|
||||||
|
Job initRSEJob = null;
|
||||||
|
Job[] jobs = Job.getJobManager().find(null);
|
||||||
|
for(int i=0; i<jobs.length; i++) {
|
||||||
|
if ("Initialize RSE".equals(jobs[i].getName())) { //$NON-NLS-1$
|
||||||
|
initRSEJob = jobs[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (initRSEJob == null) {
|
||||||
|
//Already initialized - we can continue right away
|
||||||
|
callback.run();
|
||||||
|
} else {
|
||||||
|
//Wait until model fully restored, then fire a callback to restore state.
|
||||||
|
//Remember current display, since we're definitely on the display thread here
|
||||||
|
final Display display = Display.getCurrent();
|
||||||
|
final Job fInitRSEJob = initRSEJob;
|
||||||
|
Job waitForRestoreCompleteJob = new Job("WaitForRestoreComplete") { //$NON-NLS-1$
|
||||||
|
protected IStatus run(IProgressMonitor monitor) {
|
||||||
|
try {
|
||||||
|
fInitRSEJob.join();
|
||||||
|
display.asyncExec(callback);
|
||||||
|
} catch(InterruptedException e) {
|
||||||
|
return Status.CANCEL_STATUS;
|
||||||
|
}
|
||||||
|
return Status.OK_STATUS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
waitForRestoreCompleteJob.setSystem(true);
|
||||||
|
waitForRestoreCompleteJob.schedule();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void updateConnectionPulldown() {
|
protected void updateConnectionPulldown() {
|
||||||
connectionCombo.removeAll();
|
if (initializedRSE==0) {
|
||||||
// start RSEUIPlugin to make sure the SystemRegistry is initialized.
|
// start RSEUIPlugin to make sure the SystemRegistry is initialized.
|
||||||
boolean isRegistryActive = RSEUIPlugin.isTheSystemRegistryActive();
|
boolean isRegistryActive = RSEUIPlugin.isTheSystemRegistryActive();
|
||||||
if (isRegistryActive) {
|
if (isRegistryActive) {
|
||||||
|
initializedRSE = 1;
|
||||||
|
waitForRSEInit(new Runnable() {
|
||||||
|
public void run() {
|
||||||
|
initializedRSE = 2;
|
||||||
|
updateConnectionPulldown();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else if (initializedRSE<0) {
|
||||||
|
//initializing: nothing to do, callback will come soon
|
||||||
|
} else {
|
||||||
|
//already initialized
|
||||||
|
connectionCombo.removeAll();
|
||||||
IHost[] connections = RSECorePlugin.getTheSystemRegistry().getHostsBySubSystemConfigurationCategory("shells"); //$NON-NLS-1$
|
IHost[] connections = RSECorePlugin.getTheSystemRegistry().getHostsBySubSystemConfigurationCategory("shells"); //$NON-NLS-1$
|
||||||
for(int i = 0; i < connections.length; i++) {
|
for(int i = 0; i < connections.length; i++) {
|
||||||
IRSESystemType sysType = connections[i].getSystemType();
|
IRSESystemType sysType = connections[i].getSystemType();
|
||||||
|
@ -345,7 +398,7 @@ public class RemoteCMainTab extends CMainTab {
|
||||||
|
|
||||||
if(connections.length > 0)
|
if(connections.length > 0)
|
||||||
connectionCombo.select(connections.length - 1);
|
connectionCombo.select(connections.length - 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateTargetProgFromConfig(ILaunchConfiguration config) {
|
protected void updateTargetProgFromConfig(ILaunchConfiguration config) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue