Skip to content

Commit 5a1a603

Browse files
Fea,添加BuildYY_ThunksLibraries支持
1 parent 1a71e74 commit 5a1a603

File tree

7 files changed

+1273
-96
lines changed

7 files changed

+1273
-96
lines changed

LibMaker.sln

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
3-
# Visual Studio Version 16
4-
VisualStudioVersion = 16.0.32002.261
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.10.34916.146
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LibMaker", "LibMaker\LibMaker.vcxproj", "{30715830-71CE-4CE8-AB47-63AF621B4B07}"
77
EndProject
@@ -11,14 +11,6 @@ Global
1111
Debug|x86 = Debug|x86
1212
Release|x64 = Release|x64
1313
Release|x86 = Release|x86
14-
v140|x64 = v140|x64
15-
v140|x86 = v140|x86
16-
v140xp|x64 = v140xp|x64
17-
v140xp|x86 = v140xp|x86
18-
v141|x64 = v141|x64
19-
v141|x86 = v141|x86
20-
v141xp|x64 = v141xp|x64
21-
v141xp|x86 = v141xp|x86
2214
EndGlobalSection
2315
GlobalSection(ProjectConfigurationPlatforms) = postSolution
2416
{30715830-71CE-4CE8-AB47-63AF621B4B07}.Debug|x64.ActiveCfg = Debug|x64
@@ -29,22 +21,6 @@ Global
2921
{30715830-71CE-4CE8-AB47-63AF621B4B07}.Release|x64.Build.0 = Release|x64
3022
{30715830-71CE-4CE8-AB47-63AF621B4B07}.Release|x86.ActiveCfg = Release|Win32
3123
{30715830-71CE-4CE8-AB47-63AF621B4B07}.Release|x86.Build.0 = Release|Win32
32-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140|x64.ActiveCfg = Release|x64
33-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140|x64.Build.0 = Release|x64
34-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140|x86.ActiveCfg = Release|Win32
35-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140|x86.Build.0 = Release|Win32
36-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140xp|x64.ActiveCfg = Debug|Win32
37-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140xp|x64.Build.0 = Debug|Win32
38-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140xp|x86.ActiveCfg = Debug|Win32
39-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v140xp|x86.Build.0 = Debug|Win32
40-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141|x64.ActiveCfg = Release|x64
41-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141|x64.Build.0 = Release|x64
42-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141|x86.ActiveCfg = Release|Win32
43-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141|x86.Build.0 = Release|Win32
44-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141xp|x64.ActiveCfg = Release|x64
45-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141xp|x64.Build.0 = Release|x64
46-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141xp|x86.ActiveCfg = Debug|Win32
47-
{30715830-71CE-4CE8-AB47-63AF621B4B07}.v141xp|x86.Build.0 = Debug|Win32
4824
EndGlobalSection
4925
GlobalSection(SolutionProperties) = preSolution
5026
HideSolutionNode = FALSE

LibMaker/InterlockedQueue.h

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#pragma once
2+
3+
template<class Entry, size_t kMaxBlockSize>
4+
class InterlockedQueue
5+
{
6+
private:
7+
struct Block
8+
{
9+
size_t uLastReadIndex = 0;
10+
size_t uLastWriteIndex = 0;
11+
Block* pNextBlock = nullptr;
12+
Entry* arrLoopBuffer[kMaxBlockSize];
13+
14+
bool IsEmpty()
15+
{
16+
return uLastReadIndex == uLastWriteIndex;
17+
}
18+
19+
bool IsFull()
20+
{
21+
return uLastReadIndex + kMaxBlockSize == uLastWriteIndex;
22+
}
23+
};
24+
25+
Block* pFirstReadBlock = nullptr;
26+
Block* pLastWriteBlock = nullptr;
27+
28+
public:
29+
Entry* Pop() noexcept
30+
{
31+
if (!pFirstReadBlock)
32+
return nullptr;
33+
34+
for (;;)
35+
{
36+
// 当前块任然有元素?
37+
if (!pFirstReadBlock->IsEmpty())
38+
{
39+
auto _pTmp = pFirstReadBlock->arrLoopBuffer[pFirstReadBlock->uLastReadIndex % kMaxBlockSize];
40+
pFirstReadBlock->uLastReadIndex += 1;
41+
return _pTmp;
42+
}
43+
44+
// 尝试流转到下一块
45+
if (!pFirstReadBlock->pNextBlock)
46+
return nullptr;
47+
48+
auto _pPendingDelete = pFirstReadBlock;
49+
pFirstReadBlock = pFirstReadBlock->pNextBlock;
50+
delete _pPendingDelete;
51+
}
52+
53+
return nullptr;
54+
}
55+
56+
void Push(_In_ Entry* _pEntry)
57+
{
58+
if (!pLastWriteBlock)
59+
{
60+
pFirstReadBlock = pLastWriteBlock = new Block();
61+
}
62+
63+
// 如果满了就尝试链接到下一块
64+
if (pLastWriteBlock->IsFull())
65+
{
66+
auto _pNextBlock = new Block();
67+
pLastWriteBlock->pNextBlock = _pNextBlock;
68+
pLastWriteBlock = _pNextBlock;
69+
}
70+
71+
pLastWriteBlock->arrLoopBuffer[pLastWriteBlock->uLastWriteIndex % kMaxBlockSize] = _pEntry;
72+
pLastWriteBlock->uLastWriteIndex += 1;
73+
}
74+
};

0 commit comments

Comments
 (0)