1+ #include " pch.h"
2+ #include " ModuleHelp_Locker.h"
3+ /* *******************************************************************
4+ // Created: 2022/08/15 16:11:12
5+ // File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Locker\ModuleHelp_Locker.cpp
6+ // File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Locker
7+ // File Base: ModuleHelp_Locker
8+ // File Ext: cpp
9+ // Project: XEngine(网络通信引擎)
10+ // Author: qyt
11+ // Purpose: 分布式锁
12+ // History:
13+ *********************************************************************/
14+ CModuleHelp_Locker::CModuleHelp_Locker ()
15+ {
16+ }
17+ CModuleHelp_Locker::~CModuleHelp_Locker ()
18+ {
19+
20+ }
21+ // ////////////////////////////////////////////////////////////////////////
22+ // 公有函数
23+ // ////////////////////////////////////////////////////////////////////////
24+ /* *******************************************************************
25+ 函数名称:ModuleHelp_Locker_Create
26+ 函数功能:创建锁
27+ 参数.一:pxhToken
28+ In/Out:Out
29+ 类型:句柄
30+ 可空:N
31+ 意思:输出创建的锁句柄,并且会打开这个锁
32+ 返回值
33+ 类型:逻辑型
34+ 意思:是否成功
35+ 备注:
36+ *********************************************************************/
37+ BOOL CModuleHelp_Locker::ModuleHelp_Locker_Create (XNETHANDLE* pxhToken)
38+ {
39+ ModuleHelp_IsErrorOccur = FALSE ;
40+
41+ if (NULL == pxhToken)
42+ {
43+ ModuleHelp_IsErrorOccur = TRUE ;
44+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_PARAMENT;
45+ return FALSE ;
46+ }
47+ MODULEHELP_LOCKINFO *pSt_LockInfo = new MODULEHELP_LOCKINFO;
48+ if (NULL == pSt_LockInfo)
49+ {
50+ ModuleHelp_IsErrorOccur = TRUE ;
51+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_MALLOC;
52+ return FALSE ;
53+ }
54+ pSt_LockInfo->enLockStatus = ENUM_MODULEHELP_LOCKSTATUS_NOTUSED;
55+
56+ BaseLib_OperatorHandle_Create (pxhToken);
57+
58+ st_Locker.lock ();
59+ stl_MapLocker.insert (make_pair (*pxhToken, pSt_LockInfo));
60+ st_Locker.unlock ();
61+ return TRUE ;
62+ }
63+ /* *******************************************************************
64+ 函数名称:ModuleHelp_Locker_OPen
65+ 函数功能:打开一个锁
66+ 参数.一:xhToken
67+ In/Out:In
68+ 类型:锁句柄
69+ 可空:N
70+ 意思:输入要操作的锁
71+ 返回值
72+ 类型:逻辑型
73+ 意思:是否成功
74+ 备注:
75+ *********************************************************************/
76+ BOOL CModuleHelp_Locker::ModuleHelp_Locker_OPen (XNETHANDLE xhToken)
77+ {
78+ ModuleHelp_IsErrorOccur = FALSE ;
79+
80+ // 看看存在不存在
81+ st_Locker.lock_shared ();
82+ auto stl_MapIterator = stl_MapLocker.find (xhToken);
83+ if (stl_MapIterator != stl_MapLocker.end ())
84+ {
85+ ModuleHelp_IsErrorOccur = TRUE ;
86+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_EXIST;
87+ st_Locker.unlock_shared ();
88+ return FALSE ;
89+ }
90+ st_Locker.unlock_shared ();
91+ // 不存在插入
92+ MODULEHELP_LOCKINFO* pSt_LockInfo = new MODULEHELP_LOCKINFO;
93+ if (NULL == pSt_LockInfo)
94+ {
95+ ModuleHelp_IsErrorOccur = TRUE ;
96+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_MALLOC;
97+ return FALSE ;
98+ }
99+ pSt_LockInfo->enLockStatus = ENUM_MODULEHELP_LOCKSTATUS_NOTUSED;
100+
101+ st_Locker.lock ();
102+ stl_MapLocker.insert (make_pair (xhToken, pSt_LockInfo));
103+ st_Locker.unlock ();
104+ return TRUE ;
105+ }
106+ /* *******************************************************************
107+ 函数名称:ModuleHelp_Locker_ReadLock
108+ 函数功能:读加锁
109+ 参数.一:xhToken
110+ In/Out:In
111+ 类型:锁句柄
112+ 可空:N
113+ 意思:输入要操作的锁
114+ 返回值
115+ 类型:逻辑型
116+ 意思:是否成功
117+ 备注:
118+ *********************************************************************/
119+ BOOL CModuleHelp_Locker::ModuleHelp_Locker_ReadLock (XNETHANDLE xhToken)
120+ {
121+ ModuleHelp_IsErrorOccur = FALSE ;
122+
123+ // 看看存在不存在
124+ st_Locker.lock_shared ();
125+ auto stl_MapIterator = stl_MapLocker.find (xhToken);
126+ if (stl_MapIterator == stl_MapLocker.end ())
127+ {
128+ ModuleHelp_IsErrorOccur = TRUE ;
129+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_NOTFOUND;
130+ st_Locker.unlock_shared ();
131+ return FALSE ;
132+ }
133+ // 判断锁状态,如果是写,返回错误
134+ if (ENUM_MODULEHELP_LOCKSTATUS_WRITE == stl_MapIterator->second ->enLockStatus )
135+ {
136+ ModuleHelp_IsErrorOccur = TRUE ;
137+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_LOCKED;
138+ st_Locker.unlock_shared ();
139+ return FALSE ;
140+ }
141+ // 没有加锁,开始加锁
142+ stl_MapIterator->second ->enLockStatus = ENUM_MODULEHELP_LOCKSTATUS_READ;
143+
144+ st_Locker.unlock_shared ();
145+ return TRUE ;
146+ }
147+ /* *******************************************************************
148+ 函数名称:ModuleHelp_Locker_ReadUNLock
149+ 函数功能:读解锁
150+ 参数.一:xhToken
151+ In/Out:In
152+ 类型:锁句柄
153+ 可空:N
154+ 意思:输入要操作的锁
155+ 返回值
156+ 类型:逻辑型
157+ 意思:是否成功
158+ 备注:
159+ *********************************************************************/
160+ BOOL CModuleHelp_Locker::ModuleHelp_Locker_ReadUNLock (XNETHANDLE xhToken)
161+ {
162+ ModuleHelp_IsErrorOccur = FALSE ;
163+
164+ // 看看存在不存在
165+ st_Locker.lock_shared ();
166+ auto stl_MapIterator = stl_MapLocker.find (xhToken);
167+ if (stl_MapIterator == stl_MapLocker.end ())
168+ {
169+ ModuleHelp_IsErrorOccur = TRUE ;
170+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_NOTFOUND;
171+ st_Locker.unlock_shared ();
172+ return FALSE ;
173+ }
174+ // 是不是READ锁定,不是返回错误
175+ if (ENUM_MODULEHELP_LOCKSTATUS_READ != stl_MapIterator->second ->enLockStatus )
176+ {
177+ ModuleHelp_IsErrorOccur = TRUE ;
178+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_STATUS;
179+ st_Locker.unlock_shared ();
180+ return FALSE ;
181+ }
182+ stl_MapIterator->second ->enLockStatus = ENUM_MODULEHELP_LOCKSTATUS_NOTUSED;
183+
184+ st_Locker.unlock_shared ();
185+ return TRUE ;
186+ }
187+ /* *******************************************************************
188+ 函数名称:ModuleHelp_Locker_WriteLock
189+ 函数功能:写加锁
190+ 参数.一:xhToken
191+ In/Out:In
192+ 类型:锁句柄
193+ 可空:N
194+ 意思:输入要操作的锁
195+ 返回值
196+ 类型:逻辑型
197+ 意思:是否成功
198+ 备注:
199+ *********************************************************************/
200+ BOOL CModuleHelp_Locker::ModuleHelp_Locker_WriteLock (XNETHANDLE xhToken)
201+ {
202+ ModuleHelp_IsErrorOccur = FALSE ;
203+
204+ // 看看存在不存在
205+ st_Locker.lock_shared ();
206+ auto stl_MapIterator = stl_MapLocker.find (xhToken);
207+ if (stl_MapIterator == stl_MapLocker.end ())
208+ {
209+ ModuleHelp_IsErrorOccur = TRUE ;
210+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_NOTFOUND;
211+ st_Locker.unlock_shared ();
212+ return FALSE ;
213+ }
214+ // 有没有锁定状态
215+ if ((ENUM_MODULEHELP_LOCKSTATUS_READ == stl_MapIterator->second ->enLockStatus ) || (ENUM_MODULEHELP_LOCKSTATUS_WRITE == stl_MapIterator->second ->enLockStatus ))
216+ {
217+ ModuleHelp_IsErrorOccur = TRUE ;
218+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_LOCKED;
219+ st_Locker.unlock_shared ();
220+ return FALSE ;
221+ }
222+ stl_MapIterator->second ->enLockStatus = ENUM_MODULEHELP_LOCKSTATUS_WRITE;
223+
224+ st_Locker.unlock_shared ();
225+ return TRUE ;
226+ }
227+ /* *******************************************************************
228+ 函数名称:ModuleHelp_Locker_WriteUNLock
229+ 函数功能:写解锁
230+ 参数.一:xhToken
231+ In/Out:In
232+ 类型:锁句柄
233+ 可空:N
234+ 意思:输入要操作的锁
235+ 返回值
236+ 类型:逻辑型
237+ 意思:是否成功
238+ 备注:
239+ *********************************************************************/
240+ BOOL CModuleHelp_Locker::ModuleHelp_Locker_WriteUNLock (XNETHANDLE xhToken)
241+ {
242+ ModuleHelp_IsErrorOccur = FALSE ;
243+
244+ // 看看存在不存在
245+ st_Locker.lock_shared ();
246+ auto stl_MapIterator = stl_MapLocker.find (xhToken);
247+ if (stl_MapIterator == stl_MapLocker.end ())
248+ {
249+ ModuleHelp_IsErrorOccur = TRUE ;
250+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_NOTFOUND;
251+ st_Locker.unlock_shared ();
252+ return FALSE ;
253+ }
254+ // 有没有锁定状态
255+ if (ENUM_MODULEHELP_LOCKSTATUS_WRITE == stl_MapIterator->second ->enLockStatus )
256+ {
257+ ModuleHelp_IsErrorOccur = TRUE ;
258+ ModuleHelp_dwErrorCode = ERROR_XENGINE_APISERVICE_MODULE_HELP_LOCK_STATUS;
259+ st_Locker.unlock_shared ();
260+ return FALSE ;
261+ }
262+ stl_MapIterator->second ->enLockStatus = ENUM_MODULEHELP_LOCKSTATUS_NOTUSED;
263+
264+ st_Locker.unlock_shared ();
265+ return TRUE ;
266+ }
267+ /* *******************************************************************
268+ 函数名称:ModuleHelp_Locker_Close
269+ 函数功能:关闭锁
270+ 参数.一:xhToken
271+ In/Out:In
272+ 类型:锁句柄
273+ 可空:N
274+ 意思:输入要操作的锁
275+ 返回值
276+ 类型:逻辑型
277+ 意思:是否成功
278+ 备注:
279+ *********************************************************************/
280+ BOOL CModuleHelp_Locker::ModuleHelp_Locker_Close (XNETHANDLE xhToken)
281+ {
282+ ModuleHelp_IsErrorOccur = FALSE ;
283+
284+ // 看看存在不存在
285+ st_Locker.lock ();
286+ unordered_map<XNETHANDLE, MODULEHELP_LOCKINFO*>::iterator stl_MapIterator = stl_MapLocker.find (xhToken);
287+ if (stl_MapIterator != stl_MapLocker.end ())
288+ {
289+ delete stl_MapIterator->second ;
290+ stl_MapIterator->second = NULL ;
291+ stl_MapLocker.erase (stl_MapIterator);
292+ }
293+ st_Locker.unlock ();
294+ return TRUE ;
295+ }
0 commit comments