summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonathan Nieder <jrn@google.com>2018-06-08 01:34:12 -0400
committerGerrit Code Review @ Eclipse.org <gerrit@eclipse.org>2018-06-08 01:34:12 -0400
commitf98112289cd6e919812778f532e4f6398922d7ff (patch)
tree909b085b33c4ada20b2ccc16ee81e7e9499f53f9
parent5f46661cae6b9e7c38b3b79d624c5b9b0f7243d9 (diff)
parenta3738ef137caf27d3fc588d3027f46045ba58ef5 (diff)
downloadjgit-f98112289cd6e919812778f532e4f6398922d7ff.tar.gz
jgit-f98112289cd6e919812778f532e4f6398922d7ff.zip
Merge "Ensure index change event is fired when index snapshot changed" into stable-5.0
-rw-r--r--org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java35
1 files changed, 26 insertions, 9 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
index ed5cf2c9e2..13ef94b898 100644
--- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
+++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
@@ -56,7 +56,7 @@ import java.util.HashSet;
import java.util.Locale;
import java.util.Objects;
import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.ReentrantLock;
import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.api.errors.JGitInternalException;
@@ -125,7 +125,10 @@ public class FileRepository extends Repository {
private final RefDatabase refs;
private final ObjectDirectory objectDatabase;
- private AtomicReference<FileSnapshot> snapshot = new AtomicReference<>();
+ private final ReentrantLock snapshotLock = new ReentrantLock();
+
+ // protected by snapshotLock
+ private FileSnapshot snapshot;
/**
* Construct a representation of a Git repository.
@@ -240,8 +243,9 @@ public class FileRepository extends Repository {
Long.valueOf(repositoryFormatVersion)));
}
- if (!isBare())
- snapshot.getAndSet(FileSnapshot.save(getIndexFile()));
+ if (!isBare()) {
+ snapshot = FileSnapshot.save(getIndexFile());
+ }
}
private void loadSystemConfig() throws IOException {
@@ -549,17 +553,30 @@ public class FileRepository extends Repository {
}
File indexFile = getIndexFile();
- if (snapshot.get() == null) {
- snapshot.getAndSet(FileSnapshot.save(indexFile));
- } else if (snapshot.get().isModified(indexFile)) {
- notifyIndexChanged(false);
+ snapshotLock.lock();
+ try {
+ if (snapshot == null) {
+ snapshot = FileSnapshot.save(indexFile);
+ } else if (snapshot.isModified(indexFile)) {
+ snapshotLock.unlock();
+ notifyIndexChanged(false);
+ }
+ } finally {
+ if (snapshotLock.isHeldByCurrentThread()) {
+ snapshotLock.unlock();
+ }
}
}
/** {@inheritDoc} */
@Override
public void notifyIndexChanged(boolean internal) {
- snapshot.getAndSet(FileSnapshot.save(getIndexFile()));
+ snapshotLock.lock();
+ try {
+ snapshot = FileSnapshot.save(getIndexFile());
+ } finally {
+ snapshotLock.unlock();
+ }
fireEvent(new IndexChangedEvent(internal));
}