diff --git a/util/blueprint/exec.go b/util/blueprint/exec.go index cab58b0..6918a49 100644 --- a/util/blueprint/exec.go +++ b/util/blueprint/exec.go @@ -6,6 +6,8 @@ type IBaseExecNode interface { initInnerExecNode(innerNode *innerExecNode) initExecNode(gr *Graph, en *execNode) error GetPorts() ([]IPort, []IPort) + getExecNodeInfo() (*ExecContext, *execNode) + setExecNodeInfo(gr *ExecContext, en *execNode) } type IInnerExecNode interface { @@ -191,6 +193,15 @@ func (en *BaseExecNode) initInnerExecNode(innerNode *innerExecNode) { en.innerExecNode = innerNode } +func (en *BaseExecNode) getExecNodeInfo() (*ExecContext, *execNode) { + return en.ExecContext, en.execNode +} + +func (en *BaseExecNode) setExecNodeInfo(c *ExecContext, e *execNode) { + en.ExecContext = c + en.execNode = e +} + func (en *BaseExecNode) initExecNode(gr *Graph, node *execNode) error { ctx, ok := gr.context[node.Id] if !ok { @@ -478,15 +489,6 @@ func (en *BaseExecNode) GetOutPortArrayLen(index int) Port_Int { } func (en *BaseExecNode) DoNext(index int) error { - // 记录之前的上下文,执行完后需要恢复 - preExContext := en.ExecContext - preExecNode := en.execNode - - defer func() { - en.ExecContext = preExContext - en.execNode = preExecNode - }() - // -1 表示中断运行 if index == -1 { return nil diff --git a/util/blueprint/node.go b/util/blueprint/node.go index 18aa46b..86d34f6 100644 --- a/util/blueprint/node.go +++ b/util/blueprint/node.go @@ -85,6 +85,12 @@ func (en *execNode) exec(gr *Graph) (int, error) { return -1, fmt.Errorf("exec node %s not exec", en.execNode.GetName()) } + // 执行完,要恢复上下文,结点的BaseExecNode会被执行时修改 + ctx, exNode := node.getExecNodeInfo() + defer func() { + node.setExecNodeInfo(ctx, exNode) + }() + if err := node.initExecNode(gr, en); err != nil { return -1, err }