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
|
/*
* XBMC Media Center
* Copyright (c) 2002 Frodo
* Portions Copyright (c) by the authors of ffmpeg and xvid
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "SingleLock.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSingleLock::CSingleLock(CCriticalSection& cs)
: m_cs( cs )
, m_bIsOwner( false )
{
Enter();
}
CSingleLock::CSingleLock(const CCriticalSection& cs)
: m_cs( const_cast<CCriticalSection&>(cs) )
, m_bIsOwner( false )
{
Enter();
}
CSingleLock::~CSingleLock()
{
Leave();
}
bool CSingleLock::IsOwner() const
{
return m_bIsOwner;
}
bool CSingleLock::Enter()
{
// Test if we already own the critical section
if ( true == m_bIsOwner )
{
return true;
}
// Blocking call
::EnterCriticalSection( m_cs );
m_bIsOwner = true;
return m_bIsOwner;
}
void CSingleLock::Leave()
{
if ( false == m_bIsOwner )
{
return ;
}
::LeaveCriticalSection( m_cs );
m_bIsOwner = false;
}
CSingleExit::CSingleExit(CCriticalSection& cs)
: m_cs( cs )
, m_count(0)
{
Exit();
}
CSingleExit::CSingleExit(const CCriticalSection& cs)
: m_cs(const_cast<CCriticalSection&>(cs))
, m_count(0)
{
Exit();
}
CSingleExit::~CSingleExit()
{
Restore();
}
void CSingleExit::Exit()
{
if(m_count == 0)
m_count = ::ExitCriticalSection(m_cs);
}
void CSingleExit::Restore()
{
if(m_count)
{
RestoreCriticalSection(m_cs, m_count);
m_count = 0;
}
}
|