Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 1116

Show
Ignore:
Timestamp:
06/01/06 18:58:48
Author:
fumanchu
Message:

Attempt to re-use the _cpwsgiserver listener socket on UNIX platforms. Not tested.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/_cpwsgiserver.py

    r1113 r1116  
    55import Queue 
    66import mimetools # todo: use email 
     7import os 
    78import sys 
    89import time 
     
    175176        self.wfile.close() 
    176177        self.socket.close() 
     178        self.socket = None 
    177179 
    178180 
     
    225227    RequestHandlerClass = HTTPRequest 
    226228     
     229    # UNIX allows us to pass the socket file descriptor 
     230    # from one process to another via os.environ. 
     231    preserve_socket = hasattr(socket, "fromfd") 
     232     
    227233    def __init__(self, bind_addr, wsgi_app, numthreads=10, server_name=None, 
    228234                 max=-1, request_queue_size=5, timeout=10): 
     
    258264        # If you're using this server with another framework, you should 
    259265        # trap those exceptions in whatever code block calls start(). 
     266         
     267        def bind(family, type, proto=0): 
     268            """Create (or recreate) the actual socket object.""" 
     269            if self.preserve_socket: 
     270                socketfd = int(os.environ.get('CPWSGI_SOCKET', -1)) 
     271                if socketfd >= 0: 
     272                    self.socket = socket.fromfd(socketfd, family, type, proto) 
     273                    return 
     274             
     275            self.socket = socket.socket(family, type, proto) 
     276            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     277            self.socket.bind(self.bind_addr) 
    260278         
    261279        # Select the appropriate socket 
     
    271289            except: pass 
    272290             
    273             self.socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) 
    274             self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    275             self.socket.bind(self.bind_addr) 
     291            info = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, "", self.bind_addr)] 
    276292        else: 
    277293            # AF_INET or AF_INET6 socket 
     
    283299            except socket.gaierror: 
    284300                # Probably a DNS issue. Assume IPv4. 
    285                 self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    286                 self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
    287                 self.socket.bind(self.bind_addr) 
    288             else: 
     301                info = [(socket.AF_INET, socket.SOCK_STREAM, 0, "", self.bind_addr)] 
     302         
     303        self.socket = None 
     304        msg = "No socket could be created" 
     305        for res in info: 
     306            af, socktype, proto, canonname, sa = res 
     307            try: 
     308                bind(af, socktype, proto) 
     309            except socket.error, msg: 
     310                if self.socket: 
     311                    self.socket.close() 
    289312                self.socket = None 
    290                 msg = "No socket could be created" 
    291                 for res in info: 
    292                     af, socktype, proto, canonname, sa = res 
    293                     try: 
    294                         self.socket = socket.socket(af, socktype, proto) 
    295                         self.socket.setsockopt(socket.SOL_SOCKET, 
    296                                                socket.SO_REUSEADDR, 1) 
    297                         self.socket.bind(self.bind_addr) 
    298                     except socket.error, msg: 
    299                         if self.socket: 
    300                             self.socket.close() 
    301                         self.socket = None 
    302                         continue 
    303                     break 
    304                 if not self.socket: 
    305                     raise socket.error, msg 
     313                continue 
     314            break 
     315        if not self.socket: 
     316            raise socket.error, msg 
    306317         
    307318        # Timeout so KeyboardInterrupt can be caught on Win32 
     
    341352        """Gracefully shutdown a server that is serving forever.""" 
    342353        self.ready = False 
     354         
    343355        s = getattr(self, "socket", None) 
    344         if s and hasattr(s, "close"): 
    345             s.close() 
     356        if s: 
     357            if self.preserve_socket: 
     358                os.environ['CPWSGI_SOCKET'] = str(s.fileno()) 
     359            else: 
     360                if hasattr(s, "close"): 
     361                    s.close() 
     362            self.socket = None 
    346363         
    347364        # Must shut down threads here so the code that calls 

Hosted by WebFaction

Log in as guest/cpguest to create tickets