blob: 01f1711ca440ab3666702bdbae68f1f43a01718d [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"
Hans Wennborg0924470b2020-04-27 21:08:058#include "base/check_op.h"
[email protected]76d7f722011-10-10 17:22:419#include "base/location.h"
Hans Wennborg0924470b2020-04-27 21:08:0510#include "base/notreached.h"
Gabriel Charette44db1422018-08-06 11:19:3311#include "base/task/post_task.h"
Gabriel Charetted5c656c2020-02-26 16:35:2212#include "base/task/thread_pool.h"
Robbie McElrath31391ba2018-11-15 02:04:5013#include "base/threading/sequenced_task_runner_handle.h"
gabf767595f2016-05-11 18:50:3514#include "base/threading/thread_task_runner_handle.h"
[email protected]76d7f722011-10-10 17:22:4115
16namespace net {
17
Erik Andersonc243d712021-07-30 00:13:4118SerialWorker::SerialWorker()
Robbie McElrath31391ba2018-11-15 02:04:5019 : base::RefCountedDeleteOnSequence<SerialWorker>(
20 base::SequencedTaskRunnerHandle::Get()),
Erik Andersonc243d712021-07-30 00:13:4121 state_(IDLE) {}
[email protected]76d7f722011-10-10 17:22:4122
Chris Watkins68b15032017-12-01 03:07:1323SerialWorker::~SerialWorker() = default;
[email protected]76d7f722011-10-10 17:22:4124
25void SerialWorker::WorkNow() {
Francois Doraybecd1ef72017-09-25 20:58:4526 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4127 switch (state_) {
28 case IDLE:
Erik Andersonc243d712021-07-30 00:13:4129 // We are posting weak pointer to OnWorkJobFinished to avoid leak when
Sami Kyostila0b4314e2019-07-31 20:47:1730 // PostTaskAndReply fails to post task back to the original
Leonid Kaplan24c51bc2018-09-04 13:23:1631 // task runner. In this case the callback is not destroyed, and the
32 // weak reference allows SerialWorker instance to be deleted.
Gabriel Charetted5c656c2020-02-26 16:35:2233 base::ThreadPool::PostTaskAndReply(
34 FROM_HERE,
35 {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
36 base::BindOnce(&SerialWorker::DoWork, this),
37 base::BindOnce(&SerialWorker::OnWorkJobFinished,
38 weak_factory_.GetWeakPtr()));
[email protected]76d7f722011-10-10 17:22:4139 state_ = WORKING;
40 return;
41 case WORKING:
42 // Remember to re-read after |DoRead| finishes.
43 state_ = PENDING;
44 return;
45 case CANCELLED:
46 case PENDING:
[email protected]76d7f722011-10-10 17:22:4147 return;
48 default:
49 NOTREACHED() << "Unexpected state " << state_;
50 }
51}
52
53void SerialWorker::Cancel() {
Francois Doraybecd1ef72017-09-25 20:58:4554 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4155 state_ = CANCELLED;
56}
Erik Andersonc243d712021-07-30 00:13:4157
[email protected]76d7f722011-10-10 17:22:4158void SerialWorker::OnWorkJobFinished() {
Francois Doraybecd1ef72017-09-25 20:58:4559 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4160 switch (state_) {
61 case CANCELLED:
62 return;
63 case WORKING:
64 state_ = IDLE;
Erik Andersonc243d712021-07-30 00:13:4165 this->OnWorkFinished();
[email protected]76d7f722011-10-10 17:22:4166 return;
67 case PENDING:
68 state_ = IDLE;
Erik Andersonc243d712021-07-30 00:13:4169 WorkNow();
[email protected]76d7f722011-10-10 17:22:4170 return;
71 default:
72 NOTREACHED() << "Unexpected state " << state_;
73 }
74}
75
[email protected]76d7f722011-10-10 17:22:4176} // namespace net