mirror of
https://github.com/fluencelabs/tendermint
synced 2025-06-30 21:21:39 +00:00
QuitService->BaseService
This commit is contained in:
29
service.go
29
service.go
@ -65,6 +65,7 @@ type BaseService struct {
|
|||||||
name string
|
name string
|
||||||
started uint32 // atomic
|
started uint32 // atomic
|
||||||
stopped uint32 // atomic
|
stopped uint32 // atomic
|
||||||
|
Quit chan struct{}
|
||||||
|
|
||||||
// The "subclass" of BaseService
|
// The "subclass" of BaseService
|
||||||
impl Service
|
impl Service
|
||||||
@ -74,6 +75,7 @@ func NewBaseService(log log15.Logger, name string, impl Service) *BaseService {
|
|||||||
return &BaseService{
|
return &BaseService{
|
||||||
log: log,
|
log: log,
|
||||||
name: name,
|
name: name,
|
||||||
|
Quit: make(chan struct{}),
|
||||||
impl: impl,
|
impl: impl,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -102,6 +104,8 @@ func (bs *BaseService) Start() (bool, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Implements Service
|
// Implements Service
|
||||||
|
// NOTE: Do not put anything in here,
|
||||||
|
// that way users don't need to call BaseService.OnStart()
|
||||||
func (bs *BaseService) OnStart() error { return nil }
|
func (bs *BaseService) OnStart() error { return nil }
|
||||||
|
|
||||||
// Implements Service
|
// Implements Service
|
||||||
@ -111,6 +115,7 @@ func (bs *BaseService) Stop() bool {
|
|||||||
bs.log.Info(Fmt("Stopping %v", bs.name), "impl", bs.impl)
|
bs.log.Info(Fmt("Stopping %v", bs.name), "impl", bs.impl)
|
||||||
}
|
}
|
||||||
bs.impl.OnStop()
|
bs.impl.OnStop()
|
||||||
|
close(bs.Quit)
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
if bs.log != nil {
|
if bs.log != nil {
|
||||||
@ -121,6 +126,8 @@ func (bs *BaseService) Stop() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Implements Service
|
// Implements Service
|
||||||
|
// NOTE: Do not put anything in here,
|
||||||
|
// that way users don't need to call BaseService.OnStop()
|
||||||
func (bs *BaseService) OnStop() {}
|
func (bs *BaseService) OnStop() {}
|
||||||
|
|
||||||
// Implements Service
|
// Implements Service
|
||||||
@ -151,6 +158,10 @@ func (bs *BaseService) IsRunning() bool {
|
|||||||
return atomic.LoadUint32(&bs.started) == 1 && atomic.LoadUint32(&bs.stopped) == 0
|
return atomic.LoadUint32(&bs.started) == 1 && atomic.LoadUint32(&bs.stopped) == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (bs *QuitService) Wait() {
|
||||||
|
<-bs.Quit
|
||||||
|
}
|
||||||
|
|
||||||
// Implements Servce
|
// Implements Servce
|
||||||
func (bs *BaseService) String() string {
|
func (bs *BaseService) String() string {
|
||||||
return bs.name
|
return bs.name
|
||||||
@ -160,25 +171,13 @@ func (bs *BaseService) String() string {
|
|||||||
|
|
||||||
type QuitService struct {
|
type QuitService struct {
|
||||||
BaseService
|
BaseService
|
||||||
Quit chan struct{}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewQuitService(log log15.Logger, name string, impl Service) *QuitService {
|
func NewQuitService(log log15.Logger, name string, impl Service) *QuitService {
|
||||||
|
if log != nil {
|
||||||
|
log.Warn("QuitService is deprecated, use BaseService instead")
|
||||||
|
}
|
||||||
return &QuitService{
|
return &QuitService{
|
||||||
BaseService: *NewBaseService(log, name, impl),
|
BaseService: *NewBaseService(log, name, impl),
|
||||||
Quit: nil,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: when overriding OnStart, must call .QuitService.OnStart().
|
|
||||||
func (qs *QuitService) OnStart() error {
|
|
||||||
qs.Quit = make(chan struct{})
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE: when overriding OnStop, must call .QuitService.OnStop().
|
|
||||||
func (qs *QuitService) OnStop() {
|
|
||||||
if qs.Quit != nil {
|
|
||||||
close(qs.Quit)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
24
service_test.go
Normal file
24
service_test.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package common
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestBaseServiceWait(t *testing.T) {
|
||||||
|
|
||||||
|
type TestService struct {
|
||||||
|
BaseService
|
||||||
|
}
|
||||||
|
ts := &TestService{}
|
||||||
|
ts.BaseService = *NewBaseService(nil, "TestService", ts)
|
||||||
|
ts.Start()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
ts.Stop()
|
||||||
|
}()
|
||||||
|
|
||||||
|
for i := 0; i < 10; i++ {
|
||||||
|
ts.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in New Issue
Block a user