home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __docformat__ = 'restructuredtext en'
- from twisted.application import service
- from twisted.internet import defer, reactor
- from twisted.python import log, components, failure
- from zope.interface import Interface, implements, Attribute
- from IPython.kernel.twistedutil import gatherBoth
- from IPython.kernel import error
- from IPython.external import guid
- from IPython.tools import growl
-
- class PendingDeferredManager(object):
-
- def __init__(self):
- self.results = { }
- self.deferred_ids = []
- self.deferreds_to_callback = { }
-
-
- def get_deferred_id(self):
- return guid.generate()
-
-
- def quick_has_id(self, deferred_id):
- return deferred_id in self.deferred_ids
-
-
- def _save_result(self, result, deferred_id):
- if self.quick_has_id(deferred_id):
- self.results[deferred_id] = result
- self._trigger_callbacks(deferred_id)
-
-
-
- def _trigger_callbacks(self, deferred_id):
- result = self.results.get(deferred_id)
- if result is not None:
-
- try:
- d = self.deferreds_to_callback.pop(deferred_id)
- except KeyError:
- d = None
-
- if d is not None:
- if isinstance(result, failure.Failure):
- d.errback(result)
- else:
- d.callback(result)
- self.delete_pending_deferred(deferred_id)
-
-
-
-
- def save_pending_deferred(self, d, deferred_id = None):
- if deferred_id is None:
- deferred_id = self.get_deferred_id()
-
- self.deferred_ids.append(deferred_id)
- d.addBoth(self._save_result, deferred_id)
- return deferred_id
-
-
- def _protected_del(self, key, container):
-
- try:
- del container[key]
- except Exception:
- pass
-
-
-
- def delete_pending_deferred(self, deferred_id):
- if self.quick_has_id(deferred_id):
- d = self.deferreds_to_callback.get(deferred_id)
- if d is not None:
- d.errback(failure.Failure(error.AbortedPendingDeferredError('pending deferred has been deleted: %r' % deferred_id)))
-
- ind = self.deferred_ids.index(deferred_id)
- self._protected_del(ind, self.deferred_ids)
- self._protected_del(deferred_id, self.deferreds_to_callback)
- self._protected_del(deferred_id, self.results)
- else:
- raise error.InvalidDeferredID('invalid deferred_id: %r' % deferred_id)
- return self.quick_has_id(deferred_id)
-
-
- def clear_pending_deferreds(self):
- for did in self.deferred_ids:
- self.delete_pending_deferred(did)
-
-
-
- def _delete_and_pass_through(self, r, deferred_id):
- self.delete_pending_deferred(deferred_id)
- return r
-
-
- def get_pending_deferred(self, deferred_id, block):
- if not self.quick_has_id(deferred_id) or self.deferreds_to_callback.get(deferred_id) is not None:
- return defer.fail(failure.Failure(error.InvalidDeferredID('invalid deferred_id: %r' + deferred_id)))
- result = self.results.get(deferred_id)
- if result is not None:
- self.delete_pending_deferred(deferred_id)
- if isinstance(result, failure.Failure):
- return defer.fail(result)
- return defer.succeed(result)
- result is not None
- if block:
- d = defer.Deferred()
- self.deferreds_to_callback[deferred_id] = d
- return d
- return defer.fail(failure.Failure(error.ResultNotCompleted('result not completed: %r' % deferred_id)))
-
-
-
- def two_phase(wrapped_method):
-
- def wrapper_two_phase(pdm, *args, **kwargs):
-
- try:
- block = kwargs.pop('block')
- except KeyError:
- block = True
-
- if block:
- return wrapped_method(pdm, *args, **kwargs)
- d = wrapped_method(pdm, *args, **kwargs)
- deferred_id = pdm.save_pending_deferred(d)
- return defer.succeed(deferred_id)
-
- return wrapper_two_phase
-
-