### Eclipse Workspace Patch 1.0 #P org.eclipse.osgi Index: supplement/src/org/eclipse/core/runtime/internal/adaptor/Locker_JavaNio.java =================================================================== RCS file: /cvsroot/eclipse/org.eclipse.osgi/supplement/src/org/eclipse/core/runtime/internal/adaptor/Locker_JavaNio.java,v retrieving revision 1.6 diff -u -r1.6 Locker_JavaNio.java --- supplement/src/org/eclipse/core/runtime/internal/adaptor/Locker_JavaNio.java 7 May 2007 20:57:32 -0000 1.6 +++ supplement/src/org/eclipse/core/runtime/internal/adaptor/Locker_JavaNio.java 27 Nov 2007 09:57:43 -0000 @@ -12,15 +12,14 @@ package org.eclipse.core.runtime.internal.adaptor; import java.io.*; -import java.nio.channels.FileLock; -import java.nio.channels.OverlappingFileLockException; +import java.nio.channels.*; import org.eclipse.osgi.util.NLS; /** * Internal class. */ public class Locker_JavaNio implements Locker { - private File lockFile; + private final File lockFile; private FileLock fileLock; private RandomAccessFile raFile; @@ -31,7 +30,12 @@ public synchronized boolean lock() throws IOException { raFile = new RandomAccessFile(lockFile, "rw"); //$NON-NLS-1$ try { - fileLock = raFile.getChannel().tryLock(); + /* + * fix for bug http://bugs.sun.com/view_bug.do?bug_id=6628575 and + * https://bugs.eclipse.org/bugs/show_bug.cgi?id=44735#c17 + */ + FileChannel fc = raFile.getChannel(); + fileLock = fc.tryLock(0, fc.size(), false); } catch (IOException ioe) { // print exception if debugging if (BasicLocation.DEBUG) @@ -69,4 +73,32 @@ raFile = null; } } + + public synchronized boolean isLocked() throws IOException { + if (fileLock != null) + return true; + try { + RandomAccessFile temp = new RandomAccessFile(lockFile, "rw"); //$NON-NLS-1$ + FileLock tempLock = null; + try { + /* + * fix for bug http://bugs.sun.com/view_bug.do?bug_id=6628575 and + * https://bugs.eclipse.org/bugs/show_bug.cgi?id=44735#c17 + */ + FileChannel fc = temp.getChannel(); + tempLock = fc.tryLock(0, fc.size(), false); + if (tempLock != null) { + tempLock.release(); // allow IOException to propagate because that would mean it is still locked + return false; + } + return true; + } catch (OverlappingFileLockException e) { + return true; + } finally { + temp.close(); + } + } catch (FileNotFoundException e) { + return false; + } + } }