From eb2a9e2fe31195f079cbe22c1b4d03cc61c7c5b5 Mon Sep 17 00:00:00 2001 From: Chris Ball Date: Fri, 04 Dec 2009 02:59:56 +0000 Subject: server.py: fixes for python2.6 threading raising -EINTRs. --- diff --git a/server.py b/server.py index 51e7164..a07c134 100755 --- a/server.py +++ b/server.py @@ -25,10 +25,12 @@ from __future__ import with_statement import sys import os import subprocess +import select import codecs from StringIO import StringIO import BaseHTTPServer from SimpleHTTPServer import SimpleHTTPRequestHandler +import errno import urllib import re import wp @@ -45,6 +47,29 @@ except ImportError: import mwlib.htmlwriter from mwlib import parser, scanner, expander +class MyHTTPServer(BaseHTTPServer.HTTPServer): + def serve_forever(self, poll_interval=0.5): + """Overridden version of BaseServer.serve_forever that does not fail + to work when EINTR is received. + """ + self._BaseServer__serving = True + self._BaseServer__is_shut_down.clear() + while self._BaseServer__serving: + # XXX: Consider using another file descriptor or + # connecting to the socket to wake this up instead of + # polling. Polling reduces our responsiveness to a + # shutdown request and wastes cpu at all other times. + try: + r, w, e = select.select([self], [], [], poll_interval) + except select.error, e: + if e[0] == errno.EINTR: + print "got eintr" + continue + raise + if r: + self._handle_request_noblock() + self._BaseServer__is_shut_down.set() + class LinkStats: allhits = 1 alltotal = 1 @@ -591,7 +616,7 @@ def load_db(dbname): def run_server(path, port): index = ArticleIndex('%s.index.txt' % path) - httpd = BaseHTTPServer.HTTPServer(('', port), + httpd = MyHTTPServer(('', port), lambda *args: WikiRequestHandler(index, *args)) if __name__ == '__main__': -- cgit v0.9.1