diff options
author | Jonathan Nieder <jrn@google.com> | 2018-06-08 01:34:12 -0400 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org <gerrit@eclipse.org> | 2018-06-08 01:34:12 -0400 |
commit | f98112289cd6e919812778f532e4f6398922d7ff (patch) | |
tree | 909b085b33c4ada20b2ccc16ee81e7e9499f53f9 | |
parent | 5f46661cae6b9e7c38b3b79d624c5b9b0f7243d9 (diff) | |
parent | a3738ef137caf27d3fc588d3027f46045ba58ef5 (diff) | |
download | jgit-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.java | 35 |
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)); } |