Skip to content

Commit 00adfa4

Browse files
committed
added:lock help code
1 parent dae708e commit 00adfa4

File tree

2 files changed

+338
-0
lines changed

2 files changed

+338
-0
lines changed
Lines changed: 295 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,295 @@
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+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#pragma once
2+
/********************************************************************
3+
// Created: 2022/08/15 16:04:28
4+
// File Name: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Locker\ModuleHelp_Locker.h
5+
// File Path: D:\XEngine_APIService\XEngine_Source\XEngine_ModuleHelp\ModuleHelp_Locker
6+
// File Base: ModuleHelp_Locker
7+
// File Ext: h
8+
// Project: XEngine(网络通信引擎)
9+
// Author: qyt
10+
// Purpose: 分布式锁
11+
// History:
12+
*********************************************************************/
13+
//锁状态
14+
typedef enum
15+
{
16+
ENUM_MODULEHELP_LOCKSTATUS_NOTUSED = 0,
17+
ENUM_MODULEHELP_LOCKSTATUS_READ = 1,
18+
ENUM_MODULEHELP_LOCKSTATUS_WRITE = 1,
19+
}MODULEHELP_LOCKSTATUS;
20+
//锁属性
21+
typedef struct
22+
{
23+
atomic<MODULEHELP_LOCKSTATUS> enLockStatus;
24+
}MODULEHELP_LOCKINFO;
25+
26+
class CModuleHelp_Locker
27+
{
28+
public:
29+
CModuleHelp_Locker();
30+
~CModuleHelp_Locker();
31+
public:
32+
BOOL ModuleHelp_Locker_Create(XNETHANDLE* pxhToken);
33+
BOOL ModuleHelp_Locker_OPen(XNETHANDLE xhToken);
34+
BOOL ModuleHelp_Locker_ReadLock(XNETHANDLE xhToken);
35+
BOOL ModuleHelp_Locker_ReadUNLock(XNETHANDLE xhToken);
36+
BOOL ModuleHelp_Locker_WriteLock(XNETHANDLE xhToken);
37+
BOOL ModuleHelp_Locker_WriteUNLock(XNETHANDLE xhToken);
38+
BOOL ModuleHelp_Locker_Close(XNETHANDLE xhToken);
39+
private:
40+
shared_mutex st_Locker;
41+
private:
42+
unordered_map<XNETHANDLE, MODULEHELP_LOCKINFO*> stl_MapLocker;
43+
};

0 commit comments

Comments
 (0)