17242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 27242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// Use of this source code is governed by a BSD-style license that can be 37242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// found in the LICENSE file. 47242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 57242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "config.h" 67242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/ScriptStreamerThread.h" 77242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/ScriptStreamer.h" 97242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/Task.h" 107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "platform/TraceEvent.h" 117242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/Platform.h" 127242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "wtf/MainThread.h" 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "wtf/PassOwnPtr.h" 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace blink { 167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccistatic ScriptStreamerThread* s_sharedThread = 0; 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ScriptStreamerThread::init() 207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!s_sharedThread); 227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(isMainThread()); 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s_sharedThread = new ScriptStreamerThread(); 247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ScriptStreamerThread::shutdown() 277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(s_sharedThread); 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci delete s_sharedThread; 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci s_sharedThread = 0; 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciScriptStreamerThread* ScriptStreamerThread::shared() 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return s_sharedThread; 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ScriptStreamerThread::postTask(WebThread::Task* task) 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(isMainThread()); 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci MutexLocker locker(m_mutex); 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(!m_runningTask); 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_runningTask = true; 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci platformThread().postTask(task); 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ScriptStreamerThread::taskDone() 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci MutexLocker locker(m_mutex); 507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ASSERT(m_runningTask); 517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_runningTask = false; 527242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 547242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciblink::WebThread& ScriptStreamerThread::platformThread() 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!isRunning()) 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_thread = adoptPtr(blink::Platform::current()->createThread("ScriptStreamerThread")); 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return *m_thread; 597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciScriptStreamingTask::ScriptStreamingTask(v8::ScriptCompiler::ScriptStreamingTask* task, ScriptStreamer* streamer) 627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci : m_v8Task(adoptPtr(task)), m_streamer(streamer) { } 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid ScriptStreamingTask::run() 657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci TRACE_EVENT0("v8", "v8.parseOnBackground"); 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Running the task can and will block: SourceStream::GetSomeData will get 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // called and it will block and wait for data from the network. 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci m_v8Task->Run(); 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Post a task to the main thread to signal that V8 has completed the 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // streaming. 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci callOnMainThread(WTF::bind(&ScriptStreamer::streamingComplete, m_streamer)); 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ScriptStreamerThread::shared()->taskDone(); 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace blink 77