mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-148148 use read/write locks instead of synchronizing to avoid read-read blocking
This commit is contained in:
@@ -27,11 +27,17 @@ import com.intellij.util.containers.ContainerUtil;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.concurrent.locks.Lock;
|
||||||
|
import java.util.concurrent.locks.ReadWriteLock;
|
||||||
|
import java.util.concurrent.locks.ReentrantReadWriteLock;
|
||||||
|
|
||||||
public class IgnoredFilesComponent {
|
public class IgnoredFilesComponent {
|
||||||
private final Set<IgnoredFileBean> myFilesToIgnore;
|
private final Set<IgnoredFileBean> myFilesToIgnore;
|
||||||
private final Map<String, IgnoredFileBean> myFilesMap;
|
private final Map<String, IgnoredFileBean> myFilesMap;
|
||||||
private final Set<String> myDirectoriesManuallyRemovedFromIgnored;
|
private final Set<String> myDirectoriesManuallyRemovedFromIgnored;
|
||||||
|
private final ReadWriteLock myLock = new ReentrantReadWriteLock();
|
||||||
|
private final Lock myReadLock = myLock.readLock();
|
||||||
|
private final Lock myWriteLock = myLock.writeLock();
|
||||||
|
|
||||||
public IgnoredFilesComponent(final Project project, final boolean registerListener) {
|
public IgnoredFilesComponent(final Project project, final boolean registerListener) {
|
||||||
myFilesToIgnore = new LinkedHashSet<IgnoredFileBean>();
|
myFilesToIgnore = new LinkedHashSet<IgnoredFileBean>();
|
||||||
@@ -66,10 +72,14 @@ public class IgnoredFilesComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void add(final IgnoredFileBean... filesToIgnore) {
|
public void add(final IgnoredFileBean... filesToIgnore) {
|
||||||
synchronized (myFilesToIgnore) {
|
myWriteLock.lock();
|
||||||
|
try {
|
||||||
Collections.addAll(myFilesToIgnore, filesToIgnore);
|
Collections.addAll(myFilesToIgnore, filesToIgnore);
|
||||||
addIgnoredFiles(filesToIgnore);
|
addIgnoredFiles(filesToIgnore);
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myWriteLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Set<String> getDirectoriesManuallyRemovedFromIgnored() {
|
public Set<String> getDirectoriesManuallyRemovedFromIgnored() {
|
||||||
@@ -82,7 +92,8 @@ public class IgnoredFilesComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addIgnoredDirectoryImplicitly(@NotNull String path, @NotNull Project project) {
|
public void addIgnoredDirectoryImplicitly(@NotNull String path, @NotNull Project project) {
|
||||||
synchronized (myFilesToIgnore) {
|
myWriteLock.lock();
|
||||||
|
try {
|
||||||
if (myDirectoriesManuallyRemovedFromIgnored.contains(path) || myDirectoriesManuallyRemovedFromIgnored.contains(path + "/")) {
|
if (myDirectoriesManuallyRemovedFromIgnored.contains(path) || myDirectoriesManuallyRemovedFromIgnored.contains(path + "/")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -101,6 +112,9 @@ public class IgnoredFilesComponent {
|
|||||||
myFilesToIgnore.removeAll(toRemove);
|
myFilesToIgnore.removeAll(toRemove);
|
||||||
myFilesToIgnore.add(IgnoredBeanFactory.ignoreUnderDirectory(path, project));
|
myFilesToIgnore.add(IgnoredBeanFactory.ignoreUnderDirectory(path, project));
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myWriteLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addIgnoredFiles(final IgnoredFileBean... filesToIgnore) {
|
private void addIgnoredFiles(final IgnoredFileBean... filesToIgnore) {
|
||||||
@@ -117,43 +131,64 @@ public class IgnoredFilesComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void clear() {
|
public void clear() {
|
||||||
synchronized (myFilesToIgnore) {
|
myWriteLock.lock();
|
||||||
|
try {
|
||||||
myFilesToIgnore.clear();
|
myFilesToIgnore.clear();
|
||||||
myFilesMap.clear();
|
myFilesMap.clear();
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myWriteLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
synchronized (myFilesToIgnore) {
|
myReadLock.lock();
|
||||||
|
try {
|
||||||
return myFilesToIgnore.isEmpty();
|
return myFilesToIgnore.isEmpty();
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myReadLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void set(final IgnoredFileBean... filesToIgnore) {
|
public void set(final IgnoredFileBean... filesToIgnore) {
|
||||||
synchronized (myFilesToIgnore) {
|
myWriteLock.lock();
|
||||||
|
try {
|
||||||
myFilesToIgnore.clear();
|
myFilesToIgnore.clear();
|
||||||
Collections.addAll(myFilesToIgnore, filesToIgnore);
|
Collections.addAll(myFilesToIgnore, filesToIgnore);
|
||||||
myFilesMap.clear();
|
myFilesMap.clear();
|
||||||
addIgnoredFiles(filesToIgnore);
|
addIgnoredFiles(filesToIgnore);
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myWriteLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public IgnoredFileBean[] getFilesToIgnore() {
|
public IgnoredFileBean[] getFilesToIgnore() {
|
||||||
synchronized (myFilesToIgnore) {
|
myReadLock.lock();
|
||||||
|
try {
|
||||||
return myFilesToIgnore.toArray(new IgnoredFileBean[myFilesToIgnore.size()]);
|
return myFilesToIgnore.toArray(new IgnoredFileBean[myFilesToIgnore.size()]);
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myReadLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetCaches() {
|
private void resetCaches() {
|
||||||
synchronized (myFilesToIgnore) {
|
myWriteLock.lock();
|
||||||
|
try {
|
||||||
for (IgnoredFileBean bean : myFilesToIgnore) {
|
for (IgnoredFileBean bean : myFilesToIgnore) {
|
||||||
bean.resetCache();
|
bean.resetCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myWriteLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isIgnoredFile(@NotNull VirtualFile file) {
|
public boolean isIgnoredFile(@NotNull VirtualFile file) {
|
||||||
synchronized (myFilesToIgnore) {
|
myReadLock.lock();
|
||||||
|
try {
|
||||||
if (myFilesToIgnore.size() == 0) return false;
|
if (myFilesToIgnore.size() == 0) return false;
|
||||||
|
|
||||||
final String path = FilePathsHelper.convertPath(file);
|
final String path = FilePathsHelper.convertPath(file);
|
||||||
@@ -165,5 +200,8 @@ public class IgnoredFilesComponent {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
finally {
|
||||||
|
myReadLock.unlock();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user