[SCM] morituri/master: * morituri/common/task.py: Add documentation. Use a _task counter instead of duplicating tasks to __tasks; this allows us to add tasks after starting. Catch Exceptions during next() so that we don't get stuck in a main loop that doesn't exit. Raise it later when we're done.

js at users.alioth.debian.org js at users.alioth.debian.org
Sun Oct 19 20:09:04 UTC 2014


The following commit has been merged in the master branch:
commit ed7d5cedadd0468943dbadc59a82af0026c0769d
Author: Thomas Vander Stichele <thomas (at) apestaart (dot) org>
Date:   Mon May 25 14:51:00 2009 +0000

    	* morituri/common/task.py:
    	  Add documentation.
    	  Use a _task counter instead of duplicating tasks to
    	  __tasks; this allows us to add tasks after starting.
    	  Catch Exceptions during next() so that we don't get
    	  stuck in a main loop that doesn't exit.
    	  Raise it later when we're done.

diff --git a/ChangeLog b/ChangeLog
index c1c278d..1e8fad6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
 2009-05-25  Thomas Vander Stichele  <thomas at apestaart dot org>
 
+	* morituri/common/task.py:
+	  Add documentation.
+	  Use a _task counter instead of duplicating tasks to
+	  __tasks; this allows us to add tasks after starting.
+	  Catch Exceptions during next() so that we don't get
+	  stuck in a main loop that doesn't exit.
+	  Raise it later when we're done.
+
+2009-05-25  Thomas Vander Stichele  <thomas at apestaart dot org>
+
 	* morituri/common/common.py:
 	  Since the version was inherited from the current code
 	  in unpickled objects, separate into classVersion and
diff --git a/morituri/common/task.py b/morituri/common/task.py
index 1ba2bd8..c0ea76f 100644
--- a/morituri/common/task.py
+++ b/morituri/common/task.py
@@ -118,6 +118,9 @@ class DummyTask(Task):
 class BaseMultiTask(Task):
     """
     I perform multiple tasks.
+
+    @ivar tasks: the tasks to run
+    @type tasks: list of L{Task}
     """
 
     description = 'Doing various tasks'
@@ -125,34 +128,53 @@ class BaseMultiTask(Task):
 
     def __init__(self):
         self.tasks = []
+        self._task = 0
          
     def addTask(self, task):
+        """
+        Add a task.
+
+        @type task: L{Task}
+        """
         if self.tasks is None:
             self.tasks = []
         self.tasks.append(task)
 
     def start(self, runner):
+        """
+        Start tasks.
+
+        Tasks can still be added while running.  For example,
+        a first task can determine how many additional tasks to run.
+        """
         Task.start(self, runner)
 
         # initialize task tracking
         if not self.tasks:
             self.warning('no tasks')
-        self._task = 0
-        self.__tasks = self.tasks[:]
         self._generic = self.description
 
         self.next()
 
     def next(self):
-        # start next task
-        task = self.__tasks[0]
-        del self.__tasks[0]
-        self.debug('BaseMultiTask.next(): starting task %r', task)
-        self._task += 1
-        self.setDescription("%s (%d of %d) ..." % (
-            task.description, self._task, len(self.tasks)))
-        task.addListener(self)
-        task.start(self.runner)
+        """
+        Start the next task.
+        """
+        try:
+            # start next task
+            task = self.tasks[self._task]
+            self._task += 1
+            self.debug('BaseMultiTask.next(): starting task %r', task)
+            self.setDescription("%s (%d of %d) ..." % (
+                task.description, self._task, len(self.tasks)))
+            task.addListener(self)
+            task.start(self.runner)
+        except Exception, e:
+            self.debug('Got exception during next: %r',
+                log.getExceptionMessage(e))
+            self.exception = e
+            self.stop()
+            return
         
     ### listener methods
     def started(self, task):
@@ -167,7 +189,7 @@ class BaseMultiTask(Task):
             self.stop()
             return
 
-        if not self.__tasks:
+        if self._task == len(self.tasks):
             self.stop()
             return
 
@@ -295,10 +317,13 @@ class SyncRunner(TaskRunner):
         # otherwise the task might complete before we are in it
         gobject.timeout_add(0L, self._task.start, self)
         self._loop.run()
+
         self.debug('done running task %r', task)
-        if self._task.exception:
-            self.debug('raising exception')
-            raise self._task.exception
+        if task.exception:
+            # FIXME: this gave a traceback in the logging module
+            #self.debug('raising exception, %r',
+            #    log.getExceptionMessage(self._task.exception))
+            raise task.exception
 
     def schedule(self, delta, callable, *args, **kwargs):
         def c():

-- 
morituri packaging



More information about the pkg-multimedia-commits mailing list