reapack

Package manager for REAPER
Log | Files | Refs | Submodules | README | LICENSE

commit b32d2bbc261467edc39067f48650c800a2736e05
parent f6dd512665e9151041f72e5fb4fcb9674c8e902e
Author: cfillion <cfillion@users.noreply.github.com>
Date:   Sun, 12 Aug 2018 22:10:40 -0400

migrate to standard library threads

Diffstat:
Msrc/download.cpp | 6+++---
Msrc/thread.cpp | 33++++++++++++---------------------
Msrc/thread.hpp | 17++++++-----------
3 files changed, 21 insertions(+), 35 deletions(-)

diff --git a/src/download.cpp b/src/download.cpp @@ -29,16 +29,16 @@ static const int DOWNLOAD_TIMEOUT = 15; // the m_pool member in ThreadPool (thread.hpp) static CURLSH *g_curlShare = nullptr; -static WDL_Mutex g_curlMutex; +static mutex g_curlMutex; static void LockCurlMutex(CURL *, curl_lock_data, curl_lock_access, void *) { - g_curlMutex.Enter(); + g_curlMutex.lock(); } static void UnlockCurlMutex(CURL *, curl_lock_data, curl_lock_access, void *) { - g_curlMutex.Leave(); + g_curlMutex.unlock(); } void DownloadContext::GlobalInit() diff --git a/src/thread.cpp b/src/thread.cpp @@ -85,31 +85,22 @@ void ThreadTask::exec() ThreadNotifier::get()->notify({this, state}); }; -WorkerThread::WorkerThread() : m_exit(false) +WorkerThread::WorkerThread() : m_thread(&WorkerThread::run, this), m_exit(false) { - m_wake = CreateEvent(nullptr, true, false, nullptr); - m_thread = CreateThread(nullptr, 0, [](void *ptr) -> DWORD { - static_cast<WorkerThread *>(ptr)->run(); - return 0; - }, static_cast<void *>(this), 0, nullptr); } WorkerThread::~WorkerThread() { m_exit = true; - SetEvent(m_wake); - - WaitForSingleObject(m_thread, INFINITE); - - CloseHandle(m_wake); - CloseHandle(m_thread); + m_wake.notify_one(); + m_thread.join(); } void WorkerThread::run() { DownloadContext context; - while(!m_exit) { + do { while(ThreadTask *task = nextTask()) { if(auto dl = dynamic_cast<Download *>(task)) dl->setContext(&context); @@ -117,14 +108,14 @@ void WorkerThread::run() task->exec(); } - ResetEvent(m_wake); - WaitForSingleObject(m_wake, INFINITE); - } + unique_lock<mutex> lock(m_mutex); + m_wake.wait(lock); + } while(!m_exit); } ThreadTask *WorkerThread::nextTask() { - WDL_MutexLock lock(&m_mutex); + lock_guard<mutex> guard(m_mutex); if(m_queue.empty()) return nullptr; @@ -136,11 +127,11 @@ ThreadTask *WorkerThread::nextTask() void WorkerThread::push(ThreadTask *task) { - WDL_MutexLock lock(&m_mutex); + lock_guard<mutex> guard(m_mutex); task->setState(ThreadTask::Queued); m_queue.push(task); - SetEvent(m_wake); + m_wake.notify_one(); } ThreadPool::~ThreadPool() @@ -204,7 +195,7 @@ void ThreadNotifier::stop() void ThreadNotifier::notify(const Notification &notif) { - WDL_MutexLock lock(&m_mutex); + lock_guard<mutex> guard(m_mutex); m_queue.push(notif); } @@ -225,7 +216,7 @@ void ThreadNotifier::tick() void ThreadNotifier::processQueue() { - WDL_MutexLock lock(&m_mutex); + lock_guard<mutex> guard(m_mutex); while(!m_queue.empty()) { const Notification &notif = m_queue.front(); diff --git a/src/thread.hpp b/src/thread.hpp @@ -22,18 +22,13 @@ #include <array> #include <atomic> +#include <condition_variable> #include <functional> #include <queue> +#include <thread> #include <unordered_set> #include <boost/signals2.hpp> -#include <WDL/mutex.h> - -#ifdef _WIN32 -# include <windows.h> -#else -# include <swell-types.h> -#endif class ThreadTask { public: @@ -94,10 +89,10 @@ private: void run(); ThreadTask *nextTask(); - HANDLE m_wake; - HANDLE m_thread; + std::thread m_thread; + std::condition_variable m_wake; + std::mutex m_mutex; std::atomic_bool m_exit; - WDL_Mutex m_mutex; std::queue<ThreadTask *> m_queue; }; @@ -149,7 +144,7 @@ private: ~ThreadNotifier() = default; void processQueue(); - WDL_Mutex m_mutex; + std::mutex m_mutex; size_t m_active; std::queue<Notification> m_queue; };