Initial version of migration to new event model
- Begin move away from global timer state. - Made logging format more consistent
This commit is contained in:
44
event.go
Normal file
44
event.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Event struct {
|
||||
guard int32
|
||||
next time.Time
|
||||
interval time.Duration
|
||||
C chan struct{}
|
||||
}
|
||||
|
||||
func newEvent(interval time.Duration) *Event {
|
||||
return &Event{
|
||||
guard: 0,
|
||||
next: time.Now(),
|
||||
interval: interval,
|
||||
C: make(chan struct{}, 1),
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Event) Clear() {
|
||||
select {
|
||||
case <-e.C:
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
func (e *Event) Fire() {
|
||||
if e == nil || atomic.SwapInt32(&e.guard, 1) != 0 {
|
||||
return
|
||||
}
|
||||
now := time.Now()
|
||||
if e.next.After(now) {
|
||||
select {
|
||||
case e.C <- struct{}{}:
|
||||
default:
|
||||
}
|
||||
e.next = now.Add(e.interval)
|
||||
}
|
||||
atomic.StoreInt32(&e.guard, 0)
|
||||
}
|
||||
Reference in New Issue
Block a user