blob: 08fd6897c72aaf342fa006f741af3fa1de220d6e [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"
Gabriel Charette44db1422018-08-06 11:19:339#include "base/task/post_task.h"
Robbie McElrath31391ba2018-11-15 02:04:5010#include "base/threading/sequenced_task_runner_handle.h"
gabf767595f2016-05-11 18:50:3511#include "base/threading/thread_task_runner_handle.h"
[email protected]76d7f722011-10-10 17:22:4112
13namespace net {
14
Robbie McElrath31391ba2018-11-15 02:04:5015SerialWorker::SerialWorker()
16 : base::RefCountedDeleteOnSequence<SerialWorker>(
17 base::SequencedTaskRunnerHandle::Get()),
Jeremy Romand54000b22019-07-08 18:40:1618 state_(IDLE) {}
[email protected]76d7f722011-10-10 17:22:4119
Chris Watkins68b15032017-12-01 03:07:1320SerialWorker::~SerialWorker() = default;
[email protected]76d7f722011-10-10 17:22:4121
22void SerialWorker::WorkNow() {
Francois Doraybecd1ef72017-09-25 20:58:4523 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4124 switch (state_) {
25 case IDLE:
Leonid Kaplan24c51bc2018-09-04 13:23:1626 // We are posting weak pointer to OnWorkJobFinished to avoid leak when
Sami Kyostila0b4314e2019-07-31 20:47:1727 // PostTaskAndReply fails to post task back to the original
Leonid Kaplan24c51bc2018-09-04 13:23:1628 // task runner. In this case the callback is not destroyed, and the
29 // weak reference allows SerialWorker instance to be deleted.
Sami Kyostila0b4314e2019-07-31 20:47:1730 base::PostTaskAndReply(FROM_HERE,
31 {base::ThreadPool(), base::MayBlock(),
32 base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
33 base::BindOnce(&SerialWorker::DoWork, this),
34 base::BindOnce(&SerialWorker::OnWorkJobFinished,
35 weak_factory_.GetWeakPtr()));
[email protected]76d7f722011-10-10 17:22:4136 state_ = WORKING;
37 return;
38 case WORKING:
39 // Remember to re-read after |DoRead| finishes.
40 state_ = PENDING;
41 return;
42 case CANCELLED:
43 case PENDING:
[email protected]76d7f722011-10-10 17:22:4144 return;
45 default:
46 NOTREACHED() << "Unexpected state " << state_;
47 }
48}
49
50void SerialWorker::Cancel() {
Francois Doraybecd1ef72017-09-25 20:58:4551 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4152 state_ = CANCELLED;
53}
54
[email protected]76d7f722011-10-10 17:22:4155void SerialWorker::OnWorkJobFinished() {
Francois Doraybecd1ef72017-09-25 20:58:4556 DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
[email protected]76d7f722011-10-10 17:22:4157 switch (state_) {
58 case CANCELLED:
59 return;
60 case WORKING:
61 state_ = IDLE;
62 this->OnWorkFinished();
63 return;
64 case PENDING:
65 state_ = IDLE;
66 WorkNow();
67 return;
68 default:
69 NOTREACHED() << "Unexpected state " << state_;
70 }
71}
72
[email protected]76d7f722011-10-10 17:22:4173} // namespace net