@@ -133,6 +133,7 @@ CVoid GDynamicEngine::process(GElementPtr element, CBool affinity) {
133
133
// 当且仅当整体状正常,且当前状态异常的时候,进入赋值逻辑。确保不重复赋值
134
134
CGRAPH_LOCK_GUARD lk (status_lock_);
135
135
cur_status_ += curStatus;
136
+ locker_.cv_ .notify_one ();
136
137
}
137
138
afterElementRun (element);
138
139
};
@@ -148,37 +149,45 @@ CVoid GDynamicEngine::process(GElementPtr element, CBool affinity) {
148
149
149
150
CVoid GDynamicEngine::afterElementRun (GElementPtr element) {
150
151
element->done_ = true ;
151
- if (!element->run_before_ .empty () && cur_status_.isOK ()) {
152
- if (internal::GElementShape::LINKABLE == element->shape_ ) {
153
- process (element->run_before_ .front (), true );
154
- } else if (internal::GElementShape::ROOT == element->shape_ ) {
155
- for (CSize i = 0 ; i < element->run_before_ .size (); i++) {
156
- process (element->run_before_ [i], i == element->run_before_ .size () - 1 );
152
+ if (unlikely (cur_status_.isErr ())) {
153
+ return ;
154
+ }
155
+
156
+ switch (element->shape_ ) {
157
+ case internal::GElementShape::NORMAL:
158
+ {
159
+ GElementPtr reserved = nullptr ;
160
+ for (auto * cur : element->run_before_ ) {
161
+ if (--cur->left_depend_ <= 0 ) {
162
+ if (reserved) {
163
+ process (cur, false );
164
+ } else {
165
+ reserved = cur; // 留一个作为亲和性的,在当前线程运行
166
+ }
167
+ }
168
+ }
169
+
170
+ if (reserved) { process (reserved, true ); }
157
171
}
158
- } else {
159
- GElementPtr reserved = nullptr ;
172
+ break ;
173
+ case internal::GElementShape::LINKABLE:
174
+ process (element->run_before_ .front (), true );
175
+ break ;
176
+ case internal::GElementShape::ROOT:
160
177
for (auto * cur : element->run_before_ ) {
161
- if (--cur->left_depend_ <= 0 ) {
162
- if (reserved) {
163
- process (cur, false );
164
- } else {
165
- reserved = cur; // 留一个作为亲和性的,在当前线程运行
166
- }
178
+ process (cur, element->run_before_ .back () == cur);
179
+ }
180
+ break ;
181
+ case internal::GElementShape::TAIL:
182
+ {
183
+ CGRAPH_LOCK_GUARD lock (locker_.mtx_ );
184
+ if ((++finished_end_size_ >= total_end_size_)) {
185
+ locker_.cv_ .notify_one ();
167
186
}
168
187
}
169
- if (reserved) { process (reserved, true ); }
170
- }
171
- } else {
172
- CGRAPH_LOCK_GUARD lock (locker_.mtx_ );
173
- /* *
174
- * 满足一下条件之一,则通知wait函数停止等待
175
- * 1,无后缀节点全部执行完毕(在运行正常的情况下,只有无后缀节点执行完成的时候,才可能整体运行结束)
176
- * 2,有节点执行状态异常
177
- */
178
- if ((element->run_before_ .empty () && (++finished_end_size_ >= total_end_size_))
179
- || cur_status_.isErr ()) {
180
- locker_.cv_ .notify_one ();
181
- }
188
+ break ;
189
+ default :
190
+ break ;
182
191
}
183
192
}
184
193
0 commit comments