fix: 移除 modular.go 中不必要的代码,修复 timer.Ticker 释放后 handler 指针污染的问题
This commit is contained in:
parent
f7c37016ce
commit
17cdad2c6e
|
@ -3,7 +3,6 @@ package modular
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/kercylan98/minotaur/utils/log"
|
"github.com/kercylan98/minotaur/utils/log"
|
||||||
"reflect"
|
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -27,14 +26,12 @@ func (m *modular) RegisterServices(s ...Service) {
|
||||||
func Run() {
|
func Run() {
|
||||||
m := application
|
m := application
|
||||||
var names = make(map[string]bool)
|
var names = make(map[string]bool)
|
||||||
var tvm = make(map[reflect.Type]reflect.Value)
|
|
||||||
for i := 0; i < len(m.registerServices); i++ {
|
for i := 0; i < len(m.registerServices); i++ {
|
||||||
s := newService(m.registerServices[i])
|
s := newService(m.registerServices[i])
|
||||||
if names[s.name] {
|
if names[s.name] {
|
||||||
panic(fmt.Errorf("service %s is already registered", s.name))
|
panic(fmt.Errorf("service %s is already registered", s.name))
|
||||||
}
|
}
|
||||||
names[s.name] = true
|
names[s.name] = true
|
||||||
tvm[s.vof.Type()] = s.vof
|
|
||||||
m.services = append(m.services, s)
|
m.services = append(m.services, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,10 +2,10 @@ package timer
|
||||||
|
|
||||||
type Option func(ticker *Ticker)
|
type Option func(ticker *Ticker)
|
||||||
|
|
||||||
// WithCaller 通过其他的 handle 执行 Caller
|
// WithCaller 通过其他的 handler 执行 Caller
|
||||||
func WithCaller(handle func(name string, caller func())) Option {
|
func WithCaller(handle func(name string, caller func())) Option {
|
||||||
return func(ticker *Ticker) {
|
return func(ticker *Ticker) {
|
||||||
ticker.handle = handle
|
ticker.handler = handle
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ type Ticker struct {
|
||||||
timers map[string]*Scheduler
|
timers map[string]*Scheduler
|
||||||
lock sync.RWMutex
|
lock sync.RWMutex
|
||||||
|
|
||||||
handle func(name string, caller func())
|
handler func(name string, caller func())
|
||||||
mark string
|
mark string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark 获取定时器的标记
|
// Mark 获取定时器的标记
|
||||||
|
@ -33,6 +33,7 @@ func (slf *Ticker) Release() {
|
||||||
|
|
||||||
slf.lock.Lock()
|
slf.lock.Lock()
|
||||||
slf.mark = ""
|
slf.mark = ""
|
||||||
|
slf.handler = nil
|
||||||
for name, scheduler := range slf.timers {
|
for name, scheduler := range slf.timers {
|
||||||
scheduler.close()
|
scheduler.close()
|
||||||
delete(slf.timers, name)
|
delete(slf.timers, name)
|
||||||
|
@ -94,8 +95,8 @@ func (slf *Ticker) CronByInstantly(name, expression string, handleFunc interface
|
||||||
f := reflect.ValueOf(handleFunc)
|
f := reflect.ValueOf(handleFunc)
|
||||||
slf.lock.RLock()
|
slf.lock.RLock()
|
||||||
defer slf.lock.RUnlock()
|
defer slf.lock.RUnlock()
|
||||||
if slf.handle != nil {
|
if slf.handler != nil {
|
||||||
slf.handle(name, func() {
|
slf.handler(name, func() {
|
||||||
f.Call(values)
|
f.Call(values)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
|
@ -147,9 +148,9 @@ func (slf *Ticker) loop(name string, after, interval time.Duration, expr *cronex
|
||||||
|
|
||||||
slf.lock.Lock()
|
slf.lock.Lock()
|
||||||
slf.timers[name] = scheduler
|
slf.timers[name] = scheduler
|
||||||
if slf.handle != nil {
|
if slf.handler != nil {
|
||||||
scheduler.timer = slf.wheel.ScheduleFunc(scheduler, func() {
|
scheduler.timer = slf.wheel.ScheduleFunc(scheduler, func() {
|
||||||
slf.handle(scheduler.Name(), scheduler.Caller)
|
slf.handler(scheduler.Name(), scheduler.Caller)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
scheduler.timer = slf.wheel.ScheduleFunc(scheduler, scheduler.Caller)
|
scheduler.timer = slf.wheel.ScheduleFunc(scheduler, scheduler.Caller)
|
||||||
|
|
Loading…
Reference in New Issue