OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/disk_cache/in_flight_io.h" | 5 #include "net/disk_cache/in_flight_io.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/threading/thread_restrictions.h" |
10 | 11 |
11 namespace disk_cache { | 12 namespace disk_cache { |
12 | 13 |
13 BackgroundIO::BackgroundIO(InFlightIO* controller) | 14 BackgroundIO::BackgroundIO(InFlightIO* controller) |
14 : result_(-1), io_completed_(true, false), controller_(controller) { | 15 : result_(-1), io_completed_(true, false), controller_(controller) { |
15 } | 16 } |
16 | 17 |
17 // Runs on the primary thread. | 18 // Runs on the primary thread. |
18 void BackgroundIO::OnIOSignalled() { | 19 void BackgroundIO::OnIOSignalled() { |
19 if (controller_) | 20 if (controller_) |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 #endif | 76 #endif |
76 | 77 |
77 callback_thread_->PostTask(FROM_HERE, | 78 callback_thread_->PostTask(FROM_HERE, |
78 base::Bind(&BackgroundIO::OnIOSignalled, | 79 base::Bind(&BackgroundIO::OnIOSignalled, |
79 operation)); | 80 operation)); |
80 operation->io_completed()->Signal(); | 81 operation->io_completed()->Signal(); |
81 } | 82 } |
82 | 83 |
83 // Runs on the primary thread. | 84 // Runs on the primary thread. |
84 void InFlightIO::InvokeCallback(BackgroundIO* operation, bool cancel_task) { | 85 void InFlightIO::InvokeCallback(BackgroundIO* operation, bool cancel_task) { |
85 operation->io_completed()->Wait(); | 86 { |
| 87 // http://crbug.com/74623 |
| 88 base::ThreadRestrictions::ScopedAllowWait allow_wait; |
| 89 operation->io_completed()->Wait(); |
| 90 } |
86 running_ = true; | 91 running_ = true; |
87 | 92 |
88 if (cancel_task) | 93 if (cancel_task) |
89 operation->Cancel(); | 94 operation->Cancel(); |
90 | 95 |
91 // Make sure that we remove the operation from the list before invoking the | 96 // Make sure that we remove the operation from the list before invoking the |
92 // callback (so that a subsequent cancel does not invoke the callback again). | 97 // callback (so that a subsequent cancel does not invoke the callback again). |
93 DCHECK(io_list_.find(operation) != io_list_.end()); | 98 DCHECK(io_list_.find(operation) != io_list_.end()); |
94 DCHECK(!operation->HasOneRef()); | 99 DCHECK(!operation->HasOneRef()); |
95 io_list_.erase(make_scoped_refptr(operation)); | 100 io_list_.erase(make_scoped_refptr(operation)); |
96 OnOperationComplete(operation, cancel_task); | 101 OnOperationComplete(operation, cancel_task); |
97 } | 102 } |
98 | 103 |
99 // Runs on the primary thread. | 104 // Runs on the primary thread. |
100 void InFlightIO::OnOperationPosted(BackgroundIO* operation) { | 105 void InFlightIO::OnOperationPosted(BackgroundIO* operation) { |
101 DCHECK(callback_thread_->BelongsToCurrentThread()); | 106 DCHECK(callback_thread_->BelongsToCurrentThread()); |
102 io_list_.insert(make_scoped_refptr(operation)); | 107 io_list_.insert(make_scoped_refptr(operation)); |
103 } | 108 } |
104 | 109 |
105 } // namespace disk_cache | 110 } // namespace disk_cache |
OLD | NEW |