aboutsummaryrefslogtreecommitdiffstats
path: root/event.go
diff options
context:
space:
mode:
Diffstat (limited to 'event.go')
-rw-r--r--event.go44
1 files changed, 44 insertions, 0 deletions
diff --git a/event.go b/event.go
new file mode 100644
index 0000000..d238834
--- /dev/null
+++ b/event.go
@@ -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)
+}