#include "Win32.h"
+// FIXME: Windows does not have reader-writer locks pre-Vista. If you want
+// real reader-writer locks, you a pthreads implementation for Windows.
+
namespace llvm {
using namespace sys;
-RWMutex::RWMutex() {
- data_ = new PSRWLOCK;
- InitializeSRWLock((PSRWLOCK*)data_);
+RWMutexImpl::RWMutexImpl() {
+ data_ = calloc(1, sizeof(CRITICAL_SECTION));
+ InitializeCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
}
-RWMutex::~RWMutex() {
- delete (PSRWLOCK*)data_;
- data_ = 0;
+RWMutexImpl::~RWMutexImpl() {
+ DeleteCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
+ free(data_);
}
-bool RWMutex::reader_acquire() {
- AcquireSRWLockShared((PSRWLOCK*)data_);
+bool RWMutexImpl::reader_acquire() {
+ EnterCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
return true;
}
-bool RWMutex::reader_release() {
- ReleaseSRWLockShared((PSRWLOCK*)data_);
+bool RWMutexImpl::reader_release() {
+ LeaveCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
return true;
}
-bool RWMutex::writer_acquire() {
- AcquireSRWLockExclusive((PSRWLOCK*)data_);
+bool RWMutexImpl::writer_acquire() {
+ EnterCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
return true;
}
-bool RWMutex::writer_release() {
- ReleaseSRWLockExclusive((PSRWLOCK*)data_);
+bool RWMutexImpl::writer_release() {
+ LeaveCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
return true;
}