docs: def start(self):
          """Run the server forever."""
          # We don't have to trap KeyboardInterrupt or SystemExit here,
          # because cherrpy.server already does so, calling self.stop() for us.
          # If you're using this server with another framework, you should
          # trap those exceptions in whatever code block calls start().
          self._interrupt = None
          
          if self.software is None:
              self.software = "%s Server" % self.version
          
          # SSL backward compatibility
          if (self.ssl_adapter is None and
              getattr(self, 'ssl_certificate', None) and
              getattr(self, 'ssl_private_key', None)):
              warnings.warn(
                      "SSL attributes are deprecated in CherryPy 3.2, and will "
                      "be removed in CherryPy 3.3. Use an ssl_adapter attribute "
                      "instead.",
                      DeprecationWarning
                  )
              try:
                  from cherrypy.wsgiserver.ssl_pyopenssl import pyOpenSSLAdapter
              except ImportError:
                  pass
              else:
                  self.ssl_adapter = pyOpenSSLAdapter(
                      self.ssl_certificate, self.ssl_private_key,
                      getattr(self, 'ssl_certificate_chain', None))
          
          # Select the appropriate socket
          if isinstance(self.bind_addr, basestring):
              # AF_UNIX socket
              
              # So we can reuse the socket...
              try: os.unlink(self.bind_addr)
              except: pass
              
              # So everyone can access the socket...
              try: os.chmod(self.bind_addr, 0777)
              except: pass
              
              info = [(socket.AF_UNIX, socket.SOCK_STREAM, 0, "", self.bind_addr)]
          else:
              # AF_INET or AF_INET6 socket
              # Get the correct address family for our host (allows IPv6 addresses)
              host, port = self.bind_addr
              try:
                  info = socket.getaddrinfo(host, port, socket.AF_UNSPEC,
                                            socket.SOCK_STREAM, 0, socket.AI_PASSIVE)
              except socket.gaierror:
                  if ':' in self.bind_addr[0]:
                      info = [(socket.AF_INET6, socket.SOCK_STREAM,
                               0, "", self.bind_addr + (0, 0))]
                  else:
                      info = [(socket.AF_INET, socket.SOCK_STREAM,
                               0, "", self.bind_addr)]
          
          self.socket = None
          msg = "No socket could be created"
          for res in info:
              af, socktype, proto, canonname, sa = res
              try:
                  self.bind(af, socktype, proto)
              except socket.error:
                  if self.socket:
                      self.socket.close()
                  self.socket = None
                  continue
              break
          if not self.socket:
              raise socket.error(msg)
          
          # Timeout so KeyboardInterrupt can be caught on Win32
          self.socket.settimeout(1)
          self.socket.listen(self.request_queue_size)
          
          # Create worker threads
          self.requests.start()
          
          self.ready = True
          while self.ready:
              self.tick()
              if self.interrupt:
                  while self.interrupt is True:
                      # Wait for self.stop() to complete. See _set_interrupt.
                      time.sleep(0.1)
                  if self.interrupt:
                      raise self.interrupt