Add python-eventlet 0.16.1
[packages/trusty/python-eventlet.git] / eventlet / eventlet / support / stacklesss.py
1 """
2 Support for using stackless python.  Broken and riddled with print statements
3 at the moment.  Please fix it!
4 """
5
6 import sys
7 import types
8
9 import stackless
10
11 caller = None
12 coro_args = {}
13 tasklet_to_greenlet = {}
14
15
16 def getcurrent():
17     return tasklet_to_greenlet[stackless.getcurrent()]
18
19
20 class FirstSwitch(object):
21     def __init__(self, gr):
22         self.gr = gr
23
24     def __call__(self, *args, **kw):
25         # print("first call", args, kw)
26         gr = self.gr
27         del gr.switch
28         run, gr.run = gr.run, None
29         t = stackless.tasklet(run)
30         gr.t = t
31         tasklet_to_greenlet[t] = gr
32         t.setup(*args, **kw)
33         t.run()
34
35
36 class greenlet(object):
37     def __init__(self, run=None, parent=None):
38         self.dead = False
39         if parent is None:
40             parent = getcurrent()
41
42         self.parent = parent
43         if run is not None:
44             self.run = run
45
46         self.switch = FirstSwitch(self)
47
48     def switch(self, *args):
49         # print("switch", args)
50         global caller
51         caller = stackless.getcurrent()
52         coro_args[self] = args
53         self.t.insert()
54         stackless.schedule()
55         if caller is not self.t:
56             caller.remove()
57         rval = coro_args[self]
58         return rval
59
60     def run(self):
61         pass
62
63     def __bool__(self):
64         return self.run is None and not self.dead
65
66
67 class GreenletExit(Exception):
68     pass
69
70
71 def emulate():
72     module = types.ModuleType('greenlet')
73     sys.modules['greenlet'] = module
74     module.greenlet = greenlet
75     module.getcurrent = getcurrent
76     module.GreenletExit = GreenletExit
77
78     caller = stackless.getcurrent()
79     tasklet_to_greenlet[caller] = None
80     main_coro = greenlet()
81     tasklet_to_greenlet[caller] = main_coro
82     main_coro.t = caller
83     del main_coro.switch  # It's already running
84     coro_args[main_coro] = None