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