From: dpranke@chromium.org Date: Fri, 17 Feb 2012 01:11:25 +0000 (+0000) Subject: nrwt: simplify worker interface X-Git-Tag: 070512121124~12617 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=39a5268ee332360459a906e94812d6e1b14fab76;p=profile%2Fivi%2Fwebkit-efl.git 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): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@108005 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- diff --git a/Tools/ChangeLog b/Tools/ChangeLog index 75bfd0b..9637390 100644 --- a/Tools/ChangeLog +++ b/Tools/ChangeLog @@ -1,3 +1,28 @@ +2012-02-16 Dirk Pranke + + 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 ENH: Add ability to run subset of JavaScript layout tests with JSC diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py b/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py index a682cf4..535bd30 100755 --- a/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py +++ b/Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py @@ -66,12 +66,11 @@ def get(worker_model, client, worker_class): 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 @@ -99,17 +98,44 @@ class AbstractWorker(message_broker.BrokerClient): 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): diff --git a/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py b/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py index 981b5b6..22c0a5f 100644 --- a/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py +++ b/Tools/Scripts/webkitpy/layout_tests/controllers/worker.py @@ -58,8 +58,6 @@ class Worker(manager_worker_broker.AbstractWorker): 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 @@ -84,16 +82,6 @@ class Worker(manager_worker_broker.AbstractWorker): 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 @@ -122,22 +110,10 @@ class Worker(manager_worker_broker.AbstractWorker): 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) @@ -157,7 +133,7 @@ class Worker(manager_worker_broker.AbstractWorker): 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)