Files
game-driver/internal/common/stopper.go
2024-11-05 18:39:03 +08:00

62 lines
957 B
Go

package common
import (
"sync"
"sync/atomic"
)
type Stopper interface {
Reset()
Stop()
Done() <-chan struct{}
}
var closedchan = make(chan struct{})
func init() {
close(closedchan)
}
type simpleStopper struct {
mu sync.Mutex
done atomic.Value
}
func (g *simpleStopper) Reset() {
g.mu.Lock()
defer g.mu.Unlock()
g.done = atomic.Value{}
}
func (g *simpleStopper) Stop() {
g.mu.Lock()
defer g.mu.Unlock()
d, _ := g.done.Load().(chan struct{})
if d == nil {
g.done.Store(closedchan)
} else {
close(d)
}
}
func (g *simpleStopper) Done() <-chan struct{} {
d := g.done.Load()
if d != nil {
return d.(chan struct{})
}
g.mu.Lock()
defer g.mu.Unlock()
d = g.done.Load()
if d == nil {
d = make(chan struct{})
g.done.Store(d)
}
return d.(chan struct{})
}
// GlobalStopper 全局停止器
var GlobalStopper Stopper = &simpleStopper{}
// GlobalBgStopper 全局后台停止器
var GlobalBgStopper Stopper = &simpleStopper{}