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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/FetchBlobDataConsumerHandle.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/FetchBlobDataConsumerHandle.h" 5 #include "modules/fetch/FetchBlobDataConsumerHandle.h"
6 6
7 #include "core/dom/ExecutionContext.h" 7 #include "core/dom/ExecutionContext.h"
8 #include "core/fetch/FetchInitiatorTypeNames.h" 8 #include "core/fetch/FetchInitiatorTypeNames.h"
9 #include "core/loader/ThreadableLoaderClient.h" 9 #include "core/loader/ThreadableLoaderClient.h"
10 #include "modules/fetch/CompositeDataConsumerHandle.h" 10 #include "modules/fetch/CompositeDataConsumerHandle.h"
11 #include "modules/fetch/CrossThreadHolder.h" 11 #include "modules/fetch/CrossThreadHolder.h"
12 #include "modules/fetch/DataConsumerHandleUtil.h" 12 #include "modules/fetch/DataConsumerHandleUtil.h"
13 #include "platform/blob/BlobRegistry.h" 13 #include "platform/blob/BlobRegistry.h"
14 #include "platform/blob/BlobURL.h" 14 #include "platform/blob/BlobURL.h"
15 #include "platform/network/ResourceRequest.h" 15 #include "platform/network/ResourceRequest.h"
16 #include "public/platform/WebTaskRunner.h"
16 #include "wtf/PtrUtil.h" 17 #include "wtf/PtrUtil.h"
17 #include <memory> 18 #include <memory>
18 19
19 namespace blink { 20 namespace blink {
20 21
21 using Result = FetchBlobDataConsumerHandle::Result; 22 using Result = FetchBlobDataConsumerHandle::Result;
22 23
23 namespace { 24 namespace {
24 25
25 // Object graph: 26 // Object graph:
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
174 } // namespace 175 } // namespace
175 176
176 // ReaderContext is referenced from FetchBlobDataConsumerHandle and 177 // ReaderContext is referenced from FetchBlobDataConsumerHandle and
177 // ReaderContext::ReaderImpl. 178 // ReaderContext::ReaderImpl.
178 // All functions/members must be called/accessed only on the reader thread, 179 // All functions/members must be called/accessed only on the reader thread,
179 // except for constructor, destructor, and obtainReader(). 180 // except for constructor, destructor, and obtainReader().
180 class FetchBlobDataConsumerHandle::ReaderContext final : public ThreadSafeRefCou nted<ReaderContext> { 181 class FetchBlobDataConsumerHandle::ReaderContext final : public ThreadSafeRefCou nted<ReaderContext> {
181 public: 182 public:
182 class ReaderImpl : public FetchDataConsumerHandle::Reader { 183 class ReaderImpl : public FetchDataConsumerHandle::Reader {
183 public: 184 public:
184 ReaderImpl(Client* client, PassRefPtr<ReaderContext> readerContext, std: :unique_ptr<WebDataConsumerHandle::Reader> reader) 185 ReaderImpl(Client* client, PassRefPtr<ReaderContext> readerContext, std: :unique_ptr<WebDataConsumerHandle::Reader> reader, std::unique_ptr<WebTaskRunner > readerTaskRunner)
185 : m_readerContext(readerContext) 186 : m_readerContext(readerContext)
186 , m_reader(std::move(reader)) 187 , m_reader(std::move(reader))
187 , m_notifier(client) { } 188 , m_notifier(client, readerTaskRunner.get()) { }
188 ~ReaderImpl() override { } 189 ~ReaderImpl() override { }
189 190
190 Result read(void* data, size_t size, Flags flags, size_t* readSize) over ride 191 Result read(void* data, size_t size, Flags flags, size_t* readSize) over ride
191 { 192 {
192 if (m_readerContext->drained()) 193 if (m_readerContext->drained())
193 return Done; 194 return Done;
194 m_readerContext->ensureStartLoader(); 195 m_readerContext->ensureStartLoader();
195 Result r = m_reader->read(data, size, flags, readSize); 196 Result r = m_reader->read(data, size, flags, readSize);
196 if (!(size == 0 && (r == Ok || r == ShouldWait))) { 197 if (!(size == 0 && (r == Ok || r == ShouldWait))) {
197 // We read non-empty data, so we cannot use the blob data 198 // We read non-empty data, so we cannot use the blob data
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 ReaderContext(ExecutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle, FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory) 247 ReaderContext(ExecutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle, FetchBlobDataConsumerHandle::LoaderFactory* loaderFactory)
247 : m_blobDataHandleForDrain(blobDataHandle) 248 : m_blobDataHandleForDrain(blobDataHandle)
248 , m_loaderStarted(false) 249 , m_loaderStarted(false)
249 , m_drained(false) 250 , m_drained(false)
250 { 251 {
251 CompositeDataConsumerHandle::Updater* updater = nullptr; 252 CompositeDataConsumerHandle::Updater* updater = nullptr;
252 m_handle = CompositeDataConsumerHandle::create(createWaitingDataConsumer Handle(), &updater); 253 m_handle = CompositeDataConsumerHandle::create(createWaitingDataConsumer Handle(), &updater);
253 m_loaderContextHolder = CrossThreadHolder<LoaderContext>::create(executi onContext, wrapUnique(new BlobLoaderContext(updater, m_blobDataHandleForDrain, l oaderFactory))); 254 m_loaderContextHolder = CrossThreadHolder<LoaderContext>::create(executi onContext, wrapUnique(new BlobLoaderContext(updater, m_blobDataHandleForDrain, l oaderFactory)));
254 } 255 }
255 256
256 std::unique_ptr<FetchDataConsumerHandle::Reader> obtainReader(WebDataConsume rHandle::Client* client) 257 std::unique_ptr<FetchDataConsumerHandle::Reader> obtainReader(WebDataConsume rHandle::Client* client, std::unique_ptr<WebTaskRunner> readerTaskRunner)
257 { 258 {
258 return wrapUnique(new ReaderImpl(client, this, m_handle->obtainReader(cl ient))); 259 return wrapUnique(new ReaderImpl(client, this, m_handle->obtainReader(cl ient, readerTaskRunner->clone()), readerTaskRunner->clone()));
259 } 260 }
260 261
261 private: 262 private:
262 void ensureStartLoader() 263 void ensureStartLoader()
263 { 264 {
264 if (m_loaderStarted) 265 if (m_loaderStarted)
265 return; 266 return;
266 m_loaderStarted = true; 267 m_loaderStarted = true;
267 m_loaderContextHolder->postTask(crossThreadBind(&LoaderContext::start)); 268 m_loaderContextHolder->postTask(crossThreadBind(&LoaderContext::start));
268 } 269 }
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 } 302 }
302 303
303 std::unique_ptr<FetchDataConsumerHandle> FetchBlobDataConsumerHandle::create(Exe cutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle) 304 std::unique_ptr<FetchDataConsumerHandle> FetchBlobDataConsumerHandle::create(Exe cutionContext* executionContext, PassRefPtr<BlobDataHandle> blobDataHandle)
304 { 305 {
305 if (!blobDataHandle) 306 if (!blobDataHandle)
306 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer Handle()); 307 return createFetchDataConsumerHandleFromWebHandle(createDoneDataConsumer Handle());
307 308
308 return wrapUnique(new FetchBlobDataConsumerHandle(executionContext, blobData Handle, new DefaultLoaderFactory)); 309 return wrapUnique(new FetchBlobDataConsumerHandle(executionContext, blobData Handle, new DefaultLoaderFactory));
309 } 310 }
310 311
311 std::unique_ptr<FetchDataConsumerHandle::Reader> FetchBlobDataConsumerHandle::ob tainFetchDataReader(Client* client) 312 std::unique_ptr<FetchDataConsumerHandle::Reader> FetchBlobDataConsumerHandle::ob tainFetchDataReader(Client* client, std::unique_ptr<WebTaskRunner> readerTaskRun ner)
312 { 313 {
313 return m_readerContext->obtainReader(client); 314 return m_readerContext->obtainReader(client, std::move(readerTaskRunner));
314 } 315 }
315 316
316 } // namespace blink 317 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698