more clear logic of space initialization

pull/168/head
v2ray 9 years ago
parent 8b88f63280
commit 54f98fe11b

@ -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
}

Loading…
Cancel
Save