|
@@ -109,8 +109,9 @@ func (f *Flow) Op(name string, params ...interface{}) (Operation, error) {
|
|
var op Operation
|
|
var op Operation
|
|
var err error
|
|
var err error
|
|
|
|
|
|
- allocErr := f.allocID(func(id string) {
|
|
|
|
|
|
+ allocErr := f.allocID(func(id string) error {
|
|
op, err = f.DefOp(id, name, params...)
|
|
op, err = f.DefOp(id, name, params...)
|
|
|
|
+ return err
|
|
})
|
|
})
|
|
if allocErr != nil {
|
|
if allocErr != nil {
|
|
return nil, allocErr
|
|
return nil, allocErr
|
|
@@ -131,8 +132,9 @@ func (f *Flow) ErrOp(operr error) (Operation, error) {
|
|
var op Operation
|
|
var op Operation
|
|
var err error
|
|
var err error
|
|
|
|
|
|
- allocErr := f.allocID(func(id string) {
|
|
|
|
|
|
+ allocErr := f.allocID(func(id string) error {
|
|
op, err = f.DefErrOp(id, operr)
|
|
op, err = f.DefErrOp(id, operr)
|
|
|
|
+ return err
|
|
})
|
|
})
|
|
if allocErr != nil {
|
|
if allocErr != nil {
|
|
return nil, err
|
|
return nil, err
|
|
@@ -152,8 +154,9 @@ func (f *Flow) DefConst(id string, value Data) (Operation, error) {
|
|
func (f *Flow) Const(value Data) (Operation, error) {
|
|
func (f *Flow) Const(value Data) (Operation, error) {
|
|
var op Operation
|
|
var op Operation
|
|
var err error
|
|
var err error
|
|
- allocErr := f.allocID(func(id string) {
|
|
|
|
|
|
+ allocErr := f.allocID(func(id string) error {
|
|
op, err = f.DefConst(id, value)
|
|
op, err = f.DefConst(id, value)
|
|
|
|
+ return err
|
|
})
|
|
})
|
|
if allocErr != nil {
|
|
if allocErr != nil {
|
|
return nil, allocErr
|
|
return nil, allocErr
|
|
@@ -280,20 +283,34 @@ func (f *Flow) MarshalJSON() ([]byte, error) {
|
|
return json.Marshal(data)
|
|
return json.Marshal(data)
|
|
}
|
|
}
|
|
|
|
|
|
-func (f *Flow) allocID(fn func(id string)) error {
|
|
|
|
- f.Lock()
|
|
|
|
- defer f.Unlock()
|
|
|
|
|
|
+func (f *Flow) allocID(fn func(id string) error) error {
|
|
|
|
|
|
- var id string
|
|
|
|
- // generate ID
|
|
|
|
- for i := 0; i < 10; i++ {
|
|
|
|
- id = f.idGen()
|
|
|
|
- if _, ok := f.operations.Load(id); !ok {
|
|
|
|
- break
|
|
|
|
|
|
+ genID := func() (string, error) {
|
|
|
|
+ f.Lock()
|
|
|
|
+ defer f.Unlock()
|
|
|
|
+
|
|
|
|
+ var id string
|
|
|
|
+ // generate ID
|
|
|
|
+ for i := 0; i < 10; i++ {
|
|
|
|
+ id = f.idGen()
|
|
|
|
+ if _, ok := f.operations.Load(id); !ok {
|
|
|
|
+ f.operations.Store(id, nil) // tmp
|
|
|
|
+ return id, nil
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- return errors.New("ID Exausted")
|
|
|
|
|
|
+ return "", errors.New("ID Exausted")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Safe generate an ID
|
|
|
|
+ id, err := genID()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ err = fn(id)
|
|
|
|
+ if err != nil {
|
|
|
|
+ f.operations.Delete(id)
|
|
}
|
|
}
|
|
- fn(id)
|
|
|
|
return nil
|
|
return nil
|
|
|
|
|
|
}
|
|
}
|