Mercurial > jhg
annotate src/org/tmatesoft/hg/repo/HgRepositoryLock.java @ 709:497e697636fc
Report merged lines as changed block if possible, not as a sequence of added/deleted blocks. To facilitate access to merge parent lines AddBlock got mergeLineAt() method that reports index of the line in the second parent (if any), while insertedAt() has been changed to report index in the first parent always
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Wed, 21 Aug 2013 16:23:27 +0200 |
parents | 5d8798772cca |
children |
rev | line source |
---|---|
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
1 /* |
605
c56edf42be64
Commit: update active bookmark with new revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
505
diff
changeset
|
2 * Copyright (c) 2012-2013 TMate Software Ltd |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
3 * |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
4 * This program is free software; you can redistribute it and/or modify |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
6 * the Free Software Foundation; version 2 of the License. |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
7 * |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
8 * This program is distributed in the hope that it will be useful, |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
11 * GNU General Public License for more details. |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
12 * |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
13 * For information on how to redistribute this software under |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
14 * the terms of a license other than GNU General Public License |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
15 * contact TMate Software at support@hg4j.com |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
16 */ |
487
db48a77ec8ff
Access to reposiotry lock mechanism via HgRepositoryLock
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
486
diff
changeset
|
17 package org.tmatesoft.hg.repo; |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
18 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
19 import java.io.File; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
20 import java.io.FileInputStream; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
21 import java.io.FileOutputStream; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
22 import java.io.IOException; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
23 import java.lang.management.ManagementFactory; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
24 import java.net.InetAddress; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
25 import java.nio.ByteBuffer; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
26 import java.nio.channels.FileChannel; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
27 |
505
3cd3c3d37432
Use checked exception to indicate fs lock entanglements
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
489
diff
changeset
|
28 import org.tmatesoft.hg.core.HgRepositoryLockException; |
487
db48a77ec8ff
Access to reposiotry lock mechanism via HgRepositoryLock
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
486
diff
changeset
|
29 import org.tmatesoft.hg.internal.Internals; |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
30 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
31 /** |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
32 * <p>Usage: |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
33 * <pre> |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
34 * HgRepositoryLock lock = hgRepo.getWorkingDirLock(); |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
35 * try { |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
36 * // Actually lock the repo |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
37 * lock.acquire(); |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
38 * /// |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
39 * // do whatever modifies working directory |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
40 * ... |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
41 * } finally { |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
42 * if (lock.isLocked()) { |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
43 * // this check is needed not to release() |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
44 * // erroneously in case acquire() failed (e.g. due to timeout) |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
45 * lock.release(); |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
46 * } |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
47 * |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
48 * </pre> |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
49 * |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
50 * Unlike original mechanism, we don't use symlinks, rather files, as it's easier to implement |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
51 * |
613
f41dd9a3b8af
Remove few Experimental annotations as the API they've marked graduates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
605
diff
changeset
|
52 * <p> |
f41dd9a3b8af
Remove few Experimental annotations as the API they've marked graduates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
605
diff
changeset
|
53 * NOT SAFE FOR MULTITHREAD USE! |
f41dd9a3b8af
Remove few Experimental annotations as the API they've marked graduates
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
605
diff
changeset
|
54 * |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
55 * @see http://code.google.com/p/hg4j/issues/detail?id=35 |
626
5afc7eedb3dd
@since, TODOs. Tests: add 1 sec to deal with fs timestamp granularity on linux
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
619
diff
changeset
|
56 * @since 1.1 |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
57 * @author Artem Tikhomirov |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
58 * @author TMate Software Ltd. |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
59 */ |
487
db48a77ec8ff
Access to reposiotry lock mechanism via HgRepositoryLock
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
486
diff
changeset
|
60 public class HgRepositoryLock { |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
61 /* |
488
45b3b6ca046f
Repository locking mechanism is alive
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
487
diff
changeset
|
62 * Lock .hg/ except .hg/store/ .hg/wlock (new File(hgRepo.getRepoRoot(),"wlock")) |
45b3b6ca046f
Repository locking mechanism is alive
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
487
diff
changeset
|
63 * Lock .hg/store/ .hg/store/lock (HgRepository.repoPathHelper("lock")) |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
64 */ |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
65 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
66 private final File lockFile; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
67 private int use = 0; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
68 private final int timeoutSeconds; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
69 |
487
db48a77ec8ff
Access to reposiotry lock mechanism via HgRepositoryLock
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
486
diff
changeset
|
70 HgRepositoryLock(File lock, int timeoutInSeconds) { |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
71 lockFile = lock; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
72 timeoutSeconds = timeoutInSeconds; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
73 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
74 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
75 /** |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
76 * Tries to read lock file and supplies hostname:pid (or just pid) information from there |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
77 * @return <code>null</code> if no lock file available at the moment |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
78 */ |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
79 public String readLockInfo() { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
80 if (lockFile.exists()) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
81 try { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
82 byte[] bytes = read(lockFile); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
83 if (bytes != null && bytes.length > 0) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
84 return new String(bytes); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
85 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
86 } catch (Exception ex) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
87 // deliberately ignored |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
88 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
89 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
90 return null; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
91 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
92 |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
93 /** |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
94 * @return <code>true</code> if we hold the lock |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
95 */ |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
96 public boolean isLocked() { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
97 return use > 0; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
98 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
99 |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
100 /** |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
101 * Perform actual locking. Waits for timeout (if specified at construction time) |
605
c56edf42be64
Commit: update active bookmark with new revision
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
505
diff
changeset
|
102 * before throwing {@link HgRepositoryLockException} in case lock is not available |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
103 * immediately. |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
104 * |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
105 * <p>Multiple calls are possible, but corresponding number of {@link #release()} |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
106 * calls shall be made. |
505
3cd3c3d37432
Use checked exception to indicate fs lock entanglements
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
489
diff
changeset
|
107 * @throws HgRepositoryLockException if failed to grab a lock |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
108 */ |
505
3cd3c3d37432
Use checked exception to indicate fs lock entanglements
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
489
diff
changeset
|
109 public void acquire() throws HgRepositoryLockException { |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
110 if (use > 0) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
111 use++; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
112 return; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
113 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
114 StringBuilder lockDescription = new StringBuilder(); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
115 lockDescription.append(getHostname()); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
116 lockDescription.append(':'); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
117 lockDescription.append(getPid()); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
118 byte[] bytes = lockDescription.toString().getBytes(); |
487
db48a77ec8ff
Access to reposiotry lock mechanism via HgRepositoryLock
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
486
diff
changeset
|
119 long stopTime = timeoutSeconds < 0 ? -1 : (System.currentTimeMillis() + timeoutSeconds*1000); |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
120 do { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
121 synchronized(this) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
122 try { |
638
2f1cd1c26de5
AIOOBE in HgManifest.RevisionMapper: provide more details about exception context. Create lock file atomically. Picked from changeset 8a5cdcb27b8f
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
505
diff
changeset
|
123 if (lockFile.createNewFile()) { |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
124 write(lockFile, bytes); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
125 use++; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
126 return; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
127 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
128 } catch (IOException ex) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
129 // deliberately ignored |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
130 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
131 try { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
132 wait(1000); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
133 } catch (InterruptedException ex) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
134 // deliberately ignored |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
135 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
136 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
137 |
487
db48a77ec8ff
Access to reposiotry lock mechanism via HgRepositoryLock
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
486
diff
changeset
|
138 } while (stopTime == -1/*no timeout*/ || System.currentTimeMillis() <= stopTime); |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
139 String msg = String.format("Failed to aquire lock, waited for %d seconds, present owner: '%s'", timeoutSeconds, readLockInfo()); |
505
3cd3c3d37432
Use checked exception to indicate fs lock entanglements
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
489
diff
changeset
|
140 throw new HgRepositoryLockException(msg); |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
141 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
142 |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
143 /** |
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
144 * Release lock we own |
505
3cd3c3d37432
Use checked exception to indicate fs lock entanglements
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
489
diff
changeset
|
145 * @throws HgRepositoryLockException if there's no evidence we do own a lock |
489
9c0138cda59a
HgRepositoryLock: some javadoc
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
488
diff
changeset
|
146 */ |
505
3cd3c3d37432
Use checked exception to indicate fs lock entanglements
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
489
diff
changeset
|
147 public void release() throws HgRepositoryLockException { |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
148 if (use == 0) { |
505
3cd3c3d37432
Use checked exception to indicate fs lock entanglements
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
489
diff
changeset
|
149 throw new HgRepositoryLockException("Lock is not held!"); |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
150 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
151 use--; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
152 if (use > 0) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
153 return; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
154 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
155 // do release |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
156 lockFile.delete(); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
157 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
158 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
159 protected String getHostname() { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
160 try { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
161 return InetAddress.getLocalHost().getHostName(); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
162 } catch (Exception ex) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
163 return "localhost"; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
164 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
165 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
166 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
167 protected int getPid() { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
168 try { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
169 // @see http://blog.igorminar.com/2007/03/how-java-application-can-discover-its.html |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
170 if (!Internals.runningOnWindows()) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
171 File f = new File("/proc/self"); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
172 if (f.exists()) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
173 // /proc/self is a symlink to /proc/pid/ directory |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
174 return Integer.parseInt(f.getCanonicalFile().getName()); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
175 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
176 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
177 String rtBean = ManagementFactory.getRuntimeMXBean().getName(); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
178 int x; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
179 if ((x = rtBean.indexOf('@')) != -1) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
180 return Integer.parseInt(rtBean.substring(0, x)); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
181 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
182 return -1; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
183 } catch (Exception ex) { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
184 return -1; |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
185 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
186 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
187 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
188 private static void write(File f, byte[] content) throws IOException { |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
189 FileOutputStream fos = new FileOutputStream(f); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
190 fos.write(content); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
191 fos.close(); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
192 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
193 |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
194 private static byte[] read(File f) throws IOException { |
619
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
613
diff
changeset
|
195 FileInputStream fis = new FileInputStream(f); |
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
613
diff
changeset
|
196 FileChannel fc = fis.getChannel(); |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
197 ByteBuffer bb = ByteBuffer.allocate(Internals.ltoi(fc.size())); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
198 fc.read(bb); |
619
868b2ffdcd5c
Close FIS, not FileChannel, to clear both references to FileDescriptor right away
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
613
diff
changeset
|
199 fis.close(); |
486
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
200 return bb.array(); |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
201 } |
d740edfff563
Provisional support for Mercurial lock mechanism
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents:
diff
changeset
|
202 } |