aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
diff options
context:
space:
mode:
authorS. Solomon Darnell2025-03-28 21:52:21 -0500
committerS. Solomon Darnell2025-03-28 21:52:21 -0500
commit4a52a71956a8d46fcb7294ac71734504bb09bcc2 (patch)
treeee3dc5af3b6313e921cd920906356f5d4febc4ed /.venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
parentcc961e04ba734dd72309fb548a2f97d67d578813 (diff)
downloadgn-ai-master.tar.gz
two version of R2R are hereHEADmaster
Diffstat (limited to '.venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py')
-rw-r--r--.venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py78
1 files changed, 78 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py b/.venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
new file mode 100644
index 00000000..c1a44efd
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
@@ -0,0 +1,78 @@
+"""
+Testing initialstub throwing an already started exception.
+"""
+
+import greenlet
+
+a = None
+b = None
+c = None
+main = greenlet.getcurrent()
+
+# If we switch into a dead greenlet,
+# we go looking for its parents.
+# if a parent is not yet started, we start it.
+
+results = []
+
+def a_run(*args):
+ #results.append('A')
+ results.append(('Begin A', args))
+
+
+def c_run():
+ results.append('Begin C')
+ b.switch('From C')
+ results.append('C done')
+
+class A(greenlet.greenlet): pass
+
+class B(greenlet.greenlet):
+ doing_it = False
+ def __getattribute__(self, name):
+ if name == 'run' and not self.doing_it:
+ assert greenlet.getcurrent() is c
+ self.doing_it = True
+ results.append('Switch to b from B.__getattribute__ in '
+ + type(greenlet.getcurrent()).__name__)
+ b.switch()
+ results.append('B.__getattribute__ back from main in '
+ + type(greenlet.getcurrent()).__name__)
+ if name == 'run':
+ name = '_B_run'
+ return object.__getattribute__(self, name)
+
+ def _B_run(self, *arg):
+ results.append(('Begin B', arg))
+ results.append('_B_run switching to main')
+ main.switch('From B')
+
+class C(greenlet.greenlet):
+ pass
+a = A(a_run)
+b = B(parent=a)
+c = C(c_run, b)
+
+# Start a child; while running, it will start B,
+# but starting B will ALSO start B.
+result = c.switch()
+results.append(('main from c', result))
+
+# Switch back to C, which was in the middle of switching
+# already. This will throw the ``GreenletStartedWhileInPython``
+# exception, which results in parent A getting started (B is finished)
+c.switch()
+
+results.append(('A dead?', a.dead, 'B dead?', b.dead, 'C dead?', c.dead))
+
+# A and B should both be dead now.
+assert a.dead
+assert b.dead
+assert not c.dead
+
+result = c.switch()
+results.append(('main from c.2', result))
+# Now C is dead
+assert c.dead
+
+print("RESULTS:", results)