mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-11-28 08:16: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
|