pulled latest translations from Transifex
[TortoiseGit.git] / src / Git / SharedMutex.cpp
blobc290db90a4c777e98f683b1d417d402ae365c62f
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)
17 SharedMutex::~SharedMutex()
22 void SharedMutex::Release()
24 ::CloseHandle(m_mutex);
25 ::CloseHandle(m_sharedEvent);
26 ::CloseHandle(m_exclusiveEvent);
28 void SharedMutex::Init()
30 m_sharedNum = m_exclusiveNum = 0;
31 m_lockType = LOCK_NONE;
33 // ´´½¨ÓÃÓÚ±£»¤ÄÚ²¿Êý¾ÝµÄ»¥³âÁ¿
34 m_mutex = ::CreateMutex(NULL, FALSE, NULL);
35 // ´´½¨ÓÃÓÚͬ²½¹²Ïí·ÃÎÊÏ̵߳Äʼþ£¨ÊÖ¶¯Ê¼þ£©
36 m_sharedEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
37 // ´´½¨ÓÃÓÚͬ²½¶ÀÕ¼·ÃÎÊÏ̵߳Äʼþ£¨×Ô¶¯Ê¼þ£©
38 m_exclusiveEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
41 // »ñÈ¡¹²Ïí·ÃÎÊȨ
42 bool SharedMutex::AcquireShared(DWORD waitTime)
44 ::WaitForSingleObject(m_mutex, INFINITE);
45 ++m_sharedNum;
46 if (m_lockType == LOCK_EXCLUSIVE) {
47 DWORD retCode = ::SignalObjectAndWait(m_mutex, m_sharedEvent, waitTime, FALSE);
48 if (retCode == WAIT_OBJECT_0) {
49 return true;
50 } else {
51 if (retCode == WAIT_TIMEOUT)
52 ::SetLastError(WAIT_TIMEOUT);
53 return false;
56 m_lockType = LOCK_SHARED;
57 ::ReleaseMutex(m_mutex);
58 return true;
61 // ÊͷŹ²Ïí·ÃÎÊȨ
62 void SharedMutex::ReleaseShared()
64 //assert(m_lockType == LOCK_SHARED);
65 ::WaitForSingleObject(m_mutex, INFINITE);
66 --m_sharedNum;
67 if (m_sharedNum == 0) {
68 if (m_exclusiveNum > 0) {
69 // »½ÐÑÒ»¸ö¶ÀÕ¼·ÃÎÊÏß³Ì
70 m_lockType = LOCK_EXCLUSIVE;
71 ::SetEvent(m_exclusiveEvent);
72 } else {
73 // ûÓеȴýÏß³Ì
74 m_lockType = LOCK_NONE;
77 ::ReleaseMutex(m_mutex);
80 // »ñÈ¡¶ÀÕ¼·ÃÎÊȨ
81 bool SharedMutex::AcquireExclusive(DWORD waitTime)
84 ::WaitForSingleObject(m_mutex, INFINITE);
85 ++m_exclusiveNum;
86 if (m_lockType != LOCK_NONE) {
87 DWORD retCode = ::SignalObjectAndWait(m_mutex, m_exclusiveEvent, waitTime, FALSE);
88 if (retCode == WAIT_OBJECT_0) {
89 return true;
90 } else {
91 if (retCode == WAIT_TIMEOUT)
92 ::SetLastError(WAIT_TIMEOUT);
93 return false;
96 m_lockType = LOCK_EXCLUSIVE;
97 ::ReleaseMutex(m_mutex);
98 return true;
101 // ÊͷŶÀÕ¼·ÃÎÊȨ
102 void SharedMutex::ReleaseExclusive()
104 // assert(m_lockType == LOCK_EXCLUSIVE);
105 ::WaitForSingleObject(m_mutex, INFINITE);
106 --m_exclusiveNum;
107 // ¶ÀÕ¼·ÃÎÊÏß³ÌÓÅÏÈ
108 if (m_exclusiveNum > 0) {
109 // »½ÐÑÒ»¸ö¶ÀÕ¼·ÃÎÊÏß³Ì
110 ::SetEvent(m_exclusiveEvent);
111 } else if (m_sharedNum > 0) {
112 // »½Ðѵ±Ç°ËùÓй²Ïí·ÃÎÊÏß³Ì
113 m_lockType = LOCK_SHARED;
114 ::PulseEvent(m_sharedEvent);
115 } else {
116 // ûÓеȴýÏß³Ì
117 m_lockType = LOCK_NONE;
119 ::ReleaseMutex(m_mutex);