Home | History | Annotate | Download | only in server2
      1 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import sys
      6 
      7 _no_value = object()
      8 
      9 
     10 def Collect(futures, except_pass=None):
     11   '''Creates a Future which returns a list of results from each Future in
     12   |futures|. |except_pass| should be one or more exceptions to ignore when
     13   calling Get on the futures.
     14   '''
     15   def resolve():
     16     resolved = []
     17     for f in futures:
     18       try:
     19         resolved.append(f.Get())
     20       # "except None" will simply not catch any errors
     21       except except_pass:
     22         pass
     23     return resolved
     24   return Future(callback=resolve)
     25 
     26 
     27 class Future(object):
     28   '''Stores a value, error, or callback to be used later.
     29   '''
     30   def __init__(self, value=_no_value, callback=None, exc_info=None):
     31     self._value = value
     32     self._callback = callback
     33     self._exc_info = exc_info
     34     if (self._value is _no_value and
     35         self._callback is None and
     36         self._exc_info is None):
     37       raise ValueError('Must have either a value, error, or callback.')
     38 
     39   def Get(self):
     40     '''Gets the stored value, error, or callback contents.
     41     '''
     42     if self._value is not _no_value:
     43       return self._value
     44     if self._exc_info is not None:
     45       self._Raise()
     46     try:
     47       self._value = self._callback()
     48       return self._value
     49     except:
     50       self._exc_info = sys.exc_info()
     51       self._Raise()
     52 
     53   def _Raise(self):
     54     exc_info = self._exc_info
     55     raise exc_info[0], exc_info[1], exc_info[2]
     56