private void scheduleTimeout(final ChannelHandlerContext ctx, final ChannelPromise promise) {
    // Schedule a timeout.
    final WriteTimeoutTask task = new WriteTimeoutTask(ctx, promise);
    task.scheduledFuture = ctx.executor().schedule(task, timeoutNanos, TimeUnit.NANOSECONDS);

    if (!task.scheduledFuture.isDone()) {
      addWriteTimeoutTask(task);

      // Cancel the scheduled timeout if the flush promise is complete.
      promise.addListener(task);
    }
  }