Added Italian language pack
[TortoiseGit.git] / src / Git / SharedMutex.cpp
blobf0463130e19812aa42ebc31a8acb313649f11010
1 /**
2 * SharedMutex.cpp
3 * @Author Tu Yongce <yongce (at) 126 (dot) com>
4 * @Created 2008-11-17
5 * @Modified 2008-11-17
6 * @Version 0.1
7 */
8 #include "stdafx.h"
9 #include "SharedMutex.h"
12 SharedMutex::SharedMutex(): m_sharedNum(0), m_exclusiveNum(0), m_lockType(LOCK_NONE), m_mutex(0), m_sharedEvent(0),m_exclusiveEvent(0)
16 SharedMutex::~SharedMutex()
20 void SharedMutex::Release()
22 if (m_mutex)
24 ::CloseHandle(m_mutex);
25 m_mutex = NULL;
27 if (m_sharedEvent)
29 ::CloseHandle(m_sharedEvent);
30 m_sharedEvent = NULL;
32 if (m_exclusiveEvent)
34 ::CloseHandle(m_exclusiveEvent);
35 m_exclusiveEvent = NULL;
38 void SharedMutex::Init()
40 m_sharedNum = m_exclusiveNum = 0;
41 m_lockType = LOCK_NONE;
43 // ´´½¨ÓÃÓÚ±£»¤ÄÚ²¿Êý¾ÝµÄ»¥³âÁ¿
44 m_mutex = ::CreateMutex(NULL, FALSE, NULL);
45 // ´´½¨ÓÃÓÚͬ²½¹²Ïí·ÃÎÊÏ̵߳Äʼþ£¨ÊÖ¶¯Ê¼þ£©
46 m_sharedEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
47 // ´´½¨ÓÃÓÚͬ²½¶ÀÕ¼·ÃÎÊÏ̵߳Äʼþ£¨×Ô¶¯Ê¼þ£©
48 m_exclusiveEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
51 // »ñÈ¡¹²Ïí·ÃÎÊȨ
52 bool SharedMutex::AcquireShared(DWORD waitTime)
54 ::WaitForSingleObject(m_mutex, INFINITE);
55 ++m_sharedNum;
56 if (m_lockType == LOCK_EXCLUSIVE) {
57 DWORD retCode = ::SignalObjectAndWait(m_mutex, m_sharedEvent, waitTime, FALSE);
58 if (retCode == WAIT_OBJECT_0) {
59 return true;
60 } else {
61 if (retCode == WAIT_TIMEOUT)
62 ::SetLastError(WAIT_TIMEOUT);
63 return false;
66 m_lockType = LOCK_SHARED;
67 ::ReleaseMutex(m_mutex);
68 return true;
71 // ÊͷŹ²Ïí·ÃÎÊȨ
72 void SharedMutex::ReleaseShared()
74 //assert(m_lockType == LOCK_SHARED);
75 ::WaitForSingleObject(m_mutex, INFINITE);
76 --m_sharedNum;
77 if (m_sharedNum == 0) {
78 if (m_exclusiveNum > 0) {
79 // »½ÐÑÒ»¸ö¶ÀÕ¼·ÃÎÊÏß³Ì
80 m_lockType = LOCK_EXCLUSIVE;
81 ::SetEvent(m_exclusiveEvent);
82 } else {
83 // ûÓеȴýÏß³Ì
84 m_lockType = LOCK_NONE;
87 ::ReleaseMutex(m_mutex);
90 // »ñÈ¡¶ÀÕ¼·ÃÎÊȨ
91 bool SharedMutex::AcquireExclusive(DWORD waitTime)
94 ::WaitForSingleObject(m_mutex, INFINITE);
95 ++m_exclusiveNum;
96 if (m_lockType != LOCK_NONE) {
97 DWORD retCode = ::SignalObjectAndWait(m_mutex, m_exclusiveEvent, waitTime, FALSE);
98 if (retCode == WAIT_OBJECT_0) {
99 return true;
100 } else {
101 if (retCode == WAIT_TIMEOUT)
102 ::SetLastError(WAIT_TIMEOUT);
103 return false;
106 m_lockType = LOCK_EXCLUSIVE;
107 ::ReleaseMutex(m_mutex);
108 return true;
111 // ÊͷŶÀÕ¼·ÃÎÊȨ
112 void SharedMutex::ReleaseExclusive()
114 // assert(m_lockType == LOCK_EXCLUSIVE);
115 ::WaitForSingleObject(m_mutex, INFINITE);
116 --m_exclusiveNum;
117 // ¶ÀÕ¼·ÃÎÊÏß³ÌÓÅÏÈ
118 if (m_exclusiveNum > 0) {
119 // »½ÐÑÒ»¸ö¶ÀÕ¼·ÃÎÊÏß³Ì
120 ::SetEvent(m_exclusiveEvent);
121 } else if (m_sharedNum > 0) {
122 // »½Ðѵ±Ç°ËùÓй²Ïí·ÃÎÊÏß³Ì
123 m_lockType = LOCK_SHARED;
124 ::PulseEvent(m_sharedEvent);
125 } else {
126 // ûÓеȴýÏß³Ì
127 m_lockType = LOCK_NONE;
129 ::ReleaseMutex(m_mutex);