package aghnet import ( "net" "sync/atomic" ) // IPMutFunc is the signature of a function which modifies the IP address // instance. It should be safe for concurrent use. type IPMutFunc func(ip net.IP) // nopIPMutFunc is the IPMutFunc that does nothing. func nopIPMutFunc(net.IP) {} // IPMut is a type-safe wrapper of atomic.Value to store the IPMutFunc. type IPMut struct { f atomic.Value } // NewIPMut returns the new properly initialized *IPMut. The m is guaranteed to // always store non-nil IPMutFunc which is safe to call. func NewIPMut(f IPMutFunc) (m *IPMut) { m = &IPMut{ f: atomic.Value{}, } m.Store(f) return m } // Store sets the IPMutFunc to return from Func. It's safe for concurrent use. // If f is nil, the stored function is the no-op one. func (m *IPMut) Store(f IPMutFunc) { if f == nil { f = nopIPMutFunc } m.f.Store(f) } // Load returns the previously stored IPMutFunc. func (m *IPMut) Load() (f IPMutFunc) { return m.f.Load().(IPMutFunc) }