Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,9 @@ if __name__ == '__main__':
* 提供 lite 运行模式
* 修改 `GSome` 使用方式

[2026.08.22 - v3.3.0 - Chunel]
* 优化 `GParam` 的 trace 功能

</details>

------------
Expand Down
11 changes: 11 additions & 0 deletions python/PyCGraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,17 @@ PYBIND11_MODULE(pycgraph, cg) {
py::call_guard<py::gil_scoped_release>())
.def("tryLock", &GParam::tryLock,
py::call_guard<py::gil_scoped_release>())
.def("addTrace", &GParam::addTrace,
py::arg("trace"),
py::arg("repeatable") = true,
py::call_guard<py::gil_scoped_release>())
.def("removeTrace", &GParam::removeTrace,
py::arg("trace"),
py::call_guard<py::gil_scoped_release>())
.def("clearTrace", &GParam::clearTrace,
py::call_guard<py::gil_scoped_release>())
.def("getTraces", &GParam::getTraces,
py::call_guard<py::gil_scoped_release>())
.def("__enter__", [](GParam& self) -> GParam& {
self.lock();
return self;
Expand Down
2 changes: 0 additions & 2 deletions src/GraphCtrl/GraphElement/GElement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,6 @@ CStatus GElement::fatProcessor(const CFunctionType& type) {
break;
}
case CFunctionType::INIT: {
concerned_params_.clear(); // 仅需要记录这一轮使用到的 GParam 信息
status = init();
CGRAPH_FUNCTION_CHECK_STATUS
break;
Expand Down Expand Up @@ -291,7 +290,6 @@ CStatus GElement::fatProcessor(const CFunctionType& type) {
break;
}
case CFunctionType::INIT: {
concerned_params_.clear(); // 仅需要记录这一轮使用到的 GParam 信息
is_prepared_ = false;
status = doAspect(internal::GAspectType::BEGIN_INIT);
CGRAPH_FUNCTION_CHECK_STATUS
Expand Down
12 changes: 6 additions & 6 deletions src/GraphCtrl/GraphElement/GElementRepository.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ CBool GElementRepository::find(GElementPtr ptr) const {

GElementRepositoryPtr GElementRepository::setThreadPool(UThreadPoolPtr ptr) {
CGRAPH_ASSERT_NOT_NULL_THROW_ERROR(ptr)
for (auto& cur : this->elements_) {
for (auto* cur : this->elements_) {
cur->setThreadPool(ptr);
}
return this;
Expand All @@ -40,9 +40,9 @@ CStatus GElementRepository::setup() {
}


CStatus GElementRepository::reset() {
CStatus GElementRepository::reset() const {
CGRAPH_FUNCTION_BEGIN
for (auto& cur : async_elements_) {
for (auto* cur : async_elements_) {
if (GElementTimeoutStrategy::HOLD_BY_PIPELINE == cur->timeout_strategy_) {
// 强烈建议,在这里等待执行完成
status += cur->getAsyncResult();
Expand Down Expand Up @@ -78,7 +78,7 @@ CStatus GElementRepository::pushAllState(const GElementState& state) {

CVoid GElementRepository::fetchAll(GElementManagerCPtr em) {
CGRAPH_ASSERT_NOT_NULL_THROW_ERROR(em)
for (GElementPtr cur : em->manager_elements_) {
for (auto* cur : em->manager_elements_) {
/**
* 从 pipeline 的 element manager 中,逐层添加查询
* 查询到如果pipeline中,存在没有注册到 repo 中element,则写入 repo中
Expand Down Expand Up @@ -113,7 +113,7 @@ CBool GElementRepository::isCancelState() const {
CStatus GElementRepository::init() {
CGRAPH_FUNCTION_BEGIN
async_elements_.clear(); // 每次记得清空这里。因为每次init之后,都可能不一样
for (auto& element : elements_) {
for (auto* element : elements_) {
/**
* 1. 查验element是否为空
* 2. 查验配置信息是否正确
Expand Down Expand Up @@ -155,7 +155,7 @@ CStatus GElementRepository::run() {

GElementRepository::~GElementRepository() {
// 删除所有内部的element信息
for (GElementPtr element : elements_) {
for (const auto* element : elements_) {
CGRAPH_DELETE_PTR(element)
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/GraphCtrl/GraphElement/GElementRepository.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class GElementRepository : public GElementObject {
* @return
* @notice 主要针对异步流程
*/
CStatus reset();
CStatus reset() const;

/**
* 设置所有内部的element状态
Expand Down
72 changes: 33 additions & 39 deletions src/GraphCtrl/GraphParam/GParam.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,45 +8,9 @@

#include "GParam.h"

CGRAPH_NAMESPACE_BEGIN

std::vector<std::string> GParam::getBacktrace() {
CGRAPH_THROW_EXCEPTION_BY_CONDITION(!backtrace_enable_, \
"no enable backtrace for [" + key_ + "] param")

std::vector<std::string> traces;
backtrace_lock_.lock();
backtrace_.getUniqueArray(traces);
backtrace_lock_.unlock();

return traces;
}


CStatus GParam::addBacktrace(const std::string& trace) {
CGRAPH_FUNCTION_BEGIN
CGRAPH_RETURN_ERROR_STATUS_BY_CONDITION(!backtrace_enable_, \
"no enable backtrace for [" + key_ + "] param")

// 如果name不为空,则添加name信息。如果name为空,则添加session信息
backtrace_lock_.lock();
backtrace_.uniqueAdd(trace);
backtrace_lock_.unlock();

CGRAPH_FUNCTION_END
}


CVoid GParam::cleanBacktrace() {
if (!backtrace_enable_) {
return;
}

backtrace_lock_.lock();
backtrace_.clear();
backtrace_lock_.unlock();
}
#include <algorithm>

CGRAPH_NAMESPACE_BEGIN

std::string GParam::getKey() const {
return key_;
Expand All @@ -59,6 +23,7 @@ CStatus GParam::setup() {


CVoid GParam::reset(const CStatus& curStatus) {
(CVoid)curStatus;
}


Expand All @@ -76,4 +41,33 @@ CBool GParam::tryLock() {
return _param_shared_lock_.try_lock();
}

CGRAPH_NAMESPACE_END

CVoid GParam::addTrace(const std::string &trace, const CBool repeatable) {
CGRAPH_LOCK_GUARD lk(trace_mtx_);
if (repeatable || traces_.end() == std::find(traces_.begin(), traces_.end(), trace)) {
traces_.emplace_back(trace);
}
}


CSize GParam::removeTrace(const std::string &trace) {
CGRAPH_LOCK_GUARD lk(trace_mtx_);
const auto curSize = traces_.size();
traces_.erase(std::remove(traces_.begin(), traces_.end(), trace), traces_.end());
return curSize - traces_.size();
}


CVoid GParam::clearTrace() {
std::vector<std::string> traces {};
CGRAPH_LOCK_GUARD lk(trace_mtx_);
traces.swap(traces_);
}


std::vector<std::string> GParam::getTraces() {
CGRAPH_LOCK_GUARD lk(trace_mtx_);
return traces_;
}

CGRAPH_NAMESPACE_END
55 changes: 30 additions & 25 deletions src/GraphCtrl/GraphParam/GParam.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
#ifndef CGRAPH_GPARAM_H
#define CGRAPH_GPARAM_H

#include <set>
#include <mutex>
#include <vector>

#include "GParamObject.h"

Expand All @@ -24,25 +24,6 @@ class GParam : public GParamObject {
std::recursive_mutex _param_shared_lock_;
#endif

/**
* 获取参数的调用栈信息
* @return
*/
std::vector<std::string> getBacktrace();

/**
* 添加trace信息
* @param trace
* @return
*/
CStatus addBacktrace(const std::string& trace);

/**
* 清空trace信息
* @return
*/
CVoid cleanBacktrace();

/**
* 获取key信息
* @return
Expand All @@ -68,6 +49,32 @@ class GParam : public GParamObject {
*/
CBool tryLock();

/**
* 添加一条trace信息
* @param trace trace信息
* @param repeatable 是否允许重复写入相同的trace信息
*/
CVoid addTrace(const std::string &trace, CBool repeatable = true);

/**
* 删除所有匹配的trace信息
* @param trace trace信息
* @return 删除的trace数量
*/
CSize removeTrace(const std::string &trace);

/**
* 清空所有trace信息
*/
CVoid clearTrace();

/**
* 获取当前所有trace信息的有序快照
* @return 独立的trace数组,保留添加顺序和重复内容
* @notice 本接口线程安全,返回结果不受后续增删操作影响
*/
std::vector<std::string> getTraces();

protected:
/**
* 每次pipeline执行前,会调用一次setup,可以不实现
Expand All @@ -85,17 +92,15 @@ class GParam : public GParamObject {


private:
CBool backtrace_enable_ = false; // 是否使能backtrace功能
std::string key_; // 名称信息
USerialUniqueArray<std::string> backtrace_; // 记录参数的调用栈信息,仅记录get 此参数的地方。不包括 create和remove的地方。
USpinLock backtrace_lock_; // 针对backtrace的自旋锁
std::string key_; // 名称信息
std::vector<std::string> traces_ {}; // 记录 trace 信息
std::mutex trace_mtx_ {};

friend class GParamManager;
friend class GStorage;
};

using GParamPtr = GParam *;
using GParamPtrSet = std::set<GParamPtr>;

CGRAPH_NAMESPACE_END

Expand Down
18 changes: 10 additions & 8 deletions src/GraphCtrl/GraphParam/GParamManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,14 @@ GParamManager::~GParamManager() {

CStatus GParamManager::init() {
CGRAPH_FUNCTION_BEGIN
for (auto& param : params_map_) {
for (const auto& param : params_map_) {
/**
* 一般情况下,是不需要init的。需要注意init 和 setup的执行阶段的信息
* init() 是在pipeline init的时候被执行的
* setup() 是在pipeline run开始的时候被执行的
*/
CGRAPH_ASSERT_NOT_NULL(param.second);
param.second->clearTrace();
status += param.second->init();
}
CGRAPH_FUNCTION_END
Expand All @@ -37,9 +38,10 @@ CStatus GParamManager::init() {

CStatus GParamManager::destroy() {
CGRAPH_FUNCTION_BEGIN
for (auto& param : params_map_) {
for (const auto& param : params_map_) {
CGRAPH_ASSERT_NOT_NULL(param.second);
status += param.second->destroy();
param.second->clearTrace();
}
CGRAPH_FUNCTION_END
}
Expand All @@ -57,16 +59,16 @@ CStatus GParamManager::clear() {
}


CVoid GParamManager::resetWithStatus(const CStatus& curStatus) {
CVoid GParamManager::resetWithStatus(const CStatus& curStatus) const {
for (auto& param : params_map_) {
param.second->reset(curStatus);
}
}


CStatus GParamManager::setup() {
CStatus GParamManager::setup() const {
CGRAPH_FUNCTION_BEGIN
for (auto& param : params_map_) {
for (const auto& param : params_map_) {
// 这里不需要判断非空,因为在init的时候,已经判断过了
status += param.second->setup();
}
Expand All @@ -77,7 +79,7 @@ CStatus GParamManager::setup() {
CStatus GParamManager::removeByKey(const std::string& key) {
CGRAPH_FUNCTION_BEGIN
CGRAPH_LOCK_GUARD lock(this->mutex_); // 创建和销毁的时候,加锁
auto param = params_map_.find(key);
const auto& param = params_map_.find(key);
if (param == params_map_.end()) {
CGRAPH_RETURN_ERROR_STATUS("param [" + key + "] no find")
}
Expand All @@ -103,7 +105,7 @@ std::vector<std::string> GParamManager::getKeys() {
CStatus GParamManager::__create_4py(GParamPtr param, const std::string& key) {
CGRAPH_FUNCTION_BEGIN
CGRAPH_LOCK_GUARD lock(this->mutex_);
auto iter = params_map_.find(key);
const auto& iter = params_map_.find(key);
// python场景中,如果重复添加,仅保留第一次的写入
if (iter == params_map_.end()) {
params_map_.insert(std::pair<std::string, GParamPtr>(key, param));
Expand All @@ -126,7 +128,7 @@ GParamPtr GParamManager::__get_4py(const std::string& key) {
CStatus GParamManager::__remove_4py(const std::string& key) {
CGRAPH_FUNCTION_BEGIN
CGRAPH_LOCK_GUARD lock(this->mutex_);
auto iter = params_map_.find(key);
const auto& iter = params_map_.find(key);
CGRAPH_RETURN_ERROR_STATUS_BY_CONDITION(iter == params_map_.end(),
"param [" + key + "] no find")

Expand Down
7 changes: 3 additions & 4 deletions src/GraphCtrl/GraphParam/GParamManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,10 @@ class GParamManager : public GParamObject,
* 创建一个特定类型的参数
* @tparam T
* @param key
* @param backtrace 是否开启记录调用链路功能
* @return
*/
template<typename T, c_enable_if_t<std::is_base_of<GParam, T>::value, int> = 0>
CStatus create(const std::string& key, CBool backtrace = false);
CStatus create(const std::string& key);

/**
* 获取一个特定类型的参数
Expand Down Expand Up @@ -67,14 +66,14 @@ class GParamManager : public GParamObject,
* 初始化所有的参数信息
* @return
*/
CStatus setup();
CStatus setup() const;

/**
* 重置所有的GParam信息
* @param curStatus
* @return
*/
CVoid resetWithStatus(const CStatus& curStatus);
CVoid resetWithStatus(const CStatus& curStatus) const;

CGRAPH_NO_ALLOWED_COPY(GParamManager)

Expand Down
Loading
Loading