Commit b28eaa1a authored by Skylot's avatar Skylot

fix(gui): add synchronization to SimpleIndex class (#435)

parent be509c71
...@@ -176,6 +176,7 @@ public class SearchDialog extends CommonSearchDialog { ...@@ -176,6 +176,7 @@ public class SearchDialog extends CommonSearchDialog {
.subscribeOn(Schedulers.single()) .subscribeOn(Schedulers.single())
.doOnNext(r -> LOG.debug("search event: {}", r)) .doOnNext(r -> LOG.debug("search event: {}", r))
.switchMap(text -> prepareSearch(text) .switchMap(text -> prepareSearch(text)
.doOnError(e -> LOG.error("Error prepare search: {}", e.getMessage(), e))
.subscribeOn(Schedulers.single()) .subscribeOn(Schedulers.single())
.toList() .toList()
.toFlowable(), 1) .toFlowable(), 1)
......
...@@ -12,11 +12,15 @@ public class SimpleIndex<T> implements SearchIndex<T> { ...@@ -12,11 +12,15 @@ public class SimpleIndex<T> implements SearchIndex<T> {
private final List<String> keys = new ArrayList<>(); private final List<String> keys = new ArrayList<>();
private final List<T> values = new ArrayList<>(); private final List<T> values = new ArrayList<>();
private final Object syncData = new Object();
@Override @Override
public void put(String str, T value) { public void put(String str, T value) {
synchronized (syncData) {
keys.add(str); keys.add(str);
values.add(value); values.add(value);
} }
}
@Override @Override
public void put(StringRef str, T value) { public void put(StringRef str, T value) {
...@@ -39,7 +43,8 @@ public class SimpleIndex<T> implements SearchIndex<T> { ...@@ -39,7 +43,8 @@ public class SimpleIndex<T> implements SearchIndex<T> {
@Override @Override
public Flowable<T> search(final String searchStr, final boolean caseInsensitive) { public Flowable<T> search(final String searchStr, final boolean caseInsensitive) {
return Flowable.create(emitter -> { return Flowable.create(emitter -> {
int size = size(); synchronized (syncData) {
int size = keys.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
if (isMatched(keys.get(i), searchStr, caseInsensitive)) { if (isMatched(keys.get(i), searchStr, caseInsensitive)) {
emitter.onNext(values.get(i)); emitter.onNext(values.get(i));
...@@ -48,12 +53,15 @@ public class SimpleIndex<T> implements SearchIndex<T> { ...@@ -48,12 +53,15 @@ public class SimpleIndex<T> implements SearchIndex<T> {
return; return;
} }
} }
}
emitter.onComplete(); emitter.onComplete();
}, BackpressureStrategy.LATEST); }, BackpressureStrategy.LATEST);
} }
@Override @Override
public int size() { public int size() {
synchronized (syncData) {
return keys.size(); return keys.size();
} }
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment