|
|
@@ -2,7 +2,6 @@ package app
|
|
|
|
|
|
import (
|
|
|
"errors"
|
|
|
- "sync/atomic"
|
|
|
|
|
|
"github.com/v2ray/v2ray-core/common"
|
|
|
)
|
|
|
@@ -40,40 +39,27 @@ type Space interface {
|
|
|
}
|
|
|
|
|
|
type spaceImpl struct {
|
|
|
- cache map[ID]Application
|
|
|
- initSignal chan struct{}
|
|
|
- initErrors chan error
|
|
|
- appsToInit int32
|
|
|
- appsDone int32
|
|
|
+ cache map[ID]Application
|
|
|
+ appInit []ApplicationInitializer
|
|
|
}
|
|
|
|
|
|
func NewSpace() Space {
|
|
|
return &spaceImpl{
|
|
|
- cache: make(map[ID]Application),
|
|
|
- initSignal: make(chan struct{}),
|
|
|
- initErrors: make(chan error, 1),
|
|
|
+ cache: make(map[ID]Application),
|
|
|
+ appInit: make([]ApplicationInitializer, 0, 32),
|
|
|
}
|
|
|
}
|
|
|
|
|
|
func (this *spaceImpl) InitializeApplication(f ApplicationInitializer) {
|
|
|
- atomic.AddInt32(&(this.appsToInit), 1)
|
|
|
- go func() {
|
|
|
- <-this.initSignal
|
|
|
- err := f()
|
|
|
- if err != nil {
|
|
|
- this.initErrors <- err
|
|
|
- }
|
|
|
- count := atomic.AddInt32(&(this.appsDone), 1)
|
|
|
- if count == this.appsToInit {
|
|
|
- close(this.initErrors)
|
|
|
- }
|
|
|
- }()
|
|
|
+ this.appInit = append(this.appInit, f)
|
|
|
}
|
|
|
|
|
|
func (this *spaceImpl) Initialize() error {
|
|
|
- close(this.initSignal)
|
|
|
- if err, open := <-this.initErrors; open {
|
|
|
- return err
|
|
|
+ for _, f := range this.appInit {
|
|
|
+ err := f()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
}
|
|
|
return nil
|
|
|
}
|