diff --git a/config/get-safe.go b/config/get-safe.go index 08f8675..d48e94d 100644 --- a/config/get-safe.go +++ b/config/get-safe.go @@ -11,7 +11,7 @@ var ( // GetAsString returns a function that returns the wanted string with high performance. func (cs *safe) GetAsString(name string, fallback string) StringOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeString) value := fallback if valueCache != nil { @@ -23,7 +23,7 @@ func (cs *safe) GetAsString(name string, fallback string) StringOption { lock.Lock() defer lock.Unlock() if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeString) if valueCache != nil { value = valueCache.stringVal @@ -37,7 +37,7 @@ func (cs *safe) GetAsString(name string, fallback string) StringOption { // GetAsStringArray returns a function that returns the wanted string with high performance. func (cs *safe) GetAsStringArray(name string, fallback []string) StringArrayOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeStringArray) value := fallback if valueCache != nil { @@ -49,7 +49,7 @@ func (cs *safe) GetAsStringArray(name string, fallback []string) StringArrayOpti lock.Lock() defer lock.Unlock() if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeStringArray) if valueCache != nil { value = valueCache.stringArrayVal @@ -63,7 +63,7 @@ func (cs *safe) GetAsStringArray(name string, fallback []string) StringArrayOpti // GetAsInt returns a function that returns the wanted int with high performance. func (cs *safe) GetAsInt(name string, fallback int64) IntOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeInt) value := fallback if valueCache != nil { @@ -75,7 +75,7 @@ func (cs *safe) GetAsInt(name string, fallback int64) IntOption { lock.Lock() defer lock.Unlock() if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeInt) if valueCache != nil { value = valueCache.intVal @@ -89,7 +89,7 @@ func (cs *safe) GetAsInt(name string, fallback int64) IntOption { // GetAsBool returns a function that returns the wanted int with high performance. func (cs *safe) GetAsBool(name string, fallback bool) BoolOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeBool) value := fallback if valueCache != nil { @@ -101,7 +101,7 @@ func (cs *safe) GetAsBool(name string, fallback bool) BoolOption { lock.Lock() defer lock.Unlock() if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeBool) if valueCache != nil { value = valueCache.boolVal diff --git a/config/get.go b/config/get.go index df1cd08..5e5755f 100644 --- a/config/get.go +++ b/config/get.go @@ -52,7 +52,7 @@ func getValueCache(name string, option *Option, requestedType uint8) (*Option, * // GetAsString returns a function that returns the wanted string with high performance. func GetAsString(name string, fallback string) StringOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeString) value := fallback if valueCache != nil { @@ -61,7 +61,7 @@ func GetAsString(name string, fallback string) StringOption { return func() string { if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeString) if valueCache != nil { value = valueCache.stringVal @@ -75,7 +75,7 @@ func GetAsString(name string, fallback string) StringOption { // GetAsStringArray returns a function that returns the wanted string with high performance. func GetAsStringArray(name string, fallback []string) StringArrayOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeStringArray) value := fallback if valueCache != nil { @@ -84,7 +84,7 @@ func GetAsStringArray(name string, fallback []string) StringArrayOption { return func() []string { if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeStringArray) if valueCache != nil { value = valueCache.stringArrayVal @@ -98,7 +98,7 @@ func GetAsStringArray(name string, fallback []string) StringArrayOption { // GetAsInt returns a function that returns the wanted int with high performance. func GetAsInt(name string, fallback int64) IntOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeInt) value := fallback if valueCache != nil { @@ -107,7 +107,7 @@ func GetAsInt(name string, fallback int64) IntOption { return func() int64 { if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeInt) if valueCache != nil { value = valueCache.intVal @@ -121,7 +121,7 @@ func GetAsInt(name string, fallback int64) IntOption { // GetAsBool returns a function that returns the wanted int with high performance. func GetAsBool(name string, fallback bool) BoolOption { - valid := GetValidityFlag() + valid := getValidityFlag() option, valueCache := getValueCache(name, nil, OptTypeBool) value := fallback if valueCache != nil { @@ -130,7 +130,7 @@ func GetAsBool(name string, fallback bool) BoolOption { return func() bool { if !valid.IsSet() { - valid = GetValidityFlag() + valid = getValidityFlag() option, valueCache = getValueCache(name, option, OptTypeBool) if valueCache != nil { value = valueCache.boolVal diff --git a/config/set.go b/config/set.go index a0f6789..0c007ac 100644 --- a/config/set.go +++ b/config/set.go @@ -19,8 +19,8 @@ var ( validityFlagLock sync.RWMutex ) -// GetValidityFlag returns a flag that signifies if the configuration has been changed. This flag must not be changed, only read. -func GetValidityFlag() *abool.AtomicBool { +// getValidityFlag returns a flag that signifies if the configuration has been changed. This flag must not be changed, only read. +func getValidityFlag() *abool.AtomicBool { validityFlagLock.RLock() defer validityFlagLock.RUnlock() return validityFlag diff --git a/config/validity.go b/config/validity.go new file mode 100644 index 0000000..d42e91b --- /dev/null +++ b/config/validity.go @@ -0,0 +1,30 @@ +package config + +import ( + "github.com/tevino/abool" +) + +// ValidityFlag is a flag that signifies if the configuration has been changed. It is not safe for concurrent use. +type ValidityFlag struct { + flag *abool.AtomicBool +} + +// NewValidityFlag returns a flag that signifies if the configuration has been changed. +func NewValidityFlag() *ValidityFlag { + vf := &ValidityFlag{} + vf.Refresh() + return vf +} + +// IsValid returns if the configuration is still valid. +func (vf *ValidityFlag) IsValid() bool { + return vf.flag.IsSet() +} + +// Refresh refreshes the flag and makes it reusable. +func (vf *ValidityFlag) Refresh() { + validityFlagLock.RLock() + defer validityFlagLock.RUnlock() + + vf.flag = validityFlag +}