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 3 // found in the LICENSE file. 4 5 #include "config.h" 6 #include "bindings/core/v8/ScriptStreamerThread.h" 7 8 #include "bindings/core/v8/ScriptStreamer.h" 9 #include "platform/Task.h" 10 #include "platform/TraceEvent.h" 11 #include "public/platform/Platform.h" 12 #include "wtf/MainThread.h" 13 #include "wtf/PassOwnPtr.h" 14 15 namespace blink { 16 17 static ScriptStreamerThread* s_sharedThread = 0; 18 19 void ScriptStreamerThread::init() 20 { 21 ASSERT(!s_sharedThread); 22 ASSERT(isMainThread()); 23 s_sharedThread = new ScriptStreamerThread(); 24 } 25 26 void ScriptStreamerThread::shutdown() 27 { 28 ASSERT(s_sharedThread); 29 delete s_sharedThread; 30 s_sharedThread = 0; 31 } 32 33 ScriptStreamerThread* ScriptStreamerThread::shared() 34 { 35 return s_sharedThread; 36 } 37 38 void ScriptStreamerThread::postTask(WebThread::Task* task) 39 { 40 ASSERT(isMainThread()); 41 MutexLocker locker(m_mutex); 42 ASSERT(!m_runningTask); 43 m_runningTask = true; 44 platformThread().postTask(task); 45 } 46 47 void ScriptStreamerThread::taskDone() 48 { 49 MutexLocker locker(m_mutex); 50 ASSERT(m_runningTask); 51 m_runningTask = false; 52 } 53 54 blink::WebThread& ScriptStreamerThread::platformThread() 55 { 56 if (!isRunning()) 57 m_thread = adoptPtr(blink::Platform::current()->createThread("ScriptStreamerThread")); 58 return *m_thread; 59 } 60 61 ScriptStreamingTask::ScriptStreamingTask(v8::ScriptCompiler::ScriptStreamingTask* task, ScriptStreamer* streamer) 62 : m_v8Task(adoptPtr(task)), m_streamer(streamer) { } 63 64 void ScriptStreamingTask::run() 65 { 66 TRACE_EVENT0("v8", "v8.parseOnBackground"); 67 // Running the task can and will block: SourceStream::GetSomeData will get 68 // called and it will block and wait for data from the network. 69 m_v8Task->Run(); 70 // Post a task to the main thread to signal that V8 has completed the 71 // streaming. 72 callOnMainThread(WTF::bind(&ScriptStreamer::streamingComplete, m_streamer)); 73 ScriptStreamerThread::shared()->taskDone(); 74 } 75 76 } // namespace blink 77