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

Side by Side Diff: third_party/WebKit/Source/bindings/core/v8/ScriptStreamer.cpp

Issue 2550373005: Make WebTaskRunner ThreadSafeRefCounted (Closed)
Patch Set: +DISALLOW_COPY_AND_ASSIGN for win build fix Created 3 years, 11 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "bindings/core/v8/ScriptStreamer.h" 5 #include "bindings/core/v8/ScriptStreamer.h"
6 6
7 #include "bindings/core/v8/ScriptStreamerThread.h" 7 #include "bindings/core/v8/ScriptStreamerThread.h"
8 #include "bindings/core/v8/V8ScriptRunner.h" 8 #include "bindings/core/v8/V8ScriptRunner.h"
9 #include "core/dom/Document.h" 9 #include "core/dom/Document.h"
10 #include "core/dom/Element.h" 10 #include "core/dom/Element.h"
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 }; 168 };
169 169
170 // SourceStream implements the streaming interface towards V8. The main 170 // SourceStream implements the streaming interface towards V8. The main
171 // functionality is preparing the data to give to V8 on main thread, and 171 // functionality is preparing the data to give to V8 on main thread, and
172 // actually giving the data (via GetMoreData which is called on a background 172 // actually giving the data (via GetMoreData which is called on a background
173 // thread). 173 // thread).
174 class SourceStream : public v8::ScriptCompiler::ExternalSourceStream { 174 class SourceStream : public v8::ScriptCompiler::ExternalSourceStream {
175 WTF_MAKE_NONCOPYABLE(SourceStream); 175 WTF_MAKE_NONCOPYABLE(SourceStream);
176 176
177 public: 177 public:
178 explicit SourceStream(WebTaskRunner* loadingTaskRunner) 178 explicit SourceStream(RefPtr<WebTaskRunner> loadingTaskRunner)
179 : v8::ScriptCompiler::ExternalSourceStream(), 179 : v8::ScriptCompiler::ExternalSourceStream(),
180 m_cancelled(false), 180 m_cancelled(false),
181 m_finished(false), 181 m_finished(false),
182 m_queueLeadPosition(0), 182 m_queueLeadPosition(0),
183 m_queueTailPosition(0), 183 m_queueTailPosition(0),
184 m_loadingTaskRunner(loadingTaskRunner->clone()) {} 184 m_loadingTaskRunner(std::move(loadingTaskRunner)) {}
185 185
186 virtual ~SourceStream() override {} 186 virtual ~SourceStream() override {}
187 187
188 // Called by V8 on a background thread. Should block until we can return 188 // Called by V8 on a background thread. Should block until we can return
189 // some data. 189 // some data.
190 size_t GetMoreData(const uint8_t** src) override { 190 size_t GetMoreData(const uint8_t** src) override {
191 DCHECK(!isMainThread()); 191 DCHECK(!isMainThread());
192 { 192 {
193 MutexLocker locker(m_mutex); 193 MutexLocker locker(m_mutex);
194 if (m_cancelled) 194 if (m_cancelled)
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 RefPtr<const SharedBuffer> m_resourceBuffer; // Only used by the main thread. 310 RefPtr<const SharedBuffer> m_resourceBuffer; // Only used by the main thread.
311 311
312 // The queue contains the data to be passed to the V8 thread. 312 // The queue contains the data to be passed to the V8 thread.
313 // queueLeadPosition: data we have handed off to the V8 thread. 313 // queueLeadPosition: data we have handed off to the V8 thread.
314 // queueTailPosition: end of data we have enqued in the queue. 314 // queueTailPosition: end of data we have enqued in the queue.
315 // bookmarkPosition: position of the bookmark. 315 // bookmarkPosition: position of the bookmark.
316 SourceStreamDataQueue m_dataQueue; // Thread safe. 316 SourceStreamDataQueue m_dataQueue; // Thread safe.
317 size_t m_queueLeadPosition; // Only used by v8 thread. 317 size_t m_queueLeadPosition; // Only used by v8 thread.
318 size_t m_queueTailPosition; // Used by both threads; guarded by m_mutex. 318 size_t m_queueTailPosition; // Used by both threads; guarded by m_mutex.
319 319
320 std::unique_ptr<WebTaskRunner> m_loadingTaskRunner; 320 RefPtr<WebTaskRunner> m_loadingTaskRunner;
321 }; 321 };
322 322
323 size_t ScriptStreamer::s_smallScriptThreshold = 30 * 1024; 323 size_t ScriptStreamer::s_smallScriptThreshold = 30 * 1024;
324 324
325 void ScriptStreamer::startStreaming(PendingScript* script, 325 void ScriptStreamer::startStreaming(PendingScript* script,
326 Type scriptType, 326 Type scriptType,
327 Settings* settings, 327 Settings* settings,
328 ScriptState* scriptState, 328 ScriptState* scriptState,
329 WebTaskRunner* loadingTaskRunner) { 329 RefPtr<WebTaskRunner> loadingTaskRunner) {
330 // We don't yet know whether the script will really be streamed. E.g., 330 // We don't yet know whether the script will really be streamed. E.g.,
331 // suppressing streaming for short scripts is done later. Record only the 331 // suppressing streaming for short scripts is done later. Record only the
332 // sure negative cases here. 332 // sure negative cases here.
333 bool startedStreaming = startStreamingInternal( 333 bool startedStreaming = startStreamingInternal(
334 script, scriptType, settings, scriptState, loadingTaskRunner); 334 script, scriptType, settings, scriptState, std::move(loadingTaskRunner));
335 if (!startedStreaming) 335 if (!startedStreaming)
336 recordStartedStreamingHistogram(scriptType, 0); 336 recordStartedStreamingHistogram(scriptType, 0);
337 } 337 }
338 338
339 bool ScriptStreamer::convertEncoding( 339 bool ScriptStreamer::convertEncoding(
340 const char* encodingName, 340 const char* encodingName,
341 v8::ScriptCompiler::StreamedSource::Encoding* encoding) { 341 v8::ScriptCompiler::StreamedSource::Encoding* encoding) {
342 // Here's a list of encodings we can use for streaming. These are 342 // Here's a list of encodings we can use for streaming. These are
343 // the canonical names. 343 // the canonical names.
344 if (strcmp(encodingName, "windows-1252") == 0 || 344 if (strcmp(encodingName, "windows-1252") == 0 ||
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
516 m_loadingFinished = true; 516 m_loadingFinished = true;
517 517
518 notifyFinishedToClient(); 518 notifyFinishedToClient();
519 } 519 }
520 520
521 ScriptStreamer::ScriptStreamer( 521 ScriptStreamer::ScriptStreamer(
522 PendingScript* script, 522 PendingScript* script,
523 Type scriptType, 523 Type scriptType,
524 ScriptState* scriptState, 524 ScriptState* scriptState,
525 v8::ScriptCompiler::CompileOptions compileOptions, 525 v8::ScriptCompiler::CompileOptions compileOptions,
526 WebTaskRunner* loadingTaskRunner) 526 RefPtr<WebTaskRunner> loadingTaskRunner)
527 : m_pendingScript(script), 527 : m_pendingScript(script),
528 m_resource(script->resource()), 528 m_resource(script->resource()),
529 m_detached(false), 529 m_detached(false),
530 m_stream(0), 530 m_stream(0),
531 m_loadingFinished(false), 531 m_loadingFinished(false),
532 m_parsingFinished(false), 532 m_parsingFinished(false),
533 m_haveEnoughDataForStreaming(false), 533 m_haveEnoughDataForStreaming(false),
534 m_streamingSuppressed(false), 534 m_streamingSuppressed(false),
535 m_compileOptions(compileOptions), 535 m_compileOptions(compileOptions),
536 m_scriptState(scriptState), 536 m_scriptState(scriptState),
537 m_scriptType(scriptType), 537 m_scriptType(scriptType),
538 m_scriptURLString(m_resource->url().copy().getString()), 538 m_scriptURLString(m_resource->url().copy().getString()),
539 m_scriptResourceIdentifier(m_resource->identifier()), 539 m_scriptResourceIdentifier(m_resource->identifier()),
540 // Unfortunately there's no dummy encoding value in the enum; let's use 540 // Unfortunately there's no dummy encoding value in the enum; let's use
541 // one we don't stream. 541 // one we don't stream.
542 m_encoding(v8::ScriptCompiler::StreamedSource::TWO_BYTE), 542 m_encoding(v8::ScriptCompiler::StreamedSource::TWO_BYTE),
543 m_loadingTaskRunner(loadingTaskRunner->clone()) {} 543 m_loadingTaskRunner(std::move(loadingTaskRunner)) {}
544 544
545 ScriptStreamer::~ScriptStreamer() {} 545 ScriptStreamer::~ScriptStreamer() {}
546 546
547 DEFINE_TRACE(ScriptStreamer) { 547 DEFINE_TRACE(ScriptStreamer) {
548 visitor->trace(m_pendingScript); 548 visitor->trace(m_pendingScript);
549 visitor->trace(m_resource); 549 visitor->trace(m_resource);
550 } 550 }
551 551
552 void ScriptStreamer::streamingComplete() { 552 void ScriptStreamer::streamingComplete() {
553 // The background task is completed; do the necessary ramp-down in the main 553 // The background task is completed; do the necessary ramp-down in the main
(...skipping 23 matching lines...) Expand all
577 // completed. Here we also check that we have a client: it can happen that a 577 // completed. Here we also check that we have a client: it can happen that a
578 // function calling notifyFinishedToClient was already scheduled in the task 578 // function calling notifyFinishedToClient was already scheduled in the task
579 // queue and the upper layer decided that it's not interested in the script 579 // queue and the upper layer decided that it's not interested in the script
580 // and called removeClient. 580 // and called removeClient.
581 if (!isFinished()) 581 if (!isFinished())
582 return; 582 return;
583 583
584 m_pendingScript->streamingFinished(); 584 m_pendingScript->streamingFinished();
585 } 585 }
586 586
587 bool ScriptStreamer::startStreamingInternal(PendingScript* script, 587 bool ScriptStreamer::startStreamingInternal(
588 Type scriptType, 588 PendingScript* script,
589 Settings* settings, 589 Type scriptType,
590 ScriptState* scriptState, 590 Settings* settings,
591 WebTaskRunner* loadingTaskRunner) { 591 ScriptState* scriptState,
592 RefPtr<WebTaskRunner> loadingTaskRunner) {
592 DCHECK(isMainThread()); 593 DCHECK(isMainThread());
593 DCHECK(scriptState->contextIsValid()); 594 DCHECK(scriptState->contextIsValid());
594 ScriptResource* resource = script->resource(); 595 ScriptResource* resource = script->resource();
595 if (resource->isLoaded()) { 596 if (resource->isLoaded()) {
596 recordNotStreamingReasonHistogram(scriptType, AlreadyLoaded); 597 recordNotStreamingReasonHistogram(scriptType, AlreadyLoaded);
597 return false; 598 return false;
598 } 599 }
599 if (!resource->url().protocolIsInHTTPFamily()) { 600 if (!resource->url().protocolIsInHTTPFamily()) {
600 recordNotStreamingReasonHistogram(scriptType, NotHTTP); 601 recordNotStreamingReasonHistogram(scriptType, NotHTTP);
601 return false; 602 return false;
(...skipping 13 matching lines...) Expand all
615 // produce parser cache if the non-streaming compile takes advantage of it. 616 // produce parser cache if the non-streaming compile takes advantage of it.
616 v8::ScriptCompiler::CompileOptions compileOption = 617 v8::ScriptCompiler::CompileOptions compileOption =
617 v8::ScriptCompiler::kNoCompileOptions; 618 v8::ScriptCompiler::kNoCompileOptions;
618 if (settings->getV8CacheOptions() == V8CacheOptionsParse) 619 if (settings->getV8CacheOptions() == V8CacheOptionsParse)
619 compileOption = v8::ScriptCompiler::kProduceParserCache; 620 compileOption = v8::ScriptCompiler::kProduceParserCache;
620 621
621 // The Resource might go out of scope if the script is no longer 622 // The Resource might go out of scope if the script is no longer
622 // needed. This makes PendingScript notify the ScriptStreamer when it is 623 // needed. This makes PendingScript notify the ScriptStreamer when it is
623 // destroyed. 624 // destroyed.
624 script->setStreamer(ScriptStreamer::create(script, scriptType, scriptState, 625 script->setStreamer(ScriptStreamer::create(script, scriptType, scriptState,
625 compileOption, loadingTaskRunner)); 626 compileOption,
627 std::move(loadingTaskRunner)));
626 628
627 return true; 629 return true;
628 } 630 }
629 631
630 } // namespace blink 632 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698