Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Side by Side Diff: third_party/WebKit/Source/modules/fetch/DataConsumerHandleTestUtil.cpp

Issue 2177243002: Use per-frame TaskRunner instead of thread's default in DataConsumerHandle (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@data_consumer_handle_unique_ptr
Patch Set: update Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "modules/fetch/DataConsumerHandleTestUtil.h" 5 #include "modules/fetch/DataConsumerHandleTestUtil.h"
6 6
7 #include "bindings/core/v8/DOMWrapperWorld.h" 7 #include "bindings/core/v8/DOMWrapperWorld.h"
8 #include "wtf/PtrUtil.h" 8 #include "wtf/PtrUtil.h"
9 #include <memory> 9 #include <memory>
10 10
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 85
86 void DataConsumerHandleTestUtil::ReplayingHandle::Context::add(const Command& co mmand) 86 void DataConsumerHandleTestUtil::ReplayingHandle::Context::add(const Command& co mmand)
87 { 87 {
88 MutexLocker locker(m_mutex); 88 MutexLocker locker(m_mutex);
89 m_commands.append(command); 89 m_commands.append(command);
90 } 90 }
91 91
92 void DataConsumerHandleTestUtil::ReplayingHandle::Context::attachReader(WebDataC onsumerHandle::Client* client) 92 void DataConsumerHandleTestUtil::ReplayingHandle::Context::attachReader(WebDataC onsumerHandle::Client* client)
93 { 93 {
94 MutexLocker locker(m_mutex); 94 MutexLocker locker(m_mutex);
95 DCHECK(!m_readerThread); 95 DCHECK(!m_readerTaskRunner);
96 DCHECK(!m_client); 96 DCHECK(!m_client);
97 m_readerThread = Platform::current()->currentThread(); 97 if (client)
98 m_readerTaskRunner = client->getTaskRunner()->clone();
99 else
100 m_readerTaskRunner = Platform::current()->currentThread()->getWebTaskRun ner()->clone();
98 m_client = client; 101 m_client = client;
99 102
100 if (m_client && !(isEmpty() && m_result == ShouldWait)) 103 if (m_client && !(isEmpty() && m_result == ShouldWait))
101 notify(); 104 notify();
102 } 105 }
103 106
104 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachReader() 107 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachReader()
105 { 108 {
106 MutexLocker locker(m_mutex); 109 MutexLocker locker(m_mutex);
107 DCHECK(m_readerThread && m_readerThread->isCurrentThread()); 110 DCHECK(m_readerTaskRunner && m_readerTaskRunner->runsTasksOnCurrentThread()) ;
108 m_readerThread = nullptr; 111 m_readerTaskRunner = nullptr;
109 m_client = nullptr; 112 m_client = nullptr;
110 if (!m_isHandleAttached) 113 if (!m_isHandleAttached)
111 m_detached->signal(); 114 m_detached->signal();
112 } 115 }
113 116
114 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachHandle() 117 void DataConsumerHandleTestUtil::ReplayingHandle::Context::detachHandle()
115 { 118 {
116 MutexLocker locker(m_mutex); 119 MutexLocker locker(m_mutex);
117 m_isHandleAttached = false; 120 m_isHandleAttached = false;
118 if (!m_readerThread) 121 if (!m_readerTaskRunner)
119 m_detached->signal(); 122 m_detached->signal();
120 } 123 }
121 124
122 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::beginRead(const void** buffer, Flags, size_t* available) 125 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::beginRead(const void** buffer, Flags, size_t* available)
123 { 126 {
124 MutexLocker locker(m_mutex); 127 MutexLocker locker(m_mutex);
125 *buffer = nullptr; 128 *buffer = nullptr;
126 *available = 0; 129 *available = 0;
127 if (isEmpty()) 130 if (isEmpty())
128 return m_result; 131 return m_result;
(...skipping 27 matching lines...) Expand all
156 159
157 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::endRead(size_t readSize) 160 WebDataConsumerHandle::Result DataConsumerHandleTestUtil::ReplayingHandle::Conte xt::endRead(size_t readSize)
158 { 161 {
159 MutexLocker locker(m_mutex); 162 MutexLocker locker(m_mutex);
160 consume(readSize); 163 consume(readSize);
161 return Ok; 164 return Ok;
162 } 165 }
163 166
164 DataConsumerHandleTestUtil::ReplayingHandle::Context::Context() 167 DataConsumerHandleTestUtil::ReplayingHandle::Context::Context()
165 : m_offset(0) 168 : m_offset(0)
166 , m_readerThread(nullptr) 169 , m_readerTaskRunner(nullptr)
167 , m_client(nullptr) 170 , m_client(nullptr)
168 , m_result(ShouldWait) 171 , m_result(ShouldWait)
169 , m_isHandleAttached(true) 172 , m_isHandleAttached(true)
170 , m_detached(wrapUnique(new WaitableEvent())) 173 , m_detached(wrapUnique(new WaitableEvent()))
171 { 174 {
172 } 175 }
173 176
174 const DataConsumerHandleTestUtil::Command& DataConsumerHandleTestUtil::Replaying Handle::Context::top() 177 const DataConsumerHandleTestUtil::Command& DataConsumerHandleTestUtil::Replaying Handle::Context::top()
175 { 178 {
176 DCHECK(!isEmpty()); 179 DCHECK(!isEmpty());
(...skipping 10 matching lines...) Expand all
187 m_commands.removeFirst(); 190 m_commands.removeFirst();
188 } else { 191 } else {
189 m_offset += size; 192 m_offset += size;
190 } 193 }
191 } 194 }
192 195
193 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notify() 196 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notify()
194 { 197 {
195 if (!m_client) 198 if (!m_client)
196 return; 199 return;
197 DCHECK(m_readerThread); 200 m_client->getTaskRunner()->postTask(BLINK_FROM_HERE, crossThreadBind(&Contex t::notifyInternal, wrapPassRefPtr(this)));
198 m_readerThread->getWebTaskRunner()->postTask(BLINK_FROM_HERE, crossThreadBin d(&Context::notifyInternal, wrapPassRefPtr(this)));
199 } 201 }
200 202
201 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notifyInternal() 203 void DataConsumerHandleTestUtil::ReplayingHandle::Context::notifyInternal()
202 { 204 {
203 { 205 {
204 MutexLocker locker(m_mutex); 206 MutexLocker locker(m_mutex);
205 if (!m_client || !m_readerThread->isCurrentThread()) { 207 if (!m_client || !m_readerTaskRunner->runsTasksOnCurrentThread()) {
206 // There is no client, or a new reader is attached. 208 // There is no client, or a new reader is attached.
207 return; 209 return;
208 } 210 }
209 } 211 }
210 // The reading thread is the current thread. 212 // The reading thread is the current thread.
211 m_client->didGetReadable(); 213 m_client->didGetReadable();
212 } 214 }
213 215
214 DataConsumerHandleTestUtil::ReplayingHandle::ReplayingHandle() 216 DataConsumerHandleTestUtil::ReplayingHandle::ReplayingHandle()
215 : m_context(Context::create()) 217 : m_context(Context::create())
216 { 218 {
217 } 219 }
218 220
219 DataConsumerHandleTestUtil::ReplayingHandle::~ReplayingHandle() 221 DataConsumerHandleTestUtil::ReplayingHandle::~ReplayingHandle()
220 { 222 {
221 m_context->detachHandle(); 223 m_context->detachHandle();
222 } 224 }
223 225
224 std::unique_ptr<WebDataConsumerHandle::Reader> DataConsumerHandleTestUtil::Repla yingHandle::obtainReader(Client* client) 226 std::unique_ptr<WebDataConsumerHandle::Reader> DataConsumerHandleTestUtil::Repla yingHandle::obtainReader(Client* client)
225 { 227 {
226 return WTF::wrapUnique(new ReaderImpl(m_context, client)); 228 return WTF::wrapUnique(new ReaderImpl(m_context, client));
227 } 229 }
228 230
229 void DataConsumerHandleTestUtil::ReplayingHandle::add(const Command& command) 231 void DataConsumerHandleTestUtil::ReplayingHandle::add(const Command& command)
230 { 232 {
231 m_context->add(command); 233 m_context->add(command);
232 } 234 }
233 235
234 DataConsumerHandleTestUtil::HandleReader::HandleReader(std::unique_ptr<WebDataCo nsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinishedReading) 236 DataConsumerHandleTestUtil::HandleReader::HandleReader(std::unique_ptr<WebDataCo nsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinishedReading, std: :unique_ptr<WebTaskRunner> readerTaskRunner)
235 : m_reader(handle->obtainReader(this)) 237 : m_readerTaskRunner(std::move(readerTaskRunner))
238 , m_reader(handle->obtainReader(this))
236 , m_onFinishedReading(std::move(onFinishedReading)) 239 , m_onFinishedReading(std::move(onFinishedReading))
237 { 240 {
238 } 241 }
239 242
240 void DataConsumerHandleTestUtil::HandleReader::didGetReadable() 243 void DataConsumerHandleTestUtil::HandleReader::didGetReadable()
241 { 244 {
242 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; 245 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError;
243 char buffer[3]; 246 char buffer[3];
244 while (true) { 247 while (true) {
245 size_t size; 248 size_t size;
246 r = m_reader->read(buffer, sizeof(buffer), WebDataConsumerHandle::FlagNo ne, &size); 249 r = m_reader->read(buffer, sizeof(buffer), WebDataConsumerHandle::FlagNo ne, &size);
247 if (r == WebDataConsumerHandle::ShouldWait) 250 if (r == WebDataConsumerHandle::ShouldWait)
248 return; 251 return;
249 if (r != WebDataConsumerHandle::Ok) 252 if (r != WebDataConsumerHandle::Ok)
250 break; 253 break;
251 m_data.append(buffer, size); 254 m_data.append(buffer, size);
252 } 255 }
253 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data)); 256 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data));
254 m_data.clear(); 257 m_data.clear();
255 Platform::current()->currentThread()->getWebTaskRunner()->postTask(BLINK_FRO M_HERE, WTF::bind(&HandleReader::runOnFinishedReading, WTF::unretained(this), pa ssed(std::move(result)))); 258 m_readerTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(&HandleReader::runOn FinishedReading, WTF::unretained(this), passed(std::move(result))));
256 m_reader = nullptr; 259 m_reader = nullptr;
257 } 260 }
258 261
262 WebTaskRunner* DataConsumerHandleTestUtil::HandleReader::getTaskRunner()
263 {
264 return m_readerTaskRunner.get();
265 }
266
259 void DataConsumerHandleTestUtil::HandleReader::runOnFinishedReading(std::unique_ ptr<HandleReadResult> result) 267 void DataConsumerHandleTestUtil::HandleReader::runOnFinishedReading(std::unique_ ptr<HandleReadResult> result)
260 { 268 {
261 DCHECK(m_onFinishedReading); 269 DCHECK(m_onFinishedReading);
262 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading)); 270 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading));
263 (*onFinishedReading)(std::move(result)); 271 (*onFinishedReading)(std::move(result));
264 } 272 }
265 273
266 DataConsumerHandleTestUtil::HandleTwoPhaseReader::HandleTwoPhaseReader(std::uniq ue_ptr<WebDataConsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinis hedReading) 274 DataConsumerHandleTestUtil::HandleTwoPhaseReader::HandleTwoPhaseReader(std::uniq ue_ptr<WebDataConsumerHandle> handle, std::unique_ptr<OnFinishedReading> onFinis hedReading, std::unique_ptr<WebTaskRunner> readerTaskRunner)
267 : m_reader(handle->obtainReader(this)) 275 : m_readerTaskRunner(std::move(readerTaskRunner))
276 , m_reader(handle->obtainReader(this))
268 , m_onFinishedReading(std::move(onFinishedReading)) 277 , m_onFinishedReading(std::move(onFinishedReading))
269 { 278 {
270 } 279 }
271 280
272 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::didGetReadable() 281 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::didGetReadable()
273 { 282 {
274 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError; 283 WebDataConsumerHandle::Result r = WebDataConsumerHandle::UnexpectedError;
275 while (true) { 284 while (true) {
276 const void* buffer = nullptr; 285 const void* buffer = nullptr;
277 size_t size; 286 size_t size;
278 r = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &size) ; 287 r = m_reader->beginRead(&buffer, WebDataConsumerHandle::FlagNone, &size) ;
279 if (r == WebDataConsumerHandle::ShouldWait) 288 if (r == WebDataConsumerHandle::ShouldWait)
280 return; 289 return;
281 if (r != WebDataConsumerHandle::Ok) 290 if (r != WebDataConsumerHandle::Ok)
282 break; 291 break;
283 // Read smaller than available in order to test |endRead|. 292 // Read smaller than available in order to test |endRead|.
284 size_t readSize = std::min(size, std::max(size * 2 / 3, static_cast<size _t>(1))); 293 size_t readSize = std::min(size, std::max(size * 2 / 3, static_cast<size _t>(1)));
285 m_data.append(static_cast<const char*>(buffer), readSize); 294 m_data.append(static_cast<const char*>(buffer), readSize);
286 m_reader->endRead(readSize); 295 m_reader->endRead(readSize);
287 } 296 }
288 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data)); 297 std::unique_ptr<HandleReadResult> result = wrapUnique(new HandleReadResult(r , m_data));
289 m_data.clear(); 298 m_data.clear();
290 Platform::current()->currentThread()->getWebTaskRunner()->postTask(BLINK_FRO M_HERE, WTF::bind(&HandleTwoPhaseReader::runOnFinishedReading, WTF::unretained(t his), passed(std::move(result)))); 299 m_readerTaskRunner->postTask(BLINK_FROM_HERE, WTF::bind(&HandleTwoPhaseReade r::runOnFinishedReading, WTF::unretained(this), passed(std::move(result))));
291 m_reader = nullptr; 300 m_reader = nullptr;
292 } 301 }
293 302
303 WebTaskRunner* DataConsumerHandleTestUtil::HandleTwoPhaseReader::getTaskRunner()
304 {
305 return m_readerTaskRunner.get();
306 }
307
294 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::runOnFinishedReading(std: :unique_ptr<HandleReadResult> result) 308 void DataConsumerHandleTestUtil::HandleTwoPhaseReader::runOnFinishedReading(std: :unique_ptr<HandleReadResult> result)
295 { 309 {
296 DCHECK(m_onFinishedReading); 310 DCHECK(m_onFinishedReading);
297 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading)); 311 std::unique_ptr<OnFinishedReading> onFinishedReading(std::move(m_onFinishedR eading));
298 (*onFinishedReading)(std::move(result)); 312 (*onFinishedReading)(std::move(result));
299 } 313 }
300 314
301 } // namespace blink 315 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698