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:
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 ¬if)
{
- 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 ¬if = 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;
};