mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
优化上下文恢复
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user