forked from ChunelFeng/CGraph
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGPipelineManager.cpp
More file actions
163 lines (125 loc) · 3.89 KB
/
GPipelineManager.cpp
File metadata and controls
163 lines (125 loc) · 3.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
/***************************
@Author: Chunel
@Contact: chunel@foxmail.com
@File: GPipelineManager.cpp
@Time: 2023/1/15 13:27
@Desc:
***************************/
#include <algorithm>
#include "GPipelineManager.h"
CGRAPH_NAMESPACE_BEGIN
CStatus GPipelineManager::init() {
CGRAPH_FUNCTION_BEGIN
if (!used_list_.empty()) {
// 初始化的时候,不应该有 used 的内容
CGRAPH_RETURN_ERROR_STATUS("used list status error")
}
for (auto pipeline : free_list_) {
status += pipeline->init();
}
CGRAPH_FUNCTION_CHECK_STATUS
is_init_ = true;
CGRAPH_FUNCTION_END
}
CStatus GPipelineManager::run() {
CGRAPH_FUNCTION_BEGIN
CGRAPH_ASSERT_INIT(true)
GPipelinePtr pipeline = fetch();
if (nullptr == pipeline) {
CGRAPH_RETURN_ERROR_STATUS("no free pipeline current")
}
/**
* 这里执行,是外部线程执行的。获取的status就是这个pipeline run的结果
* 无论如何,执行完成之后,都要将pipeline返回到 free_list 中去
*/
status = pipeline->run();
status += release(pipeline);
CGRAPH_FUNCTION_END
}
CStatus GPipelineManager::destroy() {
CGRAPH_FUNCTION_BEGIN
if (!used_list_.empty()) {
CGRAPH_RETURN_ERROR_STATUS("used list status error")
}
for (auto pipeline : free_list_) {
status += pipeline->destroy();
}
CGRAPH_FUNCTION_CHECK_STATUS
is_init_ = false;
CGRAPH_FUNCTION_END
}
CStatus GPipelineManager::add(GPipelinePtr ptr) {
CGRAPH_FUNCTION_BEGIN
CGRAPH_ASSERT_NOT_NULL(ptr)
CGRAPH_ASSERT_INIT(false)
free_list_.push_back(ptr);
CGRAPH_FUNCTION_END
}
CStatus GPipelineManager::clear() {
CGRAPH_FUNCTION_BEGIN
CGRAPH_ASSERT_INIT(false)
/**
* 这里只是清空list中的信息,并不真正销毁 pipeline对象
* 因为pipeline 对象统一在 Factory中管控
*/
used_list_.clear();
free_list_.clear();
CGRAPH_FUNCTION_END
}
CBool GPipelineManager::find(GPipelinePtr ptr) const {
/**
* 如果在其中一个位置,找到了,就返回 true了
* 非线程安全,建议 init 之前使用
*/
CBool result = std::any_of(used_list_.begin(), used_list_.end(),
[ptr] (GPipelinePtr cur) {
return (ptr == cur);
});
result |= std::any_of(free_list_.begin(), free_list_.end(),
[ptr] (GPipelinePtr cur) {
return (ptr == cur);
});
return result;
}
CStatus GPipelineManager::remove(GPipelinePtr ptr) {
CGRAPH_FUNCTION_BEGIN
CGRAPH_ASSERT_NOT_NULL(ptr)
CGRAPH_ASSERT_INIT(false)
free_list_.remove(ptr); // 在非初始化的情况下,仅可能在 free_list 中包含
CGRAPH_FUNCTION_END
}
CSize GPipelineManager::getSize() const {
CSize size = free_list_.size() + used_list_.size();
return size;
}
GPipelineManager::~GPipelineManager() {
clear();
}
GPipelinePtr GPipelineManager::fetch() {
GPipelinePtr pipeline = nullptr;
CGRAPH_LOCK_GUARD lk(mutex_);
if (free_list_.empty()) {
// 如果没有 free的了,则直接返回空了
return pipeline;
}
pipeline = free_list_.front();
free_list_.pop_front(); // 如果有的话,就fetch出去了
used_list_.push_back(pipeline);
return pipeline;
}
CStatus GPipelineManager::release(GPipelinePtr ptr) {
CGRAPH_FUNCTION_BEGIN
CGRAPH_ASSERT_NOT_NULL(ptr)
CGRAPH_LOCK_GUARD lk(mutex_);
CBool result = std::any_of(used_list_.begin(), used_list_.end(),
[ptr] (GPipelinePtr cur) {
return (ptr == cur);
});
if (!result) {
CGRAPH_RETURN_ERROR_STATUS("pipeline is not used")
}
used_list_.remove(ptr);
free_list_.push_front(ptr); // 最先执行的,放回头部,可能会增加cache触达
CGRAPH_FUNCTION_END
}
CGRAPH_NAMESPACE_END