mirror of
https://github.com/duanhf2012/origin.git
synced 2026-03-12 02:27:28 +08:00
优化上下文恢复
This commit is contained in:
@@ -6,6 +6,8 @@ type IBaseExecNode interface {
|
|||||||
initInnerExecNode(innerNode *innerExecNode)
|
initInnerExecNode(innerNode *innerExecNode)
|
||||||
initExecNode(gr *Graph, en *execNode) error
|
initExecNode(gr *Graph, en *execNode) error
|
||||||
GetPorts() ([]IPort, []IPort)
|
GetPorts() ([]IPort, []IPort)
|
||||||
|
getExecNodeInfo() (*ExecContext, *execNode)
|
||||||
|
setExecNodeInfo(gr *ExecContext, en *execNode)
|
||||||
}
|
}
|
||||||
|
|
||||||
type IInnerExecNode interface {
|
type IInnerExecNode interface {
|
||||||
@@ -191,6 +193,15 @@ func (en *BaseExecNode) initInnerExecNode(innerNode *innerExecNode) {
|
|||||||
en.innerExecNode = innerNode
|
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 {
|
func (en *BaseExecNode) initExecNode(gr *Graph, node *execNode) error {
|
||||||
ctx, ok := gr.context[node.Id]
|
ctx, ok := gr.context[node.Id]
|
||||||
if !ok {
|
if !ok {
|
||||||
@@ -478,15 +489,6 @@ func (en *BaseExecNode) GetOutPortArrayLen(index int) Port_Int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (en *BaseExecNode) DoNext(index int) error {
|
func (en *BaseExecNode) DoNext(index int) error {
|
||||||
// 记录之前的上下文,执行完后需要恢复
|
|
||||||
preExContext := en.ExecContext
|
|
||||||
preExecNode := en.execNode
|
|
||||||
|
|
||||||
defer func() {
|
|
||||||
en.ExecContext = preExContext
|
|
||||||
en.execNode = preExecNode
|
|
||||||
}()
|
|
||||||
|
|
||||||
// -1 表示中断运行
|
// -1 表示中断运行
|
||||||
if index == -1 {
|
if index == -1 {
|
||||||
return nil
|
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())
|
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 {
|
if err := node.initExecNode(gr, en); err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user