]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/lib/Support/Windows/RWMutex.inc
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / lib / Support / Windows / RWMutex.inc
1 //= llvm/Support/Win32/Mutex.inc - Win32 Reader/Writer Mutual Exclusion Lock  =//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file implements the Win32 specific (non-pthread) RWMutex class.
11 //
12 //===----------------------------------------------------------------------===//
13
14 //===----------------------------------------------------------------------===//
15 //=== WARNING: Implementation here must contain only generic Win32 code that
16 //===          is guaranteed to work on *all* Win32 variants.
17 //===----------------------------------------------------------------------===//
18
19 #include "Windows.h"
20
21 // FIXME: Windows does not have reader-writer locks pre-Vista.  If you want
22 // real reader-writer locks, you a threads implementation for Windows.
23
24 namespace llvm {
25 using namespace sys;
26
27 RWMutexImpl::RWMutexImpl() {
28   data_ = calloc(1, sizeof(CRITICAL_SECTION));
29   InitializeCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
30 }
31
32 RWMutexImpl::~RWMutexImpl() {
33   DeleteCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
34   free(data_);
35 }
36
37 bool RWMutexImpl::reader_acquire() {
38   EnterCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
39   return true;
40 }
41
42 bool RWMutexImpl::reader_release() {
43   LeaveCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
44   return true;
45 }
46
47 bool RWMutexImpl::writer_acquire() {
48   EnterCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
49   return true;
50 }
51
52 bool RWMutexImpl::writer_release() {
53   LeaveCriticalSection(static_cast<LPCRITICAL_SECTION>(data_));
54   return true;
55 }
56
57
58 }