[pypy-svn] r41596 - in pypy/dist/pypy/translator/js/examples/console: . test

fijal at codespeak.net fijal at codespeak.net
Wed Mar 28 22:19:20 CEST 2007


Author: fijal
Date: Wed Mar 28 22:19:18 2007
New Revision: 41596

Modified:
   pypy/dist/pypy/translator/js/examples/console/session.py
   pypy/dist/pypy/translator/js/examples/console/test/test_session.py
Log:
A fix for a case when user closes console and console lives
forever and a few tests.


Modified: pypy/dist/pypy/translator/js/examples/console/session.py
==============================================================================
--- pypy/dist/pypy/translator/js/examples/console/session.py	(original)
+++ pypy/dist/pypy/translator/js/examples/console/session.py	Wed Mar 28 22:19:18 2007
@@ -14,8 +14,10 @@
 import py
 import subprocess
 from Queue import Queue
-from py.__.green.greensock2 import autogreenlet, Timer, Interrupted
+from py.__.green.greensock2 import autogreenlet, Timer, Interrupted,\
+     meetingpoint
 from py.__.green.pipe.fd import FDInput
+from py.magic import greenlet
 import time
 
 class Killed(Exception):
@@ -30,8 +32,20 @@
         self.read_fd = FDInput(self.pipe.stdout.fileno(), close=False)
         self.pid = pipe.pid
         self.timeout = timeout
-        self.kill_timeout = kill_timeout
-        self.last_activity = time.time()
+        #self.kill_timeout = kill_timeout
+        self.giver, accepter = meetingpoint()
+        autogreenlet(self.timeout_kill, accepter, kill_timeout)
+        #self.last_activity = time.time()
+
+    def timeout_kill(self, accepter, timeout):
+        while 1:
+            try:
+                self.kill_timer = Timer(timeout)
+                accepter.accept()
+                self.kill_timer.stop()
+            except Interrupted:
+                self.close()
+                raise Killed()
 
     def timeout_read(self, fd, timeout):
         timer = Timer(timeout)
@@ -45,14 +59,11 @@
 
     def write_only(self, to_write):
         if to_write is not None:
-            self.last_activity = time.time()
+            self.giver.give(42)
             self.pipe.stdin.write(to_write)
 
     def interact(self, to_write=None):
         self.write_only(to_write)
-        if time.time() - self.last_activity > self.kill_timeout:
-            self.close()
-            raise Killed()
         return self.timeout_read(self.read_fd, self.timeout)
 
     def close(self):
@@ -61,6 +72,8 @@
         #      is blocking, which means it eats all our clean interface)
         self.pipe.wait()
 
+    __del__ = close
+
 class InterpreterManager(object):
     pass
 

Modified: pypy/dist/pypy/translator/js/examples/console/test/test_session.py
==============================================================================
--- pypy/dist/pypy/translator/js/examples/console/test/test_session.py	(original)
+++ pypy/dist/pypy/translator/js/examples/console/test/test_session.py	Wed Mar 28 22:19:18 2007
@@ -4,7 +4,7 @@
 
 import py
 
-from py.__.green.greensock2 import allof
+from py.__.green.greensock2 import allof, sleep
 from py.__.green.pipe.fd import FDInput
 from pypy.translator.js.examples.console.session import Interpreter, Killed
 
@@ -47,5 +47,18 @@
     i = Interpreter("python", kill_timeout=1, timeout=3)
     while not i.interact().endswith(">>> "):
         pass
-    i.interact()
     py.test.raises(Killed, "i.interact()")
+
+def test_kill_timeout_outside():
+    i = Interpreter("python", kill_timeout=1, timeout=3)
+    while not i.interact().endswith(">>> "):
+        pass
+    py.test.raises(Killed, "sleep(8)")
+
+def test_does_not_die():
+    i = Interpreter("python", kill_timeout=1, timeout=3)
+    while not i.interact().endswith(">>> "):
+        pass
+    i.interact("import time\n")
+    for _ in range(6):
+        i.interact("time.sleep(.2)\n")



More information about the Pypy-commit mailing list