mirror of
https://github.com/coredns/coredns.git
synced 2025-10-27 16:24:19 -04:00
Spin this out the metrics package so we can use it in the health one of well to fix some reload bugs.
53 lines
1.0 KiB
Go
53 lines
1.0 KiB
Go
// Package uniq keeps track of "thing" that are either "todo" or "done". Multiple
|
|
// identical events will only be processed once.
|
|
package uniq
|
|
|
|
// U keeps track of item to be done.
|
|
type U struct {
|
|
u map[string]item
|
|
}
|
|
|
|
type item struct {
|
|
state int // either todo or done
|
|
f func() error // function to be executed.
|
|
}
|
|
|
|
// New returns a new initialized U.
|
|
func New() U { return U{u: make(map[string]item)} }
|
|
|
|
// Set sets function f in U under key. If the key already exists
|
|
// it is not overwritten.
|
|
func (u U) Set(key string, f func() error) {
|
|
if _, ok := u.u[key]; ok {
|
|
return
|
|
}
|
|
u.u[key] = item{todo, f}
|
|
}
|
|
|
|
// SetTodo sets key to 'todo' again.
|
|
func (u U) SetTodo(key string) {
|
|
v, ok := u.u[key]
|
|
if !ok {
|
|
return
|
|
}
|
|
v.state = todo
|
|
u.u[key] = v
|
|
}
|
|
|
|
// ForEach iterates for u executes f for each element that is 'todo' and sets it to 'done'.
|
|
func (u U) ForEach() error {
|
|
for k, v := range u.u {
|
|
if v.state == todo {
|
|
v.f()
|
|
}
|
|
v.state = done
|
|
u.u[k] = v
|
|
}
|
|
return nil
|
|
}
|
|
|
|
const (
|
|
todo = 1
|
|
done = 2
|
|
)
|