nrwt: simplify worker interface
authordpranke@chromium.org <dpranke@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 17 Feb 2012 01:11:25 +0000 (01:11 +0000)
committerdpranke@chromium.org <dpranke@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 17 Feb 2012 01:11:25 +0000 (01:11 +0000)
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

Tools/ChangeLog
Tools/Scripts/webkitpy/layout_tests/controllers/manager_worker_broker.py
Tools/Scripts/webkitpy/layout_tests/controllers/worker.py

index 75bfd0b..9637390 100644 (file)
@@ -1,3 +1,28 @@
+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
index a682cf4..535bd30 100755 (executable)
@@ -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):
index 981b5b6..22c0a5f 100644 (file)
@@ -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)