// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CompositorWorkerManager_h
#define CompositorWorkerManager_h

#include "modules/ModulesExport.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/ThreadingPrimitives.h"
#include <v8.h>

namespace blink {

class V8IsolateInterruptor;
class WebThread;
class WebThreadSupportingGC;

class MODULES_EXPORT CompositorWorkerManager final {
    USING_FAST_MALLOC(CompositorWorkerManager);
public:
    static void initialize();
    static void shutdown();

    static CompositorWorkerManager* instance();

    // Returns the thread used for compositor workers. This creates a new thread if a
    // thread doesn't already exist.
    WebThreadSupportingGC& compositorWorkerThread();

    // Attempts to initialize/shutdown a thread if necessary. Does nothing if the thread
    // is already initialized, or if the thread has more than one active workers at the
    // time of shutdown.
    void initializeBackingThread();
    void shutdownBackingThread();

    v8::Isolate* initializeIsolate();
    void willDestroyIsolate();
    void destroyIsolate();
    void terminateV8Execution();

private:
    friend class CompositorWorkerManagerTest;

    CompositorWorkerManager();
    ~CompositorWorkerManager();

    Mutex m_mutex;
    OwnPtr<WebThreadSupportingGC> m_thread;
    OwnPtr<WebThread> m_platformThread;
    int m_workerCount = 0;
    v8::Isolate* m_isolate = nullptr;
};

} // namespace blink

#endif // CompositorWorkerManager_h
