mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 00:06:09 +03:00
65 lines
1.6 KiB
C++
65 lines
1.6 KiB
C++
// 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
|