changeset 505:3cd3c3d37432

Use checked exception to indicate fs lock entanglements
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 30 Nov 2012 22:08:11 +0100
parents bf352ce2b97f
children 27398bbfd543
files src/org/tmatesoft/hg/core/HgRepositoryLockException.java src/org/tmatesoft/hg/repo/HgRepositoryLock.java
diffstat 2 files changed, 42 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/tmatesoft/hg/core/HgRepositoryLockException.java	Fri Nov 30 22:08:11 2012 +0100
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2012 TMate Software Ltd
+ *  
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * For information on how to redistribute this software under
+ * the terms of a license other than GNU General Public License
+ * contact TMate Software at support@hg4j.com
+ */
+package org.tmatesoft.hg.core;
+
+import org.tmatesoft.hg.internal.Experimental;
+import org.tmatesoft.hg.repo.HgRepositoryLock;
+
+/**
+ * Thrown from within {@link HgRepositoryLock} to indicate troubles acquiring or releasing a lock.
+ * 
+ * @author Artem Tikhomirov
+ * @author TMate Software Ltd.
+ */
+@SuppressWarnings("serial")
+@Experimental(reason="Work in progress")
+public class HgRepositoryLockException extends HgException {
+	
+	public HgRepositoryLockException(String message) {
+		super(message);
+	}
+}
--- a/src/org/tmatesoft/hg/repo/HgRepositoryLock.java	Fri Nov 30 21:58:00 2012 +0100
+++ b/src/org/tmatesoft/hg/repo/HgRepositoryLock.java	Fri Nov 30 22:08:11 2012 +0100
@@ -25,6 +25,7 @@
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 
+import org.tmatesoft.hg.core.HgRepositoryLockException;
 import org.tmatesoft.hg.internal.Experimental;
 import org.tmatesoft.hg.internal.Internals;
 
@@ -103,8 +104,9 @@
 	 * 
 	 * <p>Multiple calls are possible, but corresponding number of {@link #release()} 
 	 * calls shall be made.
+	 * @throws HgRepositoryLockException if failed to grab a lock
 	 */
-	public void acquire() {
+	public void acquire() throws HgRepositoryLockException {
 		if (use > 0) {
 			use++;
 			return;
@@ -135,15 +137,16 @@
 			
 		} while (stopTime == -1/*no timeout*/ || System.currentTimeMillis() <= stopTime);
 		String msg = String.format("Failed to aquire lock, waited for %d seconds, present owner: '%s'", timeoutSeconds, readLockInfo());
-		throw new HgInvalidStateException(msg);
+		throw new HgRepositoryLockException(msg);
 	}
 	
 	/**
 	 * Release lock we own
+	 * @throws HgRepositoryLockException if there's no evidence we do own a lock
 	 */
-	public void release() {
+	public void release() throws HgRepositoryLockException {
 		if (use == 0) {
-			throw new HgInvalidStateException("Lock is not held!");
+			throw new HgRepositoryLockException("Lock is not held!");
 		}
 		use--;
 		if (use > 0) {