[email protected] | cb50762 | 2012-03-23 16:17:06 | [diff] [blame] | 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 2 | // 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 Charette | 44db142 | 2018-08-06 11:19:33 | [diff] [blame] | 9 | #include "base/task/post_task.h" |
Robbie McElrath | 31391ba | 2018-11-15 02:04:50 | [diff] [blame] | 10 | #include "base/threading/sequenced_task_runner_handle.h" |
gab | f767595f | 2016-05-11 18:50:35 | [diff] [blame] | 11 | #include "base/threading/thread_task_runner_handle.h" |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 12 | |
13 | namespace net { | ||||
14 | |||||
Robbie McElrath | 31391ba | 2018-11-15 02:04:50 | [diff] [blame] | 15 | SerialWorker::SerialWorker() |
16 | : base::RefCountedDeleteOnSequence<SerialWorker>( | ||||
17 | base::SequencedTaskRunnerHandle::Get()), | ||||
Jeremy Roman | d54000b2 | 2019-07-08 18:40:16 | [diff] [blame] | 18 | state_(IDLE) {} |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 19 | |
Chris Watkins | 68b1503 | 2017-12-01 03:07:13 | [diff] [blame] | 20 | SerialWorker::~SerialWorker() = default; |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 21 | |
22 | void SerialWorker::WorkNow() { | ||||
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 23 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 24 | switch (state_) { |
25 | case IDLE: | ||||
Leonid Kaplan | 24c51bc | 2018-09-04 13:23:16 | [diff] [blame] | 26 | // We are posting weak pointer to OnWorkJobFinished to avoid leak when |
Sami Kyostila | 0b4314e | 2019-07-31 20:47:17 | [diff] [blame^] | 27 | // PostTaskAndReply fails to post task back to the original |
Leonid Kaplan | 24c51bc | 2018-09-04 13:23:16 | [diff] [blame] | 28 | // task runner. In this case the callback is not destroyed, and the |
29 | // weak reference allows SerialWorker instance to be deleted. | ||||
Sami Kyostila | 0b4314e | 2019-07-31 20:47:17 | [diff] [blame^] | 30 | 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] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 36 | 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] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 44 | return; |
45 | default: | ||||
46 | NOTREACHED() << "Unexpected state " << state_; | ||||
47 | } | ||||
48 | } | ||||
49 | |||||
50 | void SerialWorker::Cancel() { | ||||
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 51 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 52 | state_ = CANCELLED; |
53 | } | ||||
54 | |||||
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 55 | void SerialWorker::OnWorkJobFinished() { |
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 56 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 57 | 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] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 73 | } // namespace net |