docs: def start(uri=None,
            tag_prefix='salt/engines/libvirt_events',
            filters=None):
      '''
      Listen to libvirt events and forward them to salt.
  
      :param uri: libvirt URI to listen on.
                  Defaults to None to pick the first available local hypervisor
      :param tag_prefix: the begining of the salt event tag to use.
                         Defaults to 'salt/engines/libvirt_events'
      :param filters: the list of event of listen on. Defaults to 'all'
      '''
      if filters is None:
          filters = ['all']
      try:
          libvirt.virEventRegisterDefaultImpl()
  
          cnx = libvirt.openReadOnly(uri)
          log.debug('Opened libvirt uri: %s', cnx.getURI())
  
          callback_ids = {}
          all_filters = "all" in filters
  
          for obj, event_defs in CALLBACK_DEFS.items():
              for event, real_id in event_defs:
                  event_filter = "/".join((obj, event))
                  if event_filter not in filters and obj not in filters and not all_filters:
                      continue
                  registered_id = _register_callback(cnx, tag_prefix,
                                                     obj, event, real_id)
                  if registered_id:
                      _append_callback_id(callback_ids, obj, registered_id)
  
          exit_loop = False
          while not exit_loop:
              exit_loop = libvirt.virEventRunDefaultImpl() < 0
              log.debug('=== in the loop exit_loop %s ===', exit_loop)
  
      except Exception as err:  # pylint: disable=broad-except
          log.exception(err)
      finally:
          _callbacks_cleanup(cnx, callback_ids)
          _cleanup(cnx)