changeset 2121:150cdd6c3c90

Added threading support to hg serve.
author Alexander Schremmer <alex AT alexanderweb DOT de>
date Sun, 23 Apr 2006 00:27:46 +0200
parents c0994047c5ff
children 9383ba6b069a
files mercurial/hgweb.py
diffstat 1 files changed, 23 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/hgweb.py	Sun Apr 23 00:18:58 2006 +0200
+++ b/mercurial/hgweb.py	Sun Apr 23 00:27:46 2006 +0200
@@ -10,7 +10,7 @@
 import mimetypes
 from demandload import demandload
 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser")
-demandload(globals(), "tempfile StringIO BaseHTTPServer util")
+demandload(globals(), "tempfile StringIO BaseHTTPServer util SocketServer")
 demandload(globals(), "archival mimetypes templater")
 from node import *
 from i18n import gettext as _
@@ -878,7 +878,8 @@
             req.write(self.t("error"))
 
 def create_server(repo):
-
+    use_threads = True
+    
     def openlog(opt, default):
         if opt and opt != '-':
             return open(opt, 'w')
@@ -889,8 +890,25 @@
     use_ipv6 = repo.ui.configbool("web", "ipv6")
     accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout)
     errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr)
+    
+    if use_threads:
+        try:
+            from threading import activeCount
+        except ImportError:
+            use_threads = False
 
-    class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
+    if use_threads:
+        _mixin = SocketServer.ThreadingMixIn
+    else:
+        if hasattr(os, "fork"):
+            _mixin = SocketServer.ForkingMixIn
+        else:
+            class _mixin: pass
+
+    class MercurialHTTPServer(_mixin, BaseHTTPServer.HTTPServer):
+        pass
+    
+    class IPv6HTTPServer(MercurialHTTPServer):
         address_family = getattr(socket, 'AF_INET6', None)
 
         def __init__(self, *args, **kwargs):
@@ -956,13 +974,12 @@
 
             req = hgrequest(self.rfile, self.wfile, env)
             self.send_response(200, "Script output follows")
-            hg.run(req)
+            hgweb(repo.__class__(repo.ui, repo.origroot)).run(req)
 
-    hg = hgweb(repo)
     if use_ipv6:
         return IPv6HTTPServer((address, port), hgwebhandler)
     else:
-        return BaseHTTPServer.HTTPServer((address, port), hgwebhandler)
+        return MercurialHTTPServer((address, port), hgwebhandler)
 
 # This is a stopgap
 class hgwebdir(object):