[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" | ||||
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 9 | #include "base/task_scheduler/post_task.h" |
gab | f767595f | 2016-05-11 18:50:35 | [diff] [blame] | 10 | #include "base/threading/thread_task_runner_handle.h" |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 11 | |
12 | namespace net { | ||||
13 | |||||
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 14 | SerialWorker::SerialWorker() : state_(IDLE) {} |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 15 | |
16 | SerialWorker::~SerialWorker() {} | ||||
17 | |||||
18 | void SerialWorker::WorkNow() { | ||||
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 19 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 20 | switch (state_) { |
21 | case IDLE: | ||||
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 22 | 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] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 27 | 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] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 35 | return; |
36 | default: | ||||
37 | NOTREACHED() << "Unexpected state " << state_; | ||||
38 | } | ||||
39 | } | ||||
40 | |||||
41 | void SerialWorker::Cancel() { | ||||
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 42 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 43 | state_ = CANCELLED; |
44 | } | ||||
45 | |||||
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 46 | void SerialWorker::OnWorkJobFinished() { |
Francois Doray | becd1ef7 | 2017-09-25 20:58:45 | [diff] [blame] | 47 | DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
[email protected] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 48 | 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] | 76d7f72 | 2011-10-10 17:22:41 | [diff] [blame] | 64 | } // namespace net |