// // Copyright 2016 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // WorkerThread: // Task running thread for ANGLE, similar to a TaskRunner in Chromium. // Might be implemented differently depending on platform. // #include "libANGLE/WorkerThread.h" namespace angle { namespace priv { // SingleThreadedWorkerPool implementation. SingleThreadedWorkerPool::SingleThreadedWorkerPool(size_t maxThreads) : WorkerThreadPoolBase(maxThreads) { } SingleThreadedWorkerPool::~SingleThreadedWorkerPool() { } SingleThreadedWaitableEvent SingleThreadedWorkerPool::postWorkerTaskImpl(Closure *task) { (*task)(); return SingleThreadedWaitableEvent(EventResetPolicy::Automatic, EventInitialState::Signaled); } // SingleThreadedWaitableEvent implementation. SingleThreadedWaitableEvent::SingleThreadedWaitableEvent() : SingleThreadedWaitableEvent(EventResetPolicy::Automatic, EventInitialState::NonSignaled) { } SingleThreadedWaitableEvent::SingleThreadedWaitableEvent(EventResetPolicy resetPolicy, EventInitialState initialState) : WaitableEventBase(resetPolicy, initialState) { } SingleThreadedWaitableEvent::~SingleThreadedWaitableEvent() { } SingleThreadedWaitableEvent::SingleThreadedWaitableEvent(SingleThreadedWaitableEvent &&other) : WaitableEventBase(std::move(other)) { } SingleThreadedWaitableEvent &SingleThreadedWaitableEvent::operator=( SingleThreadedWaitableEvent &&other) { return copyBase(std::move(other)); } void SingleThreadedWaitableEvent::resetImpl() { mSignaled = false; } void SingleThreadedWaitableEvent::waitImpl() { } void SingleThreadedWaitableEvent::signalImpl() { mSignaled = true; } #if (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED) // AsyncWorkerPool implementation. AsyncWorkerPool::AsyncWorkerPool(size_t maxThreads) : WorkerThreadPoolBase(maxThreads) { } AsyncWorkerPool::~AsyncWorkerPool() { } AsyncWaitableEvent AsyncWorkerPool::postWorkerTaskImpl(Closure *task) { auto future = std::async(std::launch::async, [task] { (*task)(); }); AsyncWaitableEvent waitable(EventResetPolicy::Automatic, EventInitialState::NonSignaled); waitable.setFuture(std::move(future)); return waitable; } // AsyncWaitableEvent implementation. AsyncWaitableEvent::AsyncWaitableEvent() : AsyncWaitableEvent(EventResetPolicy::Automatic, EventInitialState::NonSignaled) { } AsyncWaitableEvent::AsyncWaitableEvent(EventResetPolicy resetPolicy, EventInitialState initialState) : WaitableEventBase(resetPolicy, initialState) { } AsyncWaitableEvent::~AsyncWaitableEvent() { } AsyncWaitableEvent::AsyncWaitableEvent(AsyncWaitableEvent &&other) : WaitableEventBase(std::move(other)), mFuture(std::move(other.mFuture)) { } AsyncWaitableEvent &AsyncWaitableEvent::operator=(AsyncWaitableEvent &&other) { std::swap(mFuture, other.mFuture); return copyBase(std::move(other)); } void AsyncWaitableEvent::setFuture(std::future &&future) { mFuture = std::move(future); } void AsyncWaitableEvent::resetImpl() { mSignaled = false; mFuture = std::future(); } void AsyncWaitableEvent::waitImpl() { if (mSignaled || !mFuture.valid()) { return; } mFuture.wait(); signal(); } void AsyncWaitableEvent::signalImpl() { mSignaled = true; if (mResetPolicy == EventResetPolicy::Automatic) { reset(); } } #endif // (ANGLE_STD_ASYNC_WORKERS == ANGLE_ENABLED) } // namespace priv } // namespace angle