void Operation::waitForSocketActionable()

in squangle/mysql_client/Operation.cpp [120:151]


void Operation::waitForSocketActionable() {
  DCHECK(isInEventBaseThread());

  MYSQL* mysql = conn()->mysql();
  uint16_t event_mask = 0;
  NET_ASYNC* net_async = NET_ASYNC_DATA(&mysql->net);
  // net_async can be null during some stages of connecting
  auto async_blocking_state =
      net_async ? net_async->async_blocking_state : NET_NONBLOCKING_CONNECT;
  switch (async_blocking_state) {
    case NET_NONBLOCKING_READ:
      event_mask |= folly::EventHandler::READ;
      break;
    case NET_NONBLOCKING_WRITE:
    case NET_NONBLOCKING_CONNECT:
      event_mask |= folly::EventHandler::WRITE;
      break;
    default:
      LOG(FATAL) << "Unknown nonblocking state " << async_blocking_state;
  }

  auto end = timeout_ + start_time_;
  auto now = chrono::steady_clock::now();
  if (now >= end) {
    timeoutTriggered();
    return;
  }

  conn()->socketHandler()->scheduleTimeout(
      chrono::duration_cast<chrono::milliseconds>(end - now).count());
  conn()->socketHandler()->registerHandler(event_mask);
}