docs: private void unschedule() throws IOException {
          // since everything is written, we are not interested anymore in write-events, so lets unsubscribe
          unregisterOp(OP_WRITE);
          // So the outputBuffer is empty, so we are going to unschedule the pipeline.
          scheduled.set(false);
  
          if (writeQueue.isEmpty() && priorityWriteQueue.isEmpty()) {
              // there are no remaining frames, so we are done.
              return;
          }
  
          // So there are frames, but we just unscheduled ourselves. If we don't try to reschedule, then these
          // Frames are at risk not to be send.
          if (!scheduled.compareAndSet(false, true)) {
              //someone else managed to schedule this OutboundHandler, so we are done.
              return;
          }
  
          // We managed to reschedule. So lets add ourselves to the owner so we are processed again.
          // We don't need to call wakeup because the current thread is the IO-thread and the selectionQueue will be processed
          // till it is empty. So it will also pick up tasks that are added while it is processing the selectionQueue.
  
          // owner can't be null because this method is made by the owning io thread.
          owner().addTask(this);
      }