Menu

[r66]: / trunk / src / RWSection.cpp  Maximize  Restore  History

Download this file

121 lines (100 with data), 1.9 kB

  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
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "StdAfx.h"
#include "RWSection.h"
CRWSection::CRWSection()
{
m_nWaitingReaders = m_nWaitingWriters = m_nActive = 0;
m_hReaders = CreateSemaphore(NULL, 0, MAXLONG, NULL);
m_hWriters = CreateSemaphore(NULL, 0, MAXLONG, NULL);
InitializeCriticalSection(&m_cs);
}
CRWSection::~CRWSection()
{
#ifdef _DEBUG
if (m_nActive != 0)
DebugBreak();
#endif
m_nWaitingReaders = m_nWaitingWriters = m_nActive = 0;
DeleteCriticalSection(&m_cs);
CloseHandle(m_hWriters);
CloseHandle(m_hReaders);
}
void CRWSection::WaitToRead()
{
EnterCriticalSection(&m_cs);
// Writers have priority
BOOL fResourceWritePending = (m_nWaitingWriters || (m_nActive < 0));
if (fResourceWritePending)
{
m_nWaitingReaders++;
}
else
{
m_nActive++;
}
LeaveCriticalSection(&m_cs);
if (fResourceWritePending)
{
// wait until writer is finished
WaitForSingleObject(m_hReaders, INFINITE);
}
}
void CRWSection::WaitToWrite()
{
EnterCriticalSection(&m_cs);
BOOL fResourceOwned = (m_nActive != 0);
if (fResourceOwned)
{
m_nWaitingWriters++;
}
else
{
m_nActive = -1;
}
LeaveCriticalSection(&m_cs);
if (fResourceOwned)
{
WaitForSingleObject(m_hWriters, INFINITE);
}
}
void CRWSection::Done()
{
EnterCriticalSection(&m_cs);
if (m_nActive > 0)
{
m_nActive--;
}
else
{
m_nActive++;
}
HANDLE hsem = NULL;
LONG lCount = 1;
if (m_nActive == 0)
{
// Note: If there are always writers waiting, then
// it's possible that a reader never get's access
// (reader starvation)
if (m_nWaitingWriters > 0)
{
m_nActive = -1;
m_nWaitingWriters--;
hsem = m_hWriters;
}
else if (m_nWaitingReaders > 0)
{
m_nActive = m_nWaitingReaders;
m_nWaitingReaders = 0;
hsem = m_hReaders;
lCount = m_nActive;
}
else
{
// no threads waiting, nothing to do
}
}
LeaveCriticalSection(&m_cs);
if (hsem != NULL)
{
ReleaseSemaphore(hsem, lCount, NULL);
}
}
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.