docs: @Nonnull
    public EChange stop ()
    {
      if (m_aRWLock.writeLocked ( () -> {
        // Check if the thread pool is already shut down
        if (m_aSenderThreadPool.isShutdown ())
          return true;
  
        // don't take any more actions
        m_aSenderThreadPool.shutdown ();
  
        // stop all specific queues
        m_aCollector.stopQueuingNewObjects ();
  
        final int nQueueLength = m_aCollector.getQueueLength ();
        if (nQueueLength > 0)
          LOGGER.info ("Stopping auditor queue with " + nQueueLength + " items");
        return false;
      }))
      {
        // Already shutdown!
        return EChange.UNCHANGED;
      }
  
      // Don't wait in a writeLock!
      try
      {
        while (!m_aSenderThreadPool.awaitTermination (1, TimeUnit.SECONDS))
        {
          // wait until we're done
        }
      }
      catch (final InterruptedException ex)
      {
        LOGGER.error ("Error stopping auditor queue", ex);
      }
      return EChange.CHANGED;
    }