diff --git a/src/calibre/gui2/__init__.py b/src/calibre/gui2/__init__.py
index b381d9ed56..7363498319 100644
--- a/src/calibre/gui2/__init__.py
+++ b/src/calibre/gui2/__init__.py
@@ -85,6 +85,8 @@ def _config():
help=_('Maximum number of waiting worker processes'))
c.add_opt('get_social_metadata', default=True,
help=_('Download social metadata (tags/rating/etc.)'))
+ c.add_opt('enforce_cpu_limit', default=True,
+ help=_('Limit max simultaneous jobs to number of CPUs'))
return ConfigProxy(c)
diff --git a/src/calibre/gui2/dialogs/config/__init__.py b/src/calibre/gui2/dialogs/config/__init__.py
index 4f84ae968c..2e647781c1 100644
--- a/src/calibre/gui2/dialogs/config/__init__.py
+++ b/src/calibre/gui2/dialogs/config/__init__.py
@@ -456,6 +456,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
self.connect(self.button_open_config_dir, SIGNAL('clicked()'),
self.open_config_dir)
self.opt_get_social_metadata.setChecked(config['get_social_metadata'])
+ self.opt_enforce_cpu_limit.setChecked(config['enforce_cpu_limit'])
def open_config_dir(self):
from calibre.utils.config import config_dir
@@ -742,6 +743,7 @@ class ConfigDialog(ResizableDialog, Ui_Dialog):
config['upload_news_to_device'] = self.sync_news.isChecked()
config['search_as_you_type'] = self.search_as_you_type.isChecked()
config['get_social_metadata'] = self.opt_get_social_metadata.isChecked()
+ config['enforce_cpu_limit'] = bool(self.opt_enforce_cpu_limit.isChecked())
fmts = []
for i in range(self.viewer.count()):
if self.viewer.item(i).checkState() == Qt.Checked:
diff --git a/src/calibre/gui2/dialogs/config/config.ui b/src/calibre/gui2/dialogs/config/config.ui
index 8f9c28aa8b..fc7c6b6635 100644
--- a/src/calibre/gui2/dialogs/config/config.ui
+++ b/src/calibre/gui2/dialogs/config/config.ui
@@ -15,7 +15,7 @@
Preferences
-
+
:/images/config.svg:/images/config.svg
@@ -90,7 +90,7 @@
0
0
524
- 680
+ 683
@@ -148,7 +148,7 @@
...
-
+
:/images/mimetypes/dir.svg:/images/mimetypes/dir.svg
@@ -285,7 +285,7 @@
...
-
+
:/images/arrow-up.svg:/images/arrow-up.svg
@@ -309,7 +309,7 @@
...
-
+
:/images/arrow-down.svg:/images/arrow-down.svg
@@ -473,7 +473,7 @@
...
-
+
:/images/arrow-up.svg:/images/arrow-up.svg
@@ -497,7 +497,7 @@
...
-
+
:/images/arrow-down.svg:/images/arrow-down.svg
@@ -557,7 +557,7 @@
&Add email
-
+
:/images/plus.svg:/images/plus.svg
@@ -584,7 +584,7 @@
&Remove email
-
+
:/images/minus.svg:/images/minus.svg
@@ -649,27 +649,34 @@
- -
+
-
&Check database integrity
- -
+
-
&Install command line tools
- -
+
-
Open calibre &configuration directory
+ -
+
+
+ Limit the max. simultaneous jobs to the available CPU &cores
+
+
+
@@ -959,7 +966,7 @@
...
-
+
:/images/document_open.svg:/images/document_open.svg
@@ -1030,7 +1037,7 @@
-
+
diff --git a/src/calibre/gui2/dialogs/confirm_delete.py b/src/calibre/gui2/dialogs/confirm_delete.py
index 8c496987fb..42a1be41c0 100644
--- a/src/calibre/gui2/dialogs/confirm_delete.py
+++ b/src/calibre/gui2/dialogs/confirm_delete.py
@@ -11,22 +11,22 @@ def _config_name(name):
return name + '_again'
class Dialog(QDialog, Ui_Dialog):
-
+
def __init__(self, msg, name, parent):
QDialog.__init__(self, parent)
self.setupUi(self)
-
+
self.msg.setText(msg)
self.name = name
self.connect(self.again, SIGNAL('stateChanged(int)'), self.toggle)
self.buttonBox.setFocus(Qt.OtherFocusReason)
-
+
def toggle(self, x):
dynamic[_config_name(self.name)] = self.again.isChecked()
-
+
def confirm(msg, name, parent=None):
if not dynamic.get(_config_name(name), True):
return True
d = Dialog(msg, name, parent)
- return d.exec_() == d.Accepted
\ No newline at end of file
+ return d.exec_() == d.Accepted
diff --git a/src/calibre/gui2/jobs.py b/src/calibre/gui2/jobs.py
index 27b1f0ec54..a801e0db28 100644
--- a/src/calibre/gui2/jobs.py
+++ b/src/calibre/gui2/jobs.py
@@ -31,7 +31,8 @@ class JobManager(QAbstractTableModel):
self.jobs = []
self.add_job = Dispatcher(self._add_job)
- self.server = Server(limit=int(config['worker_limit']/2.0))
+ self.server = Server(limit=int(config['worker_limit']/2.0),
+ enforce_cpu_limit=config['enforce_cpu_limit'])
self.changed_queue = Queue()
self.timer = QTimer(self)
diff --git a/src/calibre/utils/ipc/server.py b/src/calibre/utils/ipc/server.py
index 4d2c4496bb..38d465cb78 100644
--- a/src/calibre/utils/ipc/server.py
+++ b/src/calibre/utils/ipc/server.py
@@ -84,14 +84,15 @@ class CriticalError(Exception):
class Server(Thread):
def __init__(self, notify_on_job_done=lambda x: x, pool_size=None,
- limit=sys.maxint):
+ limit=sys.maxint, enforce_cpu_limit=True):
Thread.__init__(self)
self.daemon = True
global _counter
self.id = _counter+1
_counter += 1
- limit = min(limit, cpu_count())
+ if enforce_cpu_limit:
+ limit = min(limit, cpu_count())
self.pool_size = limit if pool_size is None else pool_size
self.notify_on_job_done = notify_on_job_done
self.auth_key = os.urandom(32)