[pypy-svn] r39787 - pypy/dist/pypy/translator/js/examples/console

fijal at codespeak.net fijal at codespeak.net
Sat Mar 3 13:37:55 CET 2007


Author: fijal
Date: Sat Mar  3 13:37:52 2007
New Revision: 39787

Modified:
   pypy/dist/pypy/translator/js/examples/console/client.py
   pypy/dist/pypy/translator/js/examples/console/console.py
   pypy/dist/pypy/translator/js/examples/console/session.py
Log:
Multiple console thingie is working, but (WARNING!) not if you run them in one
browser


Modified: pypy/dist/pypy/translator/js/examples/console/client.py
==============================================================================
--- pypy/dist/pypy/translator/js/examples/console/client.py	(original)
+++ pypy/dist/pypy/translator/js/examples/console/client.py	Sat Mar  3 13:37:52 2007
@@ -53,7 +53,7 @@
         exported_methods.refresh(glob.sess_id, cmd + "\n", refresh_console)
 
 def console_onload():
-    createLoggingPane(True)
+    #createLoggingPane(True)
     inp_elem = dom.document.getElementById("inp")
     inp_elem.focus()
     dom.document.onkeypress = keypressed

Modified: pypy/dist/pypy/translator/js/examples/console/console.py
==============================================================================
--- pypy/dist/pypy/translator/js/examples/console/console.py	(original)
+++ pypy/dist/pypy/translator/js/examples/console/console.py	Sat Mar  3 13:37:52 2007
@@ -10,11 +10,14 @@
 from pypy.translator.js.lib.support import callback
 from pypy.translator.js import commproxy
 from pypy.translator.js.examples.console.session import Interpreter
+from pypeers.httpserver import GreenHTTPServer
 
 commproxy.USE_MOCHIKIT = True
 
 FUNCTION_LIST = ["console_onload"]
 
+class Ignore(Exception):
+    pass
 
 def js_source():
     import client
@@ -23,15 +26,25 @@
 class Sessions(object):
     def __init__(self):
         self.sessions = {}
+        self.updating = {}
 
     def new_session(self):
         ip = Interpreter("python")
         self.sessions[ip.pid] = ip
+        self.updating[ip.pid] = False
         return ip.pid
 
     def update_session(self, pid, to_write=None):
         ip = self.sessions[pid]
-        return ip.interact(to_write)
+        if self.updating[pid]:
+            ip.write_only(to_write)
+            raise Ignore()
+        self.updating[pid] = True
+        ret = ip.interact(to_write)
+        self.updating[pid] = False
+        if not ret:
+            return ""
+        return ret
 
 # We hack here, cause in exposed methods we don't have global 'server'
 # state
@@ -45,20 +58,23 @@
 
     @callback(retval=[str])
     def refresh(self, pid=0, to_write=""):
-        print "Refresh %s" % to_write
+        #print "Refresh %s %d" % (to_write, int(pid))
         try:
             return ["refresh", sessions.update_session(int(pid), to_write)]
         except KeyError:
             return ["disconnected"]
+        except Ignore:
+            return ["ignore"]
 
     @callback(retval=[str])
     def refresh_empty(self, pid=0):
-        print "Empty refresh"
+        #print "Empty refresh %d" % int(pid)
         try:
             return ["refresh", sessions.update_session(int(pid), None)]
         except KeyError:
             return ["disconnected"]
-    
+        except Ignore:
+            return ["ignore"]
 
 exported_methods = ExportedMethods()
 
@@ -79,5 +95,6 @@
 
 if __name__ == '__main__':
     addr = ('', 8007)
-    httpd = server.create_server(server_address=addr, handler=Handler)
+    httpd = server.create_server(server_address=addr, handler=Handler,
+                                 server=GreenHTTPServer)
     httpd.serve_forever()

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	Sat Mar  3 13:37:52 2007
@@ -13,25 +13,9 @@
 import py
 import subprocess
 from Queue import Queue
-from pypeers.greensock2 import autogreenlet, sleep, wait, meetingpoint
+from pypeers.greensock2 import autogreenlet, Timer, wait, meetingpoint,\
+     Interrupted
 from pypeers.pipe.fd import FDInput
-
-def timeout_read(fd, timeout):
-    read = []
-    giver, accepter = meetingpoint()
-    
-    def timeout_fun():
-        sleep(timeout)
-        giver.give(None)
-        g_read.interrupt()
-
-    def read_fun():
-        giver.give(fd.recv(1024))
-        g_timer.interrupt()
-
-    g_timer = autogreenlet(timeout_fun)
-    g_read = autogreenlet(read_fun)
-    return accepter.accept()
     
 class Interpreter(object):
     def __init__(self, python, timeout=TIMEOUT):
@@ -43,10 +27,24 @@
         self.pid = pipe.pid
         self.timeout = timeout
 
+    def timeout_read(self, fd, timeout):
+        timer = Timer(timeout)
+        try:
+            data = fd.recv(1024)
+        except Interrupted:
+            data = None
+        else:
+            timer.stop()
+        return data
+
+    def write_only(self, to_write):
+        if to_write:
+            self.pipe.stdin.write(to_write)
+
     def interact(self, to_write=None):
         if to_write is not None:
             self.pipe.stdin.write(to_write)
-        return timeout_read(self.read_fd, self.timeout)
+        return self.timeout_read(self.read_fd, self.timeout)
 
     def close(self):
         self.pipe.stdin.close()



More information about the Pypy-commit mailing list