https://bugs.webkit.org/show_bug.cgi?id=78181
Reviewed by Tony Chang.
This change moves code in name(), is_done(), run(), and cancel()
from Worker to AbstractWorker, since the logic is pretty much
boilerplate code that any implementation would want to use.
* Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py:
(get.should):
(AbstractWorker.__init__):
(AbstractWorker):
(AbstractWorker.name):
(AbstractWorker.stop_handling_messages):
(AbstractWorker.run):
(AbstractWorker.is_done):
(AbstractWorker.cancel):
* Scripts/webkitpy/layout_tests/controllers/worker.py:
(Worker.__init__):
(Worker.run):
(Worker.handle_stop):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@108005
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2012-02-16 Dirk Pranke <dpranke@chromium.org>
+
+ nrwt: simplify worker interface
+ https://bugs.webkit.org/show_bug.cgi?id=78181
+
+ Reviewed by Tony Chang.
+
+ This change moves code in name(), is_done(), run(), and cancel()
+ from Worker to AbstractWorker, since the logic is pretty much
+ boilerplate code that any implementation would want to use.
+
+ * Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py:
+ (get.should):
+ (AbstractWorker.__init__):
+ (AbstractWorker):
+ (AbstractWorker.name):
+ (AbstractWorker.stop_handling_messages):
+ (AbstractWorker.run):
+ (AbstractWorker.is_done):
+ (AbstractWorker.cancel):
+ * Scripts/webkitpy/layout_tests/controllers/worker.py:
+ (Worker.__init__):
+ (Worker.run):
+ (Worker.handle_stop):
+
2012-02-16 Michael Saboff <msaboff@apple.com>
ENH: Add ability to run subset of JavaScript layout tests with JSC
worker_model - concurrency model to use (inline/processes)
client - message_broker.BrokerClient implementation to dispatch
replies to.
- worker_class - type of workers to create. This class must implement
+ worker_class - type of workers to create. This class should override
the methods in AbstractWorker.
Returns:
A handle to an object that will talk to a message broker configured
- for the normal manager/worker communication.
- """
+ for the normal manager/worker communication."""
if worker_model == 'inline':
queue_class = Queue.Queue
manager_class = _InlineManager
worker_arguments - (optional, Picklable) object passed to the worker from the manager"""
message_broker.BrokerClient.__init__(self)
self._worker_connection = worker_connection
+ self._name = 'worker'
+ self._done = False
+ self._canceled = False
+
+ def name(self):
+ return self._name
+
+ def is_done(self):
+ return self._done or self._canceled
+
+ def stop_handling_messages(self):
+ self._done = True
def run(self):
"""Callback for the worker to start executing. Typically does any
remaining initialization and then calls broker_connection.run_message_loop()."""
- raise NotImplementedError
+ exception_msg = ""
+ _log.debug("%s starting" % self._name)
+
+ try:
+ self._worker_connection.run_message_loop()
+ if not self.is_done():
+ raise AssertionError("%s: ran out of messages in worker queue."
+ % self._name)
+ except KeyboardInterrupt:
+ exception_msg = ", interrupted"
+ self._worker_connection.raise_exception(sys.exc_info())
+ except:
+ exception_msg = ", exception raised"
+ self._worker_connection.raise_exception(sys.exc_info())
+ finally:
+ _log.debug("%s done with message loop%s" % (self._name, exception_msg))
def cancel(self):
"""Called when possible to indicate to the worker to stop processing
messages and shut down. Note that workers may be stopped without this
method being called, so clients should not rely solely on this."""
- raise NotImplementedError
+ self._canceled = True
class _ManagerConnection(message_broker.BrokerConnection):
self._name = 'worker/%d' % self._worker_number
self._results_directory = worker_arguments.results_directory
self._options = worker_arguments.options
- self._done = False
- self._canceled = False
self._port = None
self._batch_size = None
self._batch_count = None
tests_run_filename = self._filesystem.join(self._results_directory, "tests_run%d.txt" % self._worker_number)
self._tests_run_file = self._filesystem.open_text_file_for_writing(tests_run_filename)
- def cancel(self):
- """Attempt to abort processing (best effort)."""
- self._canceled = True
-
- def is_done(self):
- return self._done or self._canceled
-
- def name(self):
- return self._name
-
def set_inline_arguments(self, port):
self._port = port
self.safe_init()
- exception_msg = ""
- _log.debug("%s starting" % self._name)
-
try:
- self._worker_connection.run_message_loop()
- if not self.is_done():
- raise AssertionError("%s: ran out of messages in worker queue."
- % self._name)
- except KeyboardInterrupt:
- exception_msg = ", interrupted"
- self._worker_connection.raise_exception(sys.exc_info())
- except:
- exception_msg = ", exception raised"
- self._worker_connection.raise_exception(sys.exc_info())
+ _log.debug("%s starting" % self._name)
+ super(Worker, self).run()
finally:
- _log.debug("%s done with message loop%s" % (self._name, exception_msg))
self._worker_connection.post_message('done')
self.cleanup()
_log.debug("%s exiting" % self._name)
self._worker_connection.post_message('finished_list', list_name, num_tests, elapsed_time)
def handle_stop(self, src):
- self._done = True
+ self.stop_handling_messages()
def _run_test(self, test_input):
test_timeout_sec = self.timeout(test_input)