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);
}