Merge changes from Rollup2
diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
index c4adb5f..bd3d978 100644
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
+++ b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/InternalPlatform.java
@@ -42,6 +42,9 @@
 	private static boolean splashDown = false;

 	private static boolean cacheRegistry = false;

 

+	private static File lockFile = null;

+	private static RandomAccessFile lockRAF = null;

+

 	// default plugin data

 	private static final String PI_XML = "org.apache.xerces";

 	private static final String PLUGINSDIR = "plugins/";

@@ -169,6 +172,48 @@
 	}

 	return result == null ? null : result.toString();

 }

+/**

+ * Closes the open lock file handle, and makes a silent best

+ * attempt to delete the file.

+ */

+private static synchronized void clearLockFile() {

+	try {

+		if (lockRAF != null) {

+			lockRAF.close();

+			lockRAF = null;

+		}

+	} catch (IOException e) {

+	}

+	if (lockFile != null) {

+		lockFile.delete();

+		lockFile = null;

+	}

+}

+/**

+ * Creates a lock file in the meta-area that indicates the meta-area

+ * is in use, preventing other eclipse instances from concurrently

+ * using the same meta-area.

+ */

+private static synchronized void createLockFile() throws CoreException {

+	String lockLocation = metaArea.getLocation().append(PlatformMetaArea.F_LOCK_FILE).toOSString();

+	lockFile = new File(lockLocation);

+	//if the lock file already exists, try to delete,

+	//assume failure means another eclipse has it open

+	if (lockFile.exists())

+		lockFile.delete();

+	if (lockFile.exists()) {

+		String message = Policy.bind("meta.inUse", lockLocation);

+		throw new CoreException(new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.FAILED_WRITE_METADATA, message, null));

+	}

+	try {

+		//open the lock file so other instances can't co-exist

+		lockRAF = new RandomAccessFile(lockFile, "rw");

+		lockRAF.writeByte(0);

+	} catch (IOException e) {

+		String message = Policy.bind("meta.failCreateLock", lockLocation);

+		throw new CoreException(new Status(IStatus.ERROR, Platform.PI_RUNTIME, Platform.FAILED_WRITE_METADATA, message, e));

+	}

+}

 

 /**

  * Creates and remembers a spoofed up class loader which loads the

@@ -476,6 +521,7 @@
 public static void loaderShutdown() {

 	assertInitialized();

 	registry.shutdown(null);

+	clearLockFile();

 	if (DEBUG_PLUGINS) {

 		// We are debugging so output the registry in XML

 		// format.

@@ -526,6 +572,7 @@
 public static void loaderStartup(URL[] pluginPath, String locationString, Properties bootOptions, String[] args) throws CoreException {

 	processCommandLine(args);

 	setupMetaArea(locationString);

+	createLockFile();

 	adapterManager = new AdapterManager();

 	loadOptions(bootOptions);

 	createXMLClassLoader();

diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformMetaArea.java b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformMetaArea.java
index 2ba0f02..2c85efa 100644
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformMetaArea.java
+++ b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/PlatformMetaArea.java
@@ -22,6 +22,8 @@
 	/* package */ static final String F_BACKUP = ".bak";

 	/* package */ static final String F_OPTIONS = ".options";	

 	/* package */ static final String F_KEYRING = ".keyring";	

+	/* package */ static final String F_LOCK_FILE = ".lock";

+	

 /**

  * 

  */

diff --git a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties
index edd0d4f..edc98a6 100644
--- a/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties
+++ b/bundles/org.eclipse.core.runtime/src/org/eclipse/core/internal/runtime/messages.properties
@@ -34,6 +34,10 @@
 ### metadata

 meta.unableToWriteRegistry = Unable to write plug-in registry to cache.

 meta.appNotInit = The application has not been initialized.

+meta.failCreateLock = Unable to create platform lock file: {0}.

+meta.inUse = \nThe platform metadata area is already in use by another platform instance, or there was a failure\n\

+	in deleting the old lock file.  If no other platform instances are running, delete the \n\

+	lock file ({0}) and try starting the platform again.

 meta.pluginProblems = Problems occurred when invoking code from plug-in: {0}.

 meta.notDir = Specified platform location {0} is not a directory.

 meta.readPlatformMeta = Could not read platform metadata: {0}.