Преглед изворни кода

more clear logic of space initialization

v2ray пре 9 година
родитељ
комит
54f98fe11b
1 измењених фајлова са 10 додато и 24 уклоњено
  1. 10 24
      app/space.go

+ 10 - 24
app/space.go

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