[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