void setUpAbort(WdtBase &senderOrReceiver) { int abortSeconds = FLAGS_abort_after_seconds; LOG(INFO) << "Setting up abort " << abortSeconds << " seconds."; if (abortSeconds <= 0) { return; } static std::atomic<bool> abortTrigger{false}; static WdtAbortChecker chkr(abortTrigger); senderOrReceiver.setAbortChecker(&chkr); auto lambda = [=] { LOG(INFO) << "Will abort in " << abortSeconds << " seconds."; std::unique_lock<std::mutex> lk(abortMutex); if (abortCondVar.wait_for(lk, std::chrono::seconds(abortSeconds)) == std::cv_status::no_timeout) { LOG(INFO) << "Already finished normally, no abort."; } else { LOG(INFO) << "Requesting abort."; abortTrigger.store(true); } }; // we want to run in bg, not block static std::future<void> abortThread = std::async(std::launch::async, lambda); }
void setAbortChecker(WdtBase &senderOrReceiver) { senderOrReceiver.setAbortChecker(setupAbortChecker()); }