included missing language_tools file fixed hgignore added documentation txt files --HG-- branch : mung
85 lines
2 KiB
Python
85 lines
2 KiB
Python
import os, sys, time
|
|
from listener import Listener, Poller
|
|
from language import VirtualMachine
|
|
from database_fake import Fake_Database as Database
|
|
from parse import static_parser
|
|
|
|
class Server(object):
|
|
def __init__(self, dbname):
|
|
self.dbname = dbname
|
|
self.db = Database(dbname)
|
|
self.vm = VirtualMachine(self.db)
|
|
self.max_sleep = 0.1
|
|
self.min_sleep = 0.005
|
|
self.vm_sleep_fudge = 0.85
|
|
self.server_started = None
|
|
self.loop_started = None
|
|
self.listeners = []
|
|
self.poller = Poller()
|
|
|
|
def listen(self, addr, port):
|
|
l = Listener()
|
|
l.listen(addr, port)
|
|
self.listeners.append(l)
|
|
|
|
def unlisten(self, addr, port):
|
|
l = Listener()
|
|
l.listen(addr, port)
|
|
self.listeners.append(l)
|
|
|
|
def mainloop(self):
|
|
self.server_started = time.time()
|
|
while True:
|
|
self.loop_started = time.time()
|
|
|
|
"""
|
|
for l in self.listeners:
|
|
l.handle_incoming_connections()
|
|
l.scan_for_input(self.read_input)
|
|
self.vm.run()
|
|
for l in self.listeners:
|
|
l.flush_output()
|
|
self.idlewait()
|
|
"""
|
|
self.poller.poll(self.get_sleepytime())
|
|
|
|
|
|
|
|
def read_input(self, conn, data):
|
|
ds = data.split('\n')
|
|
if ds[-1] == '':
|
|
del ds[-1]
|
|
for line in ds:
|
|
print("%s: %s" % (conn.id, line))
|
|
cmd, vars = static_parser.parse_command(line)
|
|
self.db.match_command(cmd, vars)
|
|
|
|
def get_sleepytime(self):
|
|
if self.vm.sleepytime == None:
|
|
"virtual machine is still busy, no sleeping on the job!"
|
|
return 0.0
|
|
|
|
return self.vm.sleepytime
|
|
|
|
|
|
def idlewait(self):
|
|
if self.vm.sleepytime == None:
|
|
"virtual machine is still busy anyway, no sleeping on the job!"
|
|
return
|
|
|
|
"also check how much time we have spent already. if it's already been our polling"
|
|
"time (or longer!), there's no sense waiting even more!"
|
|
time_already_spent = time.time() - self.loop_started
|
|
|
|
sleepytime = min(self.max_sleep - time_already_spent, self.vm.sleepytime * self.vm_sleep_fudge)
|
|
if sleepytime < self.min_sleep or sleepytime < 0.0:
|
|
return
|
|
|
|
time.sleep(sleepytime)
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
srv = Server("Test")
|
|
srv.listen("", 7878)
|
|
srv.mainloop()
|