in squangle/mysql_client/Operation.cpp [153:184]
void Operation::cancel() {
folly::RequestContextScopeGuard guard(std::move(request_context_));
{
// This code competes with `run()` to see who changes `state_` first,
// since they both have the combination `check and change` this must
// be locked
std::unique_lock<std::mutex> l(run_state_mutex_);
if (state_ == OperationState::Cancelling ||
state_ == OperationState::Completed) {
// If the cancel was already called we dont do the cancelling
// process again
return;
}
if (state_ == OperationState::Unstarted) {
cancel_on_run_ = true;
// wait the user to call "run()" to run the completeOperation
// otherwise we will throw exception
return;
}
state_ = OperationState::Cancelling;
}
if (!connection()->runInThread(
this, &Operation::completeOperation, OperationResult::Cancelled)) {
// if a strange error happen in EventBase , mark it cancelled now
completeOperationInner(OperationResult::Cancelled);
}
}