# HG changeset patch # User Artem Tikhomirov # Date 1354309691 -3600 # Node ID 3cd3c3d374325bfd26ed715f13aef8c53d55427e # Parent bf352ce2b97f909830f2a2d90798de5e0c3fc3ac Use checked exception to indicate fs lock entanglements diff -r bf352ce2b97f -r 3cd3c3d37432 src/org/tmatesoft/hg/core/HgRepositoryLockException.java --- /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); + } +} diff -r bf352ce2b97f -r 3cd3c3d37432 src/org/tmatesoft/hg/repo/HgRepositoryLock.java --- 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 @@ * *

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) {