From b28eaa1a94e1ccb558839debbf8c8ada2b9c6dd7 Mon Sep 17 00:00:00 2001 From: Skylot Date: Wed, 23 Jan 2019 10:06:13 +0300 Subject: [PATCH] fix(gui): add synchronization to SimpleIndex class (#435) --- .../main/java/jadx/gui/ui/SearchDialog.java | 1 + .../jadx/gui/utils/search/SimpleIndex.java | 28 ++++++++++++------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java index 62c9dad5..69fdf98f 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java @@ -176,6 +176,7 @@ public class SearchDialog extends CommonSearchDialog { .subscribeOn(Schedulers.single()) .doOnNext(r -> LOG.debug("search event: {}", r)) .switchMap(text -> prepareSearch(text) + .doOnError(e -> LOG.error("Error prepare search: {}", e.getMessage(), e)) .subscribeOn(Schedulers.single()) .toList() .toFlowable(), 1) diff --git a/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java b/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java index 81a3f72f..471d29e1 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java @@ -12,10 +12,14 @@ public class SimpleIndex implements SearchIndex { private final List keys = new ArrayList<>(); private final List values = new ArrayList<>(); + private final Object syncData = new Object(); + @Override public void put(String str, T value) { - keys.add(str); - values.add(value); + synchronized (syncData) { + keys.add(str); + values.add(value); + } } @Override @@ -39,13 +43,15 @@ public class SimpleIndex implements SearchIndex { @Override public Flowable search(final String searchStr, final boolean caseInsensitive) { return Flowable.create(emitter -> { - int size = size(); - for (int i = 0; i < size; i++) { - if (isMatched(keys.get(i), searchStr, caseInsensitive)) { - emitter.onNext(values.get(i)); - } - if (emitter.isCancelled()) { - return; + synchronized (syncData) { + int size = keys.size(); + for (int i = 0; i < size; i++) { + if (isMatched(keys.get(i), searchStr, caseInsensitive)) { + emitter.onNext(values.get(i)); + } + if (emitter.isCancelled()) { + return; + } } } emitter.onComplete(); @@ -54,6 +60,8 @@ public class SimpleIndex implements SearchIndex { @Override public int size() { - return keys.size(); + synchronized (syncData) { + return keys.size(); + } } } -- GitLab