ThreadingPrimitives.h [plain text]
#ifndef ThreadingPrimitives_h
#define ThreadingPrimitives_h
#include <wtf/FastMalloc.h>
#include <wtf/Locker.h>
#include <wtf/Noncopyable.h>
#include <wtf/WallTime.h>
#if OS(WINDOWS)
#include <windows.h>
#endif
#if USE(PTHREADS)
#include <pthread.h>
#endif
namespace WTF {
using ThreadFunction = void (*)(void* argument);
#if USE(PTHREADS)
using PlatformThreadHandle = pthread_t;
using PlatformMutex = pthread_mutex_t;
using PlatformCondition = pthread_cond_t;
#elif OS(WINDOWS)
using ThreadIdentifier = uint32_t;
using PlatformThreadHandle = HANDLE;
using PlatformMutex = SRWLOCK;
using PlatformCondition = CONDITION_VARIABLE;
#else
#error "Not supported platform"
#endif
class Mutex {
WTF_MAKE_NONCOPYABLE(Mutex);
WTF_MAKE_FAST_ALLOCATED;
public:
constexpr Mutex() = default;
WTF_EXPORT_PRIVATE ~Mutex();
WTF_EXPORT_PRIVATE void lock();
WTF_EXPORT_PRIVATE bool tryLock();
WTF_EXPORT_PRIVATE void unlock();
PlatformMutex& impl() { return m_mutex; }
private:
#if USE(PTHREADS)
PlatformMutex m_mutex = PTHREAD_MUTEX_INITIALIZER;
#elif OS(WINDOWS)
PlatformMutex m_mutex = SRWLOCK_INIT;
#endif
};
typedef Locker<Mutex> MutexLocker;
class ThreadCondition {
WTF_MAKE_NONCOPYABLE(ThreadCondition);
WTF_MAKE_FAST_ALLOCATED;
public:
constexpr ThreadCondition() = default;
WTF_EXPORT_PRIVATE ~ThreadCondition();
WTF_EXPORT_PRIVATE void wait(Mutex& mutex);
WTF_EXPORT_PRIVATE bool timedWait(Mutex&, WallTime absoluteTime);
WTF_EXPORT_PRIVATE void signal();
WTF_EXPORT_PRIVATE void broadcast();
private:
#if USE(PTHREADS)
PlatformCondition m_condition = PTHREAD_COND_INITIALIZER;
#elif OS(WINDOWS)
PlatformCondition m_condition = CONDITION_VARIABLE_INIT;
#endif
};
}
using WTF::Mutex;
using WTF::MutexLocker;
using WTF::ThreadCondition;
#endif // ThreadingPrimitives_h