reduce Iterator churn and simplify HashBucket locking

auto-update
Zlatin Balevsky 2021-10-13 02:43:31 +01:00
parent a1b25c3976
commit 4e0ab4d873
No known key found for this signature in database
GPG Key ID: A72832072D525E41
3 changed files with 14 additions and 14 deletions

View File

@ -46,7 +46,7 @@ class SearchTabController {
}
Set<InfoHash> uniqueHashes = results.stream().map({it.infohash}).collect(Collectors.toSet())
results = uniqueHashes.stream().map({model.hashBucket[it].getResults().first()}).collect(Collectors.toList())
results = uniqueHashes.stream().map({model.hashBucket[it].firstEvent()}).collect(Collectors.toList())
File downloadsFolder = application.context.get("muwire-settings").downloadLocation
List<ResultAndTargets> targets = view.decorateResults(results)

View File

@ -16,6 +16,7 @@ import griffon.metadata.ArtifactProviderFor
import javax.swing.SwingWorker
import javax.swing.tree.DefaultMutableTreeNode
import java.util.concurrent.ConcurrentHashMap
import java.util.concurrent.atomic.AtomicReference
@ArtifactProviderFor(GriffonModel)
class SearchTabModel {
@ -134,15 +135,20 @@ class SearchTabModel {
}
private static class HashBucket {
private final AtomicReference<UIResultEvent> first = new AtomicReference<>()
private final Set<UIResultEvent> events = new HashSet<>()
private final Set<Persona> senders = new HashSet<>()
private String cachedName
private long cachedSize
private void add(UIResultEvent event) {
first.compareAndSet(null, event)
events.add(event)
senders.add(event.sender)
}
UIResultEvent firstEvent() {
first.get()
}
Set<UIResultEvent> getResults() {
events
}
@ -152,17 +158,11 @@ class SearchTabModel {
}
String getName() {
if (cachedName == null) {
cachedName = events.first().name
}
cachedName
first.get().name
}
long getSize() {
if (cachedSize == 0) {
cachedSize = events.first().size
}
cachedSize
first.get().size
}
int sourceCount() {

View File

@ -163,7 +163,7 @@ class SearchTabView {
scrollPane(constraints : BorderLayout.CENTER) {
resultsTable2 = table(id : "results-table2", autoCreateRowSorter : true, rowHeight : rowHeight) {
tableModel(list : model.results2) {
closureColumn(header : trans("NAME"), preferredWidth : 350, type : UIResultEvent, read : {model.hashBucket[it].getResults().first()})
closureColumn(header : trans("NAME"), preferredWidth : 350, type : UIResultEvent, read : {model.hashBucket[it].firstEvent()})
closureColumn(header : trans("SIZE"), preferredWidth : 20, type : Long, read : {
model.hashBucket[it].getSize()
})
@ -605,7 +605,7 @@ class SearchTabView {
Persona sender = selectedSender()
if (sender == null) // really shouldn't happen
return model.hashBucket[infohash].getResults().first()
return model.hashBucket[infohash].firstEvent()
for (UIResultEvent candidate : model.hashBucket[infohash].getResults()) {
if (candidate.sender == sender)
@ -613,7 +613,7 @@ class SearchTabView {
}
// also shouldn't happen
return model.hashBucket[infohash].getResults().first()
return model.hashBucket[infohash].firstEvent()
} else {
int[] selectedRows = resultsTable.getSelectedRows()
if (selectedRows.length != 1)