annotate src/org/tmatesoft/hg/repo/HgRepositoryLock.java @ 631:8a5cdcb27b8f

AIOOBE in HgManifest.RevisionMapper. Provide more details about exception context. Create lock file atomically. Test concurrent pull-rebase and read
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 30 May 2013 15:24:17 +0200
parents 5afc7eedb3dd
children 5d8798772cca
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 {
631
8a5cdcb27b8f AIOOBE in HgManifest.RevisionMapper. Provide more details about exception context. Create lock file atomically. Test concurrent pull-rebase and read
Artem Tikhomirov <tikhomirov.artem@gmail.com>
parents: 626
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 }