// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/dns/serial_worker.h" #include "base/bind.h" #include "base/location.h" #include "base/task_scheduler/post_task.h" #include "base/threading/thread_task_runner_handle.h" namespace net { SerialWorker::SerialWorker() : state_(IDLE) {} SerialWorker::~SerialWorker() = default; void SerialWorker::WorkNow() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); switch (state_) { case IDLE: base::PostTaskWithTraitsAndReply( FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}, base::BindOnce(&SerialWorker::DoWork, this), base::BindOnce(&SerialWorker::OnWorkJobFinished, this)); state_ = WORKING; return; case WORKING: // Remember to re-read after |DoRead| finishes. state_ = PENDING; return; case CANCELLED: case PENDING: return; default: NOTREACHED() << "Unexpected state " << state_; } } void SerialWorker::Cancel() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); state_ = CANCELLED; } void SerialWorker::OnWorkJobFinished() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); switch (state_) { case CANCELLED: return; case WORKING: state_ = IDLE; this->OnWorkFinished(); return; case PENDING: state_ = IDLE; WorkNow(); return; default: NOTREACHED() << "Unexpected state " << state_; } } } // namespace net