diff --git a/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy b/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy index 96d10be6..61d05be7 100644 --- a/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy +++ b/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy @@ -29,6 +29,7 @@ class MuWireSettings { CrawlerResponse crawlerResponse boolean shareDownloadedFiles boolean shareHiddenFiles + int hashingCores boolean searchComments boolean searchCollections boolean browseFiles @@ -98,6 +99,7 @@ class MuWireSettings { updateType = props.getProperty("updateType","jar") shareDownloadedFiles = Boolean.parseBoolean(props.getProperty("shareDownloadedFiles","true")) shareHiddenFiles = Boolean.parseBoolean(props.getProperty("shareHiddenFiles","false")) + hashingCores = Integer.parseInt(props.getProperty("hashingCores", String.valueOf(numHashingCores()))) downloadSequentialRatio = Float.valueOf(props.getProperty("downloadSequentialRatio","0.8")) hostClearInterval = Integer.valueOf(props.getProperty("hostClearInterval","15")) hostHopelessInterval = Integer.valueOf(props.getProperty("hostHopelessInterval", "60")) @@ -189,6 +191,7 @@ class MuWireSettings { props.setProperty("updateType",String.valueOf(updateType)) props.setProperty("shareDownloadedFiles", String.valueOf(shareDownloadedFiles)) props.setProperty("shareHiddenFiles", String.valueOf(shareHiddenFiles)) + props.setProperty("hashingCores", String.valueOf(hashingCores)) props.setProperty("downloadSequentialRatio", String.valueOf(downloadSequentialRatio)) props.setProperty("hostClearInterval", String.valueOf(hostClearInterval)) props.setProperty("hostHopelessInterval", String.valueOf(hostHopelessInterval)) @@ -283,4 +286,8 @@ class MuWireSettings { String getNickname() { nickname } + + private static int numHashingCores() { + return (int) Math.max(1d, Runtime.getRuntime().availableProcessors() / 2d) + } } diff --git a/core/src/main/groovy/com/muwire/core/files/HasherService.groovy b/core/src/main/groovy/com/muwire/core/files/HasherService.groovy index 43d0f3a5..0df39908 100644 --- a/core/src/main/groovy/com/muwire/core/files/HasherService.groovy +++ b/core/src/main/groovy/com/muwire/core/files/HasherService.groovy @@ -34,7 +34,7 @@ class HasherService { } void start() { - executor = Executors.newFixedThreadPool((int)Math.max(1d, Runtime.getRuntime().availableProcessors() / 2d )) + executor = Executors.newFixedThreadPool(settings.hashingCores) } void onFileSharedEvent(FileSharedEvent evt) { diff --git a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy index 653537b0..c64dd0f2 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy @@ -103,6 +103,10 @@ class OptionsController { boolean shareHidden = view.shareHiddenCheckbox.model.isSelected() model.shareHiddenFiles = shareHidden settings.shareHiddenFiles = shareHidden + + int hashingCores = Integer.parseInt(view.hashingCoresTextField.text) + model.hashingCores = hashingCores + settings.hashingCores = hashingCores boolean browseFiles = view.browseFilesCheckbox.model.isSelected() model.browseFiles = browseFiles diff --git a/gui/griffon-app/i18n/messages.properties b/gui/griffon-app/i18n/messages.properties index 88712c8f..48420d07 100644 --- a/gui/griffon-app/i18n/messages.properties +++ b/gui/griffon-app/i18n/messages.properties @@ -296,6 +296,7 @@ OPTIONS_UPLOAD_SLOTS_PER_USER=Upload slots per user (-1 means unlimited) OPTIONS_SHARING_SETTINGS=Sharing Settings OPTIONS_SHARE_DOWNLOADED_FILES=Share downloaded files OPTIONS_SHARE_HIDDEN_FILES=Share hidden files +OPTIONS_HASHING_CORES=CPU Cores to use when hashing (changes require restart) OPTIONS_UPDATE_SETTINGS=Update Settings OPTIONS_CHECK_FOR_UPDATES=Check for updates every (hours) OPTIONS_DOWNLOAD_UPDATES=Download updates automatically diff --git a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy index f90dd03e..addbdb35 100644 --- a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy @@ -17,6 +17,7 @@ class OptionsModel { @Observable boolean autoDownloadUpdate @Observable boolean shareDownloadedFiles @Observable boolean shareHiddenFiles + @Observable int hashingCores @Observable String downloadLocation @Observable String incompleteLocation @Observable boolean searchComments @@ -95,6 +96,7 @@ class OptionsModel { autoDownloadUpdate = settings.autoDownloadUpdate shareDownloadedFiles = settings.shareDownloadedFiles shareHiddenFiles = settings.shareHiddenFiles + hashingCores = settings.hashingCores downloadLocation = settings.downloadLocation.getAbsolutePath() incompleteLocation = settings.incompleteLocation.getAbsolutePath() searchComments = settings.searchComments diff --git a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy index b0bd637a..d2456e29 100644 --- a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy @@ -49,6 +49,7 @@ class OptionsView { def autoDownloadUpdateCheckbox def shareDownloadedCheckbox def shareHiddenCheckbox + def hashingCoresTextField def searchCommentsCheckbox def searchCollectionsCheckbox def browseFilesCheckbox @@ -172,6 +173,10 @@ class OptionsView { label(text : trans("OPTIONS_SHARE_HIDDEN_FILES"), constraints : gbc(gridx : 0, gridy:1, anchor : GridBagConstraints.LINE_START, weightx : 100)) shareHiddenCheckbox = checkBox(selected : bind {model.shareHiddenFiles}, constraints : gbc(gridx :1, gridy:1, weightx : 0)) + + label(text : trans("OPTIONS_HASHING_CORES"), constraints : gbc(gridx: 0 , gridy : 2, anchor : GridBagConstraints.LINE_START, weightx : 100)) + hashingCoresTextField = textField(text : bind {model.hashingCores}, columns: 2, + constraints: gbc(gridx: 1, gridy: 2, anchor: GridBagConstraints.LINE_END)) } if (!model.disableUpdates) {