From 95e9316656acd5951ed9c15a3ca902982a2d93a3 Mon Sep 17 00:00:00 2001 From: Chunel Date: Sat, 22 Aug 2026 22:12:48 +0800 Subject: [PATCH] [chg] change GParam trace. --- README.md | 3 + python/PyCGraph.cpp | 11 +++ src/GraphCtrl/GraphElement/GElement.cpp | 2 - .../GraphElement/GElementRepository.cpp | 12 ++-- .../GraphElement/GElementRepository.h | 2 +- src/GraphCtrl/GraphParam/GParam.cpp | 72 +++++++++---------- src/GraphCtrl/GraphParam/GParam.h | 55 +++++++------- src/GraphCtrl/GraphParam/GParamManager.cpp | 18 ++--- src/GraphCtrl/GraphParam/GParamManager.h | 7 +- src/GraphCtrl/GraphParam/GParamManager.inl | 13 ++-- .../GraphParam/GParamManagerWrapper.h | 26 +------ src/GraphCtrl/GraphParam/GParamUtils.h | 3 - .../GraphPipeline/_GStroage/GStorage.cpp | 4 +- .../GraphPipeline/_GStroage/GStorageDefine.h | 5 +- 14 files changed, 109 insertions(+), 124 deletions(-) diff --git a/README.md b/README.md index 152c12a0..646fca28 100644 --- a/README.md +++ b/README.md @@ -432,6 +432,9 @@ if __name__ == '__main__': * 提供 lite 运行模式 * 修改 `GSome` 使用方式 +[2026.08.22 - v3.3.0 - Chunel] +* 优化 `GParam` 的 trace 功能 + ------------ diff --git a/python/PyCGraph.cpp b/python/PyCGraph.cpp index aaf96fd2..c14320d2 100644 --- a/python/PyCGraph.cpp +++ b/python/PyCGraph.cpp @@ -167,6 +167,17 @@ PYBIND11_MODULE(pycgraph, cg) { py::call_guard()) .def("tryLock", &GParam::tryLock, py::call_guard()) + .def("addTrace", &GParam::addTrace, + py::arg("trace"), + py::arg("repeatable") = true, + py::call_guard()) + .def("removeTrace", &GParam::removeTrace, + py::arg("trace"), + py::call_guard()) + .def("clearTrace", &GParam::clearTrace, + py::call_guard()) + .def("getTraces", &GParam::getTraces, + py::call_guard()) .def("__enter__", [](GParam& self) -> GParam& { self.lock(); return self; diff --git a/src/GraphCtrl/GraphElement/GElement.cpp b/src/GraphCtrl/GraphElement/GElement.cpp index b4c21aad..2880adfd 100644 --- a/src/GraphCtrl/GraphElement/GElement.cpp +++ b/src/GraphCtrl/GraphElement/GElement.cpp @@ -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; @@ -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 diff --git a/src/GraphCtrl/GraphElement/GElementRepository.cpp b/src/GraphCtrl/GraphElement/GElementRepository.cpp index 9c4e9b79..55570621 100644 --- a/src/GraphCtrl/GraphElement/GElementRepository.cpp +++ b/src/GraphCtrl/GraphElement/GElementRepository.cpp @@ -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; @@ -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(); @@ -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中 @@ -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. 查验配置信息是否正确 @@ -155,7 +155,7 @@ CStatus GElementRepository::run() { GElementRepository::~GElementRepository() { // 删除所有内部的element信息 - for (GElementPtr element : elements_) { + for (const auto* element : elements_) { CGRAPH_DELETE_PTR(element) } } diff --git a/src/GraphCtrl/GraphElement/GElementRepository.h b/src/GraphCtrl/GraphElement/GElementRepository.h index 46492673..70627d80 100644 --- a/src/GraphCtrl/GraphElement/GElementRepository.h +++ b/src/GraphCtrl/GraphElement/GElementRepository.h @@ -51,7 +51,7 @@ class GElementRepository : public GElementObject { * @return * @notice 主要针对异步流程 */ - CStatus reset(); + CStatus reset() const; /** * 设置所有内部的element状态 diff --git a/src/GraphCtrl/GraphParam/GParam.cpp b/src/GraphCtrl/GraphParam/GParam.cpp index 5f6d394c..8725148e 100644 --- a/src/GraphCtrl/GraphParam/GParam.cpp +++ b/src/GraphCtrl/GraphParam/GParam.cpp @@ -8,45 +8,9 @@ #include "GParam.h" -CGRAPH_NAMESPACE_BEGIN - -std::vector GParam::getBacktrace() { - CGRAPH_THROW_EXCEPTION_BY_CONDITION(!backtrace_enable_, \ - "no enable backtrace for [" + key_ + "] param") - - std::vector 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 +CGRAPH_NAMESPACE_BEGIN std::string GParam::getKey() const { return key_; @@ -59,6 +23,7 @@ CStatus GParam::setup() { CVoid GParam::reset(const CStatus& curStatus) { + (CVoid)curStatus; } @@ -76,4 +41,33 @@ CBool GParam::tryLock() { return _param_shared_lock_.try_lock(); } -CGRAPH_NAMESPACE_END \ No newline at end of file + +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 traces {}; + CGRAPH_LOCK_GUARD lk(trace_mtx_); + traces.swap(traces_); +} + + +std::vector GParam::getTraces() { + CGRAPH_LOCK_GUARD lk(trace_mtx_); + return traces_; +} + +CGRAPH_NAMESPACE_END diff --git a/src/GraphCtrl/GraphParam/GParam.h b/src/GraphCtrl/GraphParam/GParam.h index 31c92292..9a527e19 100644 --- a/src/GraphCtrl/GraphParam/GParam.h +++ b/src/GraphCtrl/GraphParam/GParam.h @@ -9,8 +9,8 @@ #ifndef CGRAPH_GPARAM_H #define CGRAPH_GPARAM_H -#include #include +#include #include "GParamObject.h" @@ -24,25 +24,6 @@ class GParam : public GParamObject { std::recursive_mutex _param_shared_lock_; #endif - /** - * 获取参数的调用栈信息 - * @return - */ - std::vector getBacktrace(); - - /** - * 添加trace信息 - * @param trace - * @return - */ - CStatus addBacktrace(const std::string& trace); - - /** - * 清空trace信息 - * @return - */ - CVoid cleanBacktrace(); - /** * 获取key信息 * @return @@ -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 getTraces(); + protected: /** * 每次pipeline执行前,会调用一次setup,可以不实现 @@ -85,17 +92,15 @@ class GParam : public GParamObject { private: - CBool backtrace_enable_ = false; // 是否使能backtrace功能 - std::string key_; // 名称信息 - USerialUniqueArray backtrace_; // 记录参数的调用栈信息,仅记录get 此参数的地方。不包括 create和remove的地方。 - USpinLock backtrace_lock_; // 针对backtrace的自旋锁 + std::string key_; // 名称信息 + std::vector traces_ {}; // 记录 trace 信息 + std::mutex trace_mtx_ {}; friend class GParamManager; friend class GStorage; }; using GParamPtr = GParam *; -using GParamPtrSet = std::set; CGRAPH_NAMESPACE_END diff --git a/src/GraphCtrl/GraphParam/GParamManager.cpp b/src/GraphCtrl/GraphParam/GParamManager.cpp index 51442d8b..9fe40ab7 100644 --- a/src/GraphCtrl/GraphParam/GParamManager.cpp +++ b/src/GraphCtrl/GraphParam/GParamManager.cpp @@ -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 @@ -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 } @@ -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(); } @@ -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") } @@ -103,7 +105,7 @@ std::vector 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(key, param)); @@ -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") diff --git a/src/GraphCtrl/GraphParam/GParamManager.h b/src/GraphCtrl/GraphParam/GParamManager.h index e62c287d..c49c00d7 100644 --- a/src/GraphCtrl/GraphParam/GParamManager.h +++ b/src/GraphCtrl/GraphParam/GParamManager.h @@ -27,11 +27,10 @@ class GParamManager : public GParamObject, * 创建一个特定类型的参数 * @tparam T * @param key - * @param backtrace 是否开启记录调用链路功能 * @return */ template::value, int> = 0> - CStatus create(const std::string& key, CBool backtrace = false); + CStatus create(const std::string& key); /** * 获取一个特定类型的参数 @@ -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) diff --git a/src/GraphCtrl/GraphParam/GParamManager.inl b/src/GraphCtrl/GraphParam/GParamManager.inl index 09b2026e..709aa25e 100644 --- a/src/GraphCtrl/GraphParam/GParamManager.inl +++ b/src/GraphCtrl/GraphParam/GParamManager.inl @@ -17,10 +17,10 @@ CGRAPH_NAMESPACE_BEGIN template::value, int>> -CStatus GParamManager::create(const std::string& key, CBool backtrace) { +CStatus GParamManager::create(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); if (iter != params_map_.end()) { /* 如果是重复创建,则返回ok;非重复创建(类型不同)则返回err */ auto param = iter->second; @@ -28,10 +28,9 @@ CStatus GParamManager::create(const std::string& key, CBool backtrace) { CStatus() : CStatus("create [" + key + "] param duplicate"); } - T* ptr = CGRAPH_SAFE_MALLOC_COBJECT(T) - ((GParamPtr)ptr)->key_ = key; - ((GParamPtr)ptr)->backtrace_enable_ = backtrace; - params_map_.insert(std::pair(key, ptr)); + GParamPtr ptr = CGRAPH_SAFE_MALLOC_COBJECT(T) + ptr->key_ = key; + params_map_.insert(std::pair(key, ptr)); CGRAPH_FUNCTION_END } @@ -54,4 +53,4 @@ T* GParamManager::get(const std::string& key) { CGRAPH_NAMESPACE_END -#endif // CGRAPH_GPARAMMANAGER_INL \ No newline at end of file +#endif // CGRAPH_GPARAMMANAGER_INL diff --git a/src/GraphCtrl/GraphParam/GParamManagerWrapper.h b/src/GraphCtrl/GraphParam/GParamManagerWrapper.h index 6e1a69f0..a2298bf4 100644 --- a/src/GraphCtrl/GraphParam/GParamManagerWrapper.h +++ b/src/GraphCtrl/GraphParam/GParamManagerWrapper.h @@ -22,14 +22,13 @@ CGRAPH_NAMESPACE_BEGIN * 创建param信息,如果创建成功,则直接返回ok * @tparam TGParam * @param key - * @param backtrace * @return */ \ template::value, int> = 0> \ - CStatus createGParam(const std::string& key, CBool backtrace = false) { \ + CStatus createGParam(const std::string& key) { \ CGRAPH_ASSERT_NOT_NULL(param_manager_) \ - return param_manager_->create(key, backtrace); \ + return param_manager_->create(key); \ } \ \ /** @@ -42,12 +41,7 @@ CGRAPH_NAMESPACE_BEGIN c_enable_if_t::value, int> = 0> \ TGParam* getGParam(const std::string& key) { \ CGRAPH_ASSERT_NOT_NULL_THROW_ERROR(param_manager_) \ - auto param = param_manager_->get(key); \ - if (nullptr != param) { \ - concerned_params_.insert(param); \ - param->addBacktrace(name_.empty() ? session_ : name_); \ - } \ - return param; \ + return param_manager_->get(key); \ } \ \ /** @@ -85,18 +79,6 @@ CGRAPH_NAMESPACE_BEGIN return param_manager_->getKeys(); \ } \ \ - /** - * 获取所有被使用的keys信息 - * @return - */ \ - std::vector getConcernedGParamKeys() const { \ - std::vector keys; \ - for (auto param : concerned_params_) { \ - keys.emplace_back(param->getKey()); \ - } \ - return keys; \ - } \ - \ public: \ GParamPtr __getGParam_4py(const std::string& key) { \ return param_manager_ ? param_manager_->__get_4py(key) : nullptr; \ @@ -134,8 +116,6 @@ private: return this; \ } \ \ - GParamPtrSet concerned_params_; /* 记录链路上使用过GParam信息 */ \ - \ protected: \ \ diff --git a/src/GraphCtrl/GraphParam/GParamUtils.h b/src/GraphCtrl/GraphParam/GParamUtils.h index 80b2fcda..b72e88e5 100644 --- a/src/GraphCtrl/GraphParam/GParamUtils.h +++ b/src/GraphCtrl/GraphParam/GParamUtils.h @@ -17,9 +17,6 @@ CGRAPH_NAMESPACE_BEGIN #define CGRAPH_CREATE_GPARAM(Type, key) \ this->template createGParam(key); \ -#define CGRAPH_CREATE_GPARAM_WITH_BACKTRACE(Type, key) \ - this->template createGParam(key, true); \ - /** 获取参数信息 */ #define CGRAPH_GET_GPARAM(Type, key) \ this->template getGParam(key); \ diff --git a/src/GraphCtrl/GraphPipeline/_GStroage/GStorage.cpp b/src/GraphCtrl/GraphPipeline/_GStroage/GStorage.cpp index c5749f77..d2fdd46c 100644 --- a/src/GraphCtrl/GraphPipeline/_GStroage/GStorage.cpp +++ b/src/GraphCtrl/GraphPipeline/_GStroage/GStorage.cpp @@ -172,8 +172,7 @@ CStatus GStorage::buildPipelineStorage(GPipeline* pipeline, _GPipelineStorage& s for (const auto& param : pipeline->param_manager_->params_map_) { const std::string& key = param.first; const std::string& clz = typeid(*param.second).name(); - bool backtrace = (*param.second).backtrace_enable_; - storage.param_storages_.emplace_back(key, backtrace, clz); + storage.param_storages_.emplace_back(key, clz); } for (const auto& daemon : pipeline->daemon_manager_->daemons_) { CMSec msec = daemon->getInterval(); @@ -329,7 +328,6 @@ CStatus GStorage::loadParam(GPipelinePtr pipeline, const _GPipelineStorage& stor CGRAPH_RETURN_ERROR_STATUS_BY_CONDITION(!param, gps.key_ + " param type do not register, please check"); param->key_ = gps.key_; - param->backtrace_enable_ = gps.backtrace_; pipeline->param_manager_->params_map_[gps.key_] = param; } diff --git a/src/GraphCtrl/GraphPipeline/_GStroage/GStorageDefine.h b/src/GraphCtrl/GraphPipeline/_GStroage/GStorageDefine.h index 75d6e02a..fdbc05c0 100644 --- a/src/GraphCtrl/GraphPipeline/_GStroage/GStorageDefine.h +++ b/src/GraphCtrl/GraphPipeline/_GStroage/GStorageDefine.h @@ -64,13 +64,12 @@ struct _GStageStorage : public _GStorageBasic { struct _GParamStorage : public _GStorageBasic { explicit _GParamStorage() = default; - explicit _GParamStorage(const std::string& key, CBool backtrace, const std::string& clz) { + explicit _GParamStorage(const std::string& key, const std::string& clz) { key_ = key; - backtrace_ = backtrace; + clz_name_ = clz; } std::string key_ {}; - CBool backtrace_ { false }; }; struct _GPassedParamStorage : public _GStorageBasic {