Merge pull request #209 from uffy/master

use sync.Once instead of chan
This commit is contained in:
Asim Aslam 2017-10-09 14:09:56 +01:00 committed by GitHub
commit 53554d98cd

View File

@ -3,6 +3,7 @@ package micro
import (
"os"
"os/signal"
"sync"
"syscall"
"time"
@ -15,7 +16,7 @@ import (
type service struct {
opts Options
init chan bool
once sync.Once
}
func newService(opts ...Option) Service {
@ -30,7 +31,6 @@ func newService(opts ...Option) Service {
return &service{
opts: options,
init: make(chan bool),
}
}
@ -56,23 +56,12 @@ func (s *service) run(exit chan bool) {
// which parses command line flags. cmd.Init is only called
// on first Init.
func (s *service) Init(opts ...Option) {
// If <-s.init blocks, Init has not been called yet
// so we can call cmd.Init once.
select {
case <-s.init:
// only process options
for _, o := range opts {
o(&s.opts)
}
default:
// close init
close(s.init)
// process options
for _, o := range opts {
o(&s.opts)
}
s.once.Do(func() {
// Initialise the command flags, overriding new service
s.opts.Cmd.Init(
cmd.Broker(&s.opts.Broker),
@ -81,7 +70,7 @@ func (s *service) Init(opts ...Option) {
cmd.Client(&s.opts.Client),
cmd.Server(&s.opts.Server),
)
}
})
}
func (s *service) Options() Options {