ThreadingPrimitives.h [plain text]
#ifndef ThreadingPrimitives_h
#define ThreadingPrimitives_h
#include "Platform.h"
#include <wtf/Assertions.h>
#include <wtf/FastAllocBase.h>
#include <wtf/Locker.h>
#include <wtf/Noncopyable.h>
#if OS(WINDOWS)
#include <windows.h>
#endif
#if USE(PTHREADS)
#include <pthread.h>
#elif PLATFORM(GTK)
#include "GOwnPtr.h"
#endif
#if PLATFORM(QT)
#include <qglobal.h>
QT_BEGIN_NAMESPACE
class QMutex;
class QWaitCondition;
QT_END_NAMESPACE
#endif
namespace WTF {
#if USE(PTHREADS)
typedef pthread_mutex_t PlatformMutex;
#if HAVE(PTHREAD_RWLOCK)
typedef pthread_rwlock_t PlatformReadWriteLock;
#else
typedef void* PlatformReadWriteLock;
#endif
typedef pthread_cond_t PlatformCondition;
#elif PLATFORM(GTK)
typedef GOwnPtr<GMutex> PlatformMutex;
typedef void* PlatformReadWriteLock; typedef GOwnPtr<GCond> PlatformCondition;
#elif PLATFORM(QT)
typedef QT_PREPEND_NAMESPACE(QMutex)* PlatformMutex;
typedef void* PlatformReadWriteLock; typedef QT_PREPEND_NAMESPACE(QWaitCondition)* PlatformCondition;
#elif OS(WINDOWS)
struct PlatformMutex {
CRITICAL_SECTION m_internalMutex;
size_t m_recursionCount;
};
typedef void* PlatformReadWriteLock; struct PlatformCondition {
size_t m_waitersGone;
size_t m_waitersBlocked;
size_t m_waitersToUnblock;
HANDLE m_blockLock;
HANDLE m_blockQueue;
HANDLE m_unblockLock;
bool timedWait(PlatformMutex&, DWORD durationMilliseconds);
void signal(bool unblockAll);
};
#else
typedef void* PlatformMutex;
typedef void* PlatformReadWriteLock;
typedef void* PlatformCondition;
#endif
class Mutex {
WTF_MAKE_NONCOPYABLE(Mutex); WTF_MAKE_FAST_ALLOCATED;
public:
Mutex();
~Mutex();
void lock();
bool tryLock();
void unlock();
public:
PlatformMutex& impl() { return m_mutex; }
private:
PlatformMutex m_mutex;
};
typedef Locker<Mutex> MutexLocker;
class ReadWriteLock {
WTF_MAKE_NONCOPYABLE(ReadWriteLock);
public:
ReadWriteLock();
~ReadWriteLock();
void readLock();
bool tryReadLock();
void writeLock();
bool tryWriteLock();
void unlock();
private:
PlatformReadWriteLock m_readWriteLock;
};
class ThreadCondition {
WTF_MAKE_NONCOPYABLE(ThreadCondition);
public:
ThreadCondition();
~ThreadCondition();
void wait(Mutex& mutex);
bool timedWait(Mutex&, double absoluteTime);
void signal();
void broadcast();
private:
PlatformCondition m_condition;
};
#if OS(WINDOWS)
DWORD absoluteTimeToWaitTimeoutInterval(double absoluteTime);
#endif
}
using WTF::Mutex;
using WTF::MutexLocker;
using WTF::ThreadCondition;
#if OS(WINDOWS)
using WTF::absoluteTimeToWaitTimeoutInterval;
#endif
#endif // ThreadingPrimitives_h