blob: 595c0b9ff5039b3e22f5cd62b713d62fe470ae8f [file] [log] [blame]
[email protected]cb507622012-03-23 16:17:061// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]76d7f722011-10-10 17:22:412// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/dns/serial_worker.h"
6
7#include "base/bind.h"
8#include "base/location.h"
Francois Doraybecd1ef72017-09-25 20:58:459#include "base/task_scheduler/post_task.h"
gabf767595f2016-05-11 18:50:3510#include "base/threading/thread_task_runner_handle.h"
[email protected]76d7f722011-10-10 17:22:4111
12namespace net {
13
Francois Doraybecd1ef72017-09-25 20:58:4514SerialWorker::SerialWorker() : state_(IDLE) {}
[email protected]76d7f722011-10-10 17:22:4115
16SerialWorker::~SerialWorker() {}
17
18void SerialWorker::WorkNow() {
Francois Doraybecd1ef72017-09-25 20:58:4519 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4120 switch (state_) {
21 case IDLE:
Francois Doraybecd1ef72017-09-25 20:58:4522 base::PostTaskWithTraitsAndReply(
23 FROM_HERE,
24 {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
25 base::BindOnce(&SerialWorker::DoWork, this),
26 base::BindOnce(&SerialWorker::OnWorkJobFinished, this));
[email protected]76d7f722011-10-10 17:22:4127 state_ = WORKING;
28 return;
29 case WORKING:
30 // Remember to re-read after |DoRead| finishes.
31 state_ = PENDING;
32 return;
33 case CANCELLED:
34 case PENDING:
[email protected]76d7f722011-10-10 17:22:4135 return;
36 default:
37 NOTREACHED() << "Unexpected state " << state_;
38 }
39}
40
41void SerialWorker::Cancel() {
Francois Doraybecd1ef72017-09-25 20:58:4542 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4143 state_ = CANCELLED;
44}
45
[email protected]76d7f722011-10-10 17:22:4146void SerialWorker::OnWorkJobFinished() {
Francois Doraybecd1ef72017-09-25 20:58:4547 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4148 switch (state_) {
49 case CANCELLED:
50 return;
51 case WORKING:
52 state_ = IDLE;
53 this->OnWorkFinished();
54 return;
55 case PENDING:
56 state_ = IDLE;
57 WorkNow();
58 return;
59 default:
60 NOTREACHED() << "Unexpected state " << state_;
61 }
62}
63
[email protected]76d7f722011-10-10 17:22:4164} // namespace net