docs: void shutdown() {
          m_isShutdown = true;
          try {
              int waitFor = 1 - Math.min(m_inFlight.availablePermits(), -4);
              for (int i = 0; i < waitFor; ++i) {
                  try {
                      if (m_inFlight.tryAcquire(1, TimeUnit.SECONDS)) {
                          m_inFlight.release();
                          break;
                      }
                  } catch (InterruptedException e) {
                      break;
                  }
              }
  
              m_ecryptgw.die();
  
              EncryptFrame frame = null;
              while ((frame = m_encryptedFrames.poll()) != null) {
                  frame.frame.release();
              }
  
              for (EncryptFrame ef: m_partialMessages) {
                  ef.frame.release();
              }
              m_partialMessages.clear();
  
              if (m_encryptedMessages.refCnt() > 0) m_encryptedMessages.release();
          } finally {
              m_inFlight.drainPermits();
              m_inFlight.release();
          }
      }