Mercurial > jhg
comparison src/org/tmatesoft/hg/repo/HgRepositoryLock.java @ 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 | 9c0138cda59a |
children | c56edf42be64 2f1cd1c26de5 |
comparison
equal
deleted
inserted
replaced
504:bf352ce2b97f | 505:3cd3c3d37432 |
---|---|
23 import java.lang.management.ManagementFactory; | 23 import java.lang.management.ManagementFactory; |
24 import java.net.InetAddress; | 24 import java.net.InetAddress; |
25 import java.nio.ByteBuffer; | 25 import java.nio.ByteBuffer; |
26 import java.nio.channels.FileChannel; | 26 import java.nio.channels.FileChannel; |
27 | 27 |
28 import org.tmatesoft.hg.core.HgRepositoryLockException; | |
28 import org.tmatesoft.hg.internal.Experimental; | 29 import org.tmatesoft.hg.internal.Experimental; |
29 import org.tmatesoft.hg.internal.Internals; | 30 import org.tmatesoft.hg.internal.Internals; |
30 | 31 |
31 /** | 32 /** |
32 * NOT SAFE FOR MULTITHREAD USE! | 33 * NOT SAFE FOR MULTITHREAD USE! |
101 * before throwing {@link HgInvalidStateException} in case lock is not available | 102 * before throwing {@link HgInvalidStateException} in case lock is not available |
102 * immediately. | 103 * immediately. |
103 * | 104 * |
104 * <p>Multiple calls are possible, but corresponding number of {@link #release()} | 105 * <p>Multiple calls are possible, but corresponding number of {@link #release()} |
105 * calls shall be made. | 106 * calls shall be made. |
106 */ | 107 * @throws HgRepositoryLockException if failed to grab a lock |
107 public void acquire() { | 108 */ |
109 public void acquire() throws HgRepositoryLockException { | |
108 if (use > 0) { | 110 if (use > 0) { |
109 use++; | 111 use++; |
110 return; | 112 return; |
111 } | 113 } |
112 StringBuilder lockDescription = new StringBuilder(); | 114 StringBuilder lockDescription = new StringBuilder(); |
133 } | 135 } |
134 } | 136 } |
135 | 137 |
136 } while (stopTime == -1/*no timeout*/ || System.currentTimeMillis() <= stopTime); | 138 } while (stopTime == -1/*no timeout*/ || System.currentTimeMillis() <= stopTime); |
137 String msg = String.format("Failed to aquire lock, waited for %d seconds, present owner: '%s'", timeoutSeconds, readLockInfo()); | 139 String msg = String.format("Failed to aquire lock, waited for %d seconds, present owner: '%s'", timeoutSeconds, readLockInfo()); |
138 throw new HgInvalidStateException(msg); | 140 throw new HgRepositoryLockException(msg); |
139 } | 141 } |
140 | 142 |
141 /** | 143 /** |
142 * Release lock we own | 144 * Release lock we own |
143 */ | 145 * @throws HgRepositoryLockException if there's no evidence we do own a lock |
144 public void release() { | 146 */ |
147 public void release() throws HgRepositoryLockException { | |
145 if (use == 0) { | 148 if (use == 0) { |
146 throw new HgInvalidStateException("Lock is not held!"); | 149 throw new HgRepositoryLockException("Lock is not held!"); |
147 } | 150 } |
148 use--; | 151 use--; |
149 if (use > 0) { | 152 if (use > 0) { |
150 return; | 153 return; |
151 } | 154 } |