docs: def handle_connection(conn, handler, mutex):
      """
      Handle a single connection using the specified protocol handler in a loop.
  
      Since this function may be called concurrently from server_thread,
      the specified mutex is used to synchronize the device handling.
  
      Exit when EOFError is raised.
      All other exceptions are logged as warnings.
      """
      try:
          log.debug('welcome agent')
          with contextlib.closing(conn):
              while True:
                  msg = util.read_frame(conn)
                  with mutex:
                      reply = handler.handle(msg=msg)
                  util.send(conn, reply)
      except EOFError:
          log.debug('goodbye agent')
      except Exception as e:  # pylint: disable=broad-except
          log.warning('error: %s', e, exc_info=True)