Adjust the package revision; no actual code changes
[packages/trusty/python-eventlet.git] / eventlet / eventlet / twistedutil / __init__.py
1 from eventlet.hubs import get_hub
2 from eventlet import spawn, getcurrent
3
4 def block_on(deferred):
5     cur = [getcurrent()]
6     synchronous = []
7     def cb(value):
8         if cur:
9             if getcurrent() is cur[0]:
10                 synchronous.append((value, None))
11             else:
12                 cur[0].switch(value)
13         return value
14     def eb(fail):
15         if cur:
16             if getcurrent() is cur[0]:
17                 synchronous.append((None, fail))
18             else:
19                 fail.throwExceptionIntoGenerator(cur[0])
20     deferred.addCallbacks(cb, eb)
21     if synchronous:
22         result, fail = synchronous[0]
23         if fail is not None:
24             fail.raiseException()
25         return result
26     try:
27         return get_hub().switch()
28     finally:
29         del cur[0]
30
31 def _putResultInDeferred(deferred, f, args, kwargs):
32     try:
33         result = f(*args, **kwargs)
34     except:
35         from twisted.python import failure
36         f = failure.Failure()
37         deferred.errback(f)
38     else:
39         deferred.callback(result)
40
41 def deferToGreenThread(func, *args, **kwargs):
42     from twisted.internet import defer
43     d = defer.Deferred()
44     spawn(_putResultInDeferred, d, func, args, kwargs)
45     return d
46
47 def callInGreenThread(func, *args, **kwargs):
48     return spawn(func, *args, **kwargs)
49
50
51 if __name__=='__main__':
52     import sys
53     try:
54         num = int(sys.argv[1])
55     except:
56         sys.exit('Supply number of test as an argument, 0, 1, 2 or 3')
57     from twisted.internet import reactor
58     def test():
59         print(block_on(reactor.resolver.getHostByName('www.google.com')))
60         print(block_on(reactor.resolver.getHostByName('###')))
61     if num==0:
62         test()
63     elif num==1:
64         spawn(test)
65         from eventlet.api import sleep
66         print('sleeping..')
67         sleep(5)
68         print('done sleeping..')
69     elif num==2:
70         from eventlet.twistedutil import join_reactor
71         spawn(test)
72         reactor.run()
73     elif num==3:
74         from eventlet.twistedutil import join_reactor
75         print("fails because it's impossible to use block_on from the mainloop")
76         reactor.callLater(0, test)
77         reactor.run()
78