docs: final void addTaskAndWakeup(Runnable task) {
          // in this loop we are going to either send the task to the owner
          // or store the delayed task to be picked up as soon as the migration
          // completes
          for (; ; ) {
              NioThread localOwner = owner;
              if (localOwner != null) {
                  // there is an owner, lets send the task.
                  localOwner.addTaskAndWakeup(task);
                  return;
              }
  
              // there is no owner, so we put the task on the delayedTaskStack
              TaskNode old = delayedTaskStack.get();
              TaskNode update = new TaskNode(task, old);
              if (delayedTaskStack.compareAndSet(old, update)) {
                  break;
              }
          }
  
          NioThread localOwner = owner;
          if (localOwner != null) {
              // an owner was set, but we have no guarantee that he has seen our task.
              // So lets try to reschedule the delayed tasks to make sure they get executed.
              restoreTasks(localOwner, delayedTaskStack.getAndSet(null), true);
          }
      }