[Esbox-commits] r1917 - trunk/org.maemo.esbox.maemosdk.core/src/org/maemo/esbox/internal/api/maemosdk/core/tools

ilpyykko at garage.maemo.org ilpyykko at garage.maemo.org
Mon Aug 3 13:41:12 EEST 2009


Author: ilpyykko
Date: 2009-08-03 13:41:11 +0300 (Mon, 03 Aug 2009)
New Revision: 1917

Modified:
   trunk/org.maemo.esbox.maemosdk.core/src/org/maemo/esbox/internal/api/maemosdk/core/tools/XLauncher.java
Log:
Fixed stopping Xephyr instance and created better running instance check.

Modified: trunk/org.maemo.esbox.maemosdk.core/src/org/maemo/esbox/internal/api/maemosdk/core/tools/XLauncher.java
===================================================================
--- trunk/org.maemo.esbox.maemosdk.core/src/org/maemo/esbox/internal/api/maemosdk/core/tools/XLauncher.java	2009-07-31 20:39:18 UTC (rev 1916)
+++ trunk/org.maemo.esbox.maemosdk.core/src/org/maemo/esbox/internal/api/maemosdk/core/tools/XLauncher.java	2009-08-03 10:41:11 UTC (rev 1917)
@@ -12,7 +12,17 @@
 
 package org.maemo.esbox.internal.api.maemosdk.core.tools;
 
-import org.eclipse.core.runtime.*;
+import java.io.IOException;
+import java.net.Socket;
+import java.text.MessageFormat;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.core.runtime.jobs.Job;
 import org.maemo.esbox.internal.maemosdk.core.Activator;
 import org.maemo.esbox.maemosdk.core.MaemoPreferenceConstants;
@@ -26,16 +36,15 @@
 import org.maemo.mica.common.core.machine.ProcessFilterCmdLineRegexp;
 import org.maemo.mica.common.core.preferences.CorePreferenceManager;
 import org.maemo.mica.common.core.preferences.IPreferenceProvider;
-import org.maemo.mica.common.core.process.*;
+import org.maemo.mica.common.core.process.CommandLineArguments;
+import org.maemo.mica.common.core.process.IProcessLauncher;
+import org.maemo.mica.common.core.process.IProcessLauncherFactory;
+import org.maemo.mica.common.core.process.IProcessMonitor;
+import org.maemo.mica.common.core.process.ProcessLauncherParameters;
+import org.maemo.mica.common.core.process.ProcessLauncherUtils;
 import org.maemo.mica.common.core.sdk.ISDKTarget;
 import org.maemo.mica.maemosdk.core.IMaemoSDKPlatform;
 
-import java.io.IOException;
-import java.net.Socket;
-import java.text.MessageFormat;
-import java.util.List;
-import java.util.regex.Pattern;
-
 /**
  * This class maintains knowledge about whether the X server is running in the
  * host, and controls access to starting, stopping, and querying status.
@@ -228,7 +237,12 @@
 		
 		List<String> newCommandLine = getDisplayXServerCommand(prefProvider);
 		if (previousCommandLine != null) {
-			return previousCommandLine.equals(newCommandLine);
+			// Check if processes match, but ignore full executable path and only check process names.  
+			return previousCommandLine.size() >= 1 && previousCommandLine.size() == newCommandLine.size() &&
+				newCommandLine.subList(1, newCommandLine.size()).equals(
+					previousCommandLine.subList(1, previousCommandLine.size()))
+					&& getSimpleProcessName(previousCommandLine.get(0)).equals(
+							getSimpleProcessName(newCommandLine.get(0)));
 		}
 		
 		// we didn't launch it....
@@ -425,9 +439,31 @@
 		previousDisplay = null;
 		
 		// find server to kill
-		if (cmdLine.size() > 0) {
-			killProcess(cmdLine.get(0), "Killing X Server");
+		
+		if (cmdLine.isEmpty()) {
+			return;
 		}
+
+		String executable = getSimpleProcessName(cmdLine.get(0));
+		String diplay = getDisplayValue(prefProvider);
+		
+		IProcess[] processes = MachineRegistry.getInstance().getLocalMachine().
+			getProcessLister().getProcesses(new ProcessFilterCmdLineRegexp(
+					".*" + Pattern.quote(executable) + ".*\\s+" +
+					Pattern.quote(diplay) + "(?:\\s.*|$)", 
+					Pattern.CASE_INSENSITIVE )).toArray(new IProcess[]{});
+
+		if (processes.length <= 0) {
+			processes = getMatchingXProcesses(executable);
+		}
+	
+		for (IProcess process : processes) {
+			try {
+				process.terminate();
+			} catch (IOException e) {
+				throw new MicaException("Error killing " + executable, e);
+			}
+		}
 	}
 
 	/**
@@ -506,36 +542,29 @@
 	}
 
 	/**
-	 * Kill all instances of a given process
-	 * 
-	 * @param processLabel
-	 *            the user-visible name for the process
+	 * Get pure process name from process name string. 
+	 * Example '/bin/sh' returns 'sh' and 'sh' returns 'sh'.
+	 *
+	 * @param processName the process name
+	 * @return the pure process name
 	 */
-	private void killProcess(String processName,
-			String processLabel) throws MicaException {
-		IProcess[] processes = getMatchingXProcesses(processName);
-		for (IProcess process : processes) {
-			try {
-				process.terminate();
-			} catch (IOException e) {
-				throw new MicaException("Error killing " + processName, e);
-			}
+	private static String getSimpleProcessName(String processName) {
+		// resolve pure process name
+		int slashIndex = processName.lastIndexOf("/");
+		if(slashIndex != -1){
+			processName = processName.substring(slashIndex+1); 
 		}
+		return processName;
 	}
-
+	
 	/**
 	 * @param machine
 	 * @return
 	 */
 	private IProcess[] getMatchingXProcesses(String processName) {
-		// resolve pure process name
-		int slashIndex = processName.lastIndexOf("/");
-		if(slashIndex != -1){
-			processName = processName.substring(slashIndex+1); 
-		}
 		List<IProcess> processes = MachineRegistry.getInstance().getLocalMachine().
 			getProcessLister().getProcesses(
-				new ProcessFilterCmdLineRegexp(".*" + processName + ".*",Pattern.CASE_INSENSITIVE));
+				new ProcessFilterCmdLineRegexp(".*" + Pattern.quote(getSimpleProcessName(processName)) + ".*",Pattern.CASE_INSENSITIVE));
 		return (IProcess[]) processes.toArray(new IProcess[processes.size()]);
 	}
 



More information about the Esbox-commits mailing list