blob: 91036db89848c039c3c3e813cb18d3f716aaf58a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
/* ----------------------------------------------------------------------------
---------------------------------------------------------------------------- */
#ifndef __UTSEM_H__
#define __UTSEM_H__
// -------------------------------------------------------------
// INCLUDES
// -------------------------------------------------------------
#include "utilcode.h"
/* ----------------------------------------------------------------------------
@class UTSemReadWrite
An instance of class UTSemReadWrite provides multi-read XOR single-write
(a.k.a. shared vs. exclusive) lock capabilities, with protection against
writer starvation.
A thread MUST NOT call any of the Lock methods if it already holds a Lock.
(Doing so may result in a deadlock.)
---------------------------------------------------------------------------- */
class UTSemReadWrite
{
public:
UTSemReadWrite(); // Constructor
~UTSemReadWrite(); // Destructor
HRESULT Init();
HRESULT LockRead(); // Lock the object for reading
HRESULT LockWrite(); // Lock the object for writing
void UnlockRead(); // Unlock the object for reading
void UnlockWrite(); // Unlock the object for writing
#ifdef _DEBUG
BOOL Debug_IsLockedForRead();
BOOL Debug_IsLockedForWrite();
#endif //_DEBUG
private:
Semaphore * GetReadWaiterSemaphore()
{
return m_pReadWaiterSemaphore;
}
Event * GetWriteWaiterEvent()
{
return m_pWriteWaiterEvent;
}
Volatile<ULONG> m_dwFlag; // internal state, see implementation
Semaphore * m_pReadWaiterSemaphore; // semaphore for awakening read waiters
Event * m_pWriteWaiterEvent; // event for awakening write waiters
}; // class UTSemReadWrite
#endif // __UTSEM_H__
|