synchronize access to pending trades data model

Co-authored-by: XMRZombie <monerozombie@proton.me>
This commit is contained in:
woodser 2025-02-12 07:34:32 -05:00
parent cd71bcdde7
commit b72159fcf8
2 changed files with 38 additions and 26 deletions

View file

@ -332,15 +332,17 @@ public class PendingTradesDataModel extends ActivatableDataModel {
} }
// add shown trades to list // add shown trades to list
synchronized (list) {
list.clear(); list.clear();
list.addAll(tradeManager.getObservableList().stream() list.addAll(tradeManager.getObservableList().stream()
.filter(trade -> isTradeShown(trade)) .filter(trade -> isTradeShown(trade))
.map(trade -> new PendingTradesListItem(trade, btcFormatter)) .map(trade -> new PendingTradesListItem(trade, btcFormatter))
.collect(Collectors.toList())); .collect(Collectors.toList()));
}
// we sort by date, earliest first // we sort by date, earliest first
list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate())); list.sort((o1, o2) -> o2.getTrade().getDate().compareTo(o1.getTrade().getDate()));
}
}
selectBestItem(); selectBestItem();
} }
@ -350,6 +352,7 @@ public class PendingTradesDataModel extends ActivatableDataModel {
} }
private void selectBestItem() { private void selectBestItem() {
synchronized (list) {
if (list.size() == 1) if (list.size() == 1)
doSelectItem(list.get(0)); doSelectItem(list.get(0));
else if (list.size() > 1 && (selectedItemProperty.get() == null || !list.contains(selectedItemProperty.get()))) else if (list.size() > 1 && (selectedItemProperty.get() == null || !list.contains(selectedItemProperty.get())))
@ -357,12 +360,15 @@ public class PendingTradesDataModel extends ActivatableDataModel {
else if (list.size() == 0) else if (list.size() == 0)
doSelectItem(null); doSelectItem(null);
} }
}
private void selectItemByTradeId(String tradeId) { private void selectItemByTradeId(String tradeId) {
if (activated) { if (activated) {
synchronized (list) {
list.stream().filter(e -> e.getTrade().getId().equals(tradeId)).findAny().ifPresent(this::doSelectItem); list.stream().filter(e -> e.getTrade().getId().equals(tradeId)).findAny().ifPresent(this::doSelectItem);
} }
} }
}
private void doSelectItem(@Nullable PendingTradesListItem item) { private void doSelectItem(@Nullable PendingTradesListItem item) {
UserThread.execute(() -> { UserThread.execute(() -> {

View file

@ -363,7 +363,11 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
} }
private void updateMoveTradeToFailedColumnState() { private void updateMoveTradeToFailedColumnState() {
UserThread.execute(() -> moveTradeToFailedColumn.setVisible(model.dataModel.list.stream().anyMatch(item -> isMaybeInvalidTrade(item.getTrade())))); UserThread.execute(() -> {
synchronized (model.dataModel.list) {
moveTradeToFailedColumn.setVisible(model.dataModel.list.stream().anyMatch(item -> isMaybeInvalidTrade(item.getTrade())));
}
});
} }
private boolean isMaybeInvalidTrade(Trade trade) { private boolean isMaybeInvalidTrade(Trade trade) {
@ -420,6 +424,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
/////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////
private void updateNewChatMessagesByTradeMap() { private void updateNewChatMessagesByTradeMap() {
synchronized (model.dataModel.list) {
model.dataModel.list.forEach(t -> { model.dataModel.list.forEach(t -> {
Trade trade = t.getTrade(); Trade trade = t.getTrade();
synchronized (trade.getChatMessages()) { synchronized (trade.getChatMessages()) {
@ -431,6 +436,7 @@ public class PendingTradesView extends ActivatableViewAndModel<VBox, PendingTrad
} }
}); });
} }
}
private void openChat(Trade trade) { private void openChat(Trade trade) {
if (chatPopupStage != null) if (chatPopupStage != null)