|  | @@ -2,7 +2,6 @@ package app
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  import (
 |  |  import (
 | 
											
												
													
														|  |  	"errors"
 |  |  	"errors"
 | 
											
												
													
														|  | -	"sync/atomic"
 |  | 
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	"github.com/v2ray/v2ray-core/common"
 |  |  	"github.com/v2ray/v2ray-core/common"
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
										
											
												
													
														|  | @@ -40,40 +39,27 @@ type Space interface {
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  type spaceImpl struct {
 |  |  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 {
 |  |  func NewSpace() Space {
 | 
											
												
													
														|  |  	return &spaceImpl{
 |  |  	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) {
 |  |  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 {
 |  |  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
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 |