Skip to content

Commit

Permalink
[bugfix] can not set loop and timeout both.
Browse files Browse the repository at this point in the history
  • Loading branch information
ChunelFeng committed Sep 3, 2023
1 parent a5c4018 commit 992ba2c
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
7 changes: 6 additions & 1 deletion src/GraphCtrl/GraphElement/GElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,10 @@ GElementPtr GElement::setName(const std::string& name) {


GElementPtr GElement::setLoop(CSize loop) {
// 由于运行机制问题,loop执行的element,不支持异步执行
CGRAPH_ASSERT_INIT_THROW_ERROR(false)
CGRAPH_THROW_EXCEPTION_BY_CONDITION((timeout_ > CGRAPH_DEFAULT_ELEMENT_TIMEOUT && loop != CGRAPH_DEFAULT_LOOP_TIMES), \
"cannot set loop value when timeout is bigger than 0")

this->loop_ = loop;
return this;
Expand Down Expand Up @@ -95,7 +98,9 @@ GElementPtr GElement::setBindingIndex(CIndex index) {

GElementPtr GElement::setTimeout(CMSec timeout, CBool asError) {
CGRAPH_ASSERT_INIT_THROW_ERROR(false)
CGRAPH_THROW_EXCEPTION_BY_CONDITION(timeout < 0, "timeout value cannot smaller than 0")
CGRAPH_THROW_EXCEPTION_BY_CONDITION((timeout < CGRAPH_DEFAULT_ELEMENT_TIMEOUT), "timeout value cannot smaller than 0")
CGRAPH_THROW_EXCEPTION_BY_CONDITION((loop_ > 1 && CGRAPH_DEFAULT_ELEMENT_TIMEOUT != timeout), \
"cannot set timeout value when loop bigger than 1")

this->timeout_ = timeout;
this->timeout_as_error_ = asError;
Expand Down
22 changes: 15 additions & 7 deletions src/GraphCtrl/GraphElement/GElement.h
Original file line number Diff line number Diff line change
Expand Up @@ -324,26 +324,34 @@ class GElement : public GElementObject,
CStatus getAsyncResult();

private:
/** 状态相关信息 */
CBool done_ { false }; // 判定被执行结束
CBool linkable_ { false }; // 判定是否可以连通计算
CBool visible_ { true }; // 判定可见的,如果被删除的话,则认为是不可见的
CBool timeout_as_error_ { true }; // 判定超时的情况下,是否返回错误
GElementType element_type_; // 用于区分element 内部类型
std::atomic<GElementState> cur_state_ { GElementState::CREATE }; // 当前执行状态

/** 配置相关信息 */
CSize loop_ { CGRAPH_DEFAULT_LOOP_TIMES }; // 元素执行次数
CLevel level_ { CGRAPH_DEFAULT_ELEMENT_LEVEL }; // 用于设定init的执行顺序(值小的,优先init,可以为负数)
CIndex binding_index_ { CGRAPH_DEFAULT_BINDING_INDEX }; // 用于设定绑定线程id
CMSec timeout_ { CGRAPH_DEFAULT_ELEMENT_TIMEOUT }; // 超时时间信息(0表示不计算超时)
std::atomic<CSize> left_depend_ { 0 }; // 当 left_depend_ 值为0的时候,即可以执行该element信息
std::set<GElement *> run_before_; // 被依赖的节点(后继)
std::set<GElement *> dependence_; // 依赖的节点信息(前驱)
GElementType element_type_; // 用于区分element 内部类型
GElement* belong_ { nullptr }; // 从属的element 信息,如为nullptr,则表示从属于 pipeline

/** 执行期间相关信息 */
GElementParamMap local_params_; // 用于记录当前element的内部参数
GAspectManagerPtr aspect_manager_ { nullptr }; // 整体流程的切面管理类
UThreadPoolPtr thread_pool_ { nullptr }; // 用于执行的线程池信息
std::atomic<GElementState> cur_state_ { GElementState::CREATE }; // 当前执行状态
GPerfInfo* perf_info_ = nullptr; // 用于perf的信息
std::future<CStatus> async_result_; // 用于记录当前节点的异步执行情况

/** 图相关信息 */
std::atomic<CSize> left_depend_ { 0 }; // 当 left_depend_ 值为0的时候,即可以执行该element信息
std::set<GElement *> run_before_; // 被依赖的节点(后继)
std::set<GElement *> dependence_; // 依赖的节点信息(前驱)
GElement* belong_ { nullptr }; // 从属的element 信息,如为nullptr,则表示从属于 pipeline

/** 异步执行相关信息 */
std::future<CStatus> async_result_; // 用于记录当前节点的异步执行情况
std::mutex yield_mutex_; // 控制停止执行的锁
std::condition_variable yield_cv_; // 控制停止执行的条件变量

Expand Down

0 comments on commit 992ba2c

Please sign in to comment.