mirror of https://github.com/v2ray/v2ray-core
more clear logic of space initialization
parent
8b88f63280
commit
54f98fe11b
28
app/space.go
28
app/space.go
|
@ -2,7 +2,6 @@ package app
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/v2ray/v2ray-core/common"
|
||||
)
|
||||
|
@ -41,40 +40,27 @@ type Space interface {
|
|||
|
||||
type spaceImpl struct {
|
||||
cache map[ID]Application
|
||||
initSignal chan struct{}
|
||||
initErrors chan error
|
||||
appsToInit int32
|
||||
appsDone int32
|
||||
appInit []ApplicationInitializer
|
||||
}
|
||||
|
||||
func NewSpace() Space {
|
||||
return &spaceImpl{
|
||||
cache: make(map[ID]Application),
|
||||
initSignal: make(chan struct{}),
|
||||
initErrors: make(chan error, 1),
|
||||
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 {
|
||||
for _, f := range this.appInit {
|
||||
err := f()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue