Add validity flag for out of package usage.

This commit is contained in:
Daniel 2020-03-20 22:57:54 +01:00
parent e349fb4f5b
commit bff3f5a1dd
4 changed files with 48 additions and 18 deletions

View file

@ -11,7 +11,7 @@ var (
// GetAsString returns a function that returns the wanted string with high performance. // GetAsString returns a function that returns the wanted string with high performance.
func (cs *safe) GetAsString(name string, fallback string) StringOption { func (cs *safe) GetAsString(name string, fallback string) StringOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeString) option, valueCache := getValueCache(name, nil, OptTypeString)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -23,7 +23,7 @@ func (cs *safe) GetAsString(name string, fallback string) StringOption {
lock.Lock() lock.Lock()
defer lock.Unlock() defer lock.Unlock()
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeString) option, valueCache = getValueCache(name, option, OptTypeString)
if valueCache != nil { if valueCache != nil {
value = valueCache.stringVal 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. // GetAsStringArray returns a function that returns the wanted string with high performance.
func (cs *safe) GetAsStringArray(name string, fallback []string) StringArrayOption { func (cs *safe) GetAsStringArray(name string, fallback []string) StringArrayOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeStringArray) option, valueCache := getValueCache(name, nil, OptTypeStringArray)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -49,7 +49,7 @@ func (cs *safe) GetAsStringArray(name string, fallback []string) StringArrayOpti
lock.Lock() lock.Lock()
defer lock.Unlock() defer lock.Unlock()
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeStringArray) option, valueCache = getValueCache(name, option, OptTypeStringArray)
if valueCache != nil { if valueCache != nil {
value = valueCache.stringArrayVal 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. // GetAsInt returns a function that returns the wanted int with high performance.
func (cs *safe) GetAsInt(name string, fallback int64) IntOption { func (cs *safe) GetAsInt(name string, fallback int64) IntOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeInt) option, valueCache := getValueCache(name, nil, OptTypeInt)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -75,7 +75,7 @@ func (cs *safe) GetAsInt(name string, fallback int64) IntOption {
lock.Lock() lock.Lock()
defer lock.Unlock() defer lock.Unlock()
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeInt) option, valueCache = getValueCache(name, option, OptTypeInt)
if valueCache != nil { if valueCache != nil {
value = valueCache.intVal 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. // GetAsBool returns a function that returns the wanted int with high performance.
func (cs *safe) GetAsBool(name string, fallback bool) BoolOption { func (cs *safe) GetAsBool(name string, fallback bool) BoolOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeBool) option, valueCache := getValueCache(name, nil, OptTypeBool)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -101,7 +101,7 @@ func (cs *safe) GetAsBool(name string, fallback bool) BoolOption {
lock.Lock() lock.Lock()
defer lock.Unlock() defer lock.Unlock()
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeBool) option, valueCache = getValueCache(name, option, OptTypeBool)
if valueCache != nil { if valueCache != nil {
value = valueCache.boolVal value = valueCache.boolVal

View file

@ -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. // GetAsString returns a function that returns the wanted string with high performance.
func GetAsString(name string, fallback string) StringOption { func GetAsString(name string, fallback string) StringOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeString) option, valueCache := getValueCache(name, nil, OptTypeString)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -61,7 +61,7 @@ func GetAsString(name string, fallback string) StringOption {
return func() string { return func() string {
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeString) option, valueCache = getValueCache(name, option, OptTypeString)
if valueCache != nil { if valueCache != nil {
value = valueCache.stringVal 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. // GetAsStringArray returns a function that returns the wanted string with high performance.
func GetAsStringArray(name string, fallback []string) StringArrayOption { func GetAsStringArray(name string, fallback []string) StringArrayOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeStringArray) option, valueCache := getValueCache(name, nil, OptTypeStringArray)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -84,7 +84,7 @@ func GetAsStringArray(name string, fallback []string) StringArrayOption {
return func() []string { return func() []string {
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeStringArray) option, valueCache = getValueCache(name, option, OptTypeStringArray)
if valueCache != nil { if valueCache != nil {
value = valueCache.stringArrayVal 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. // GetAsInt returns a function that returns the wanted int with high performance.
func GetAsInt(name string, fallback int64) IntOption { func GetAsInt(name string, fallback int64) IntOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeInt) option, valueCache := getValueCache(name, nil, OptTypeInt)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -107,7 +107,7 @@ func GetAsInt(name string, fallback int64) IntOption {
return func() int64 { return func() int64 {
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeInt) option, valueCache = getValueCache(name, option, OptTypeInt)
if valueCache != nil { if valueCache != nil {
value = valueCache.intVal 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. // GetAsBool returns a function that returns the wanted int with high performance.
func GetAsBool(name string, fallback bool) BoolOption { func GetAsBool(name string, fallback bool) BoolOption {
valid := GetValidityFlag() valid := getValidityFlag()
option, valueCache := getValueCache(name, nil, OptTypeBool) option, valueCache := getValueCache(name, nil, OptTypeBool)
value := fallback value := fallback
if valueCache != nil { if valueCache != nil {
@ -130,7 +130,7 @@ func GetAsBool(name string, fallback bool) BoolOption {
return func() bool { return func() bool {
if !valid.IsSet() { if !valid.IsSet() {
valid = GetValidityFlag() valid = getValidityFlag()
option, valueCache = getValueCache(name, option, OptTypeBool) option, valueCache = getValueCache(name, option, OptTypeBool)
if valueCache != nil { if valueCache != nil {
value = valueCache.boolVal value = valueCache.boolVal

View file

@ -19,8 +19,8 @@ var (
validityFlagLock sync.RWMutex validityFlagLock sync.RWMutex
) )
// GetValidityFlag returns a flag that signifies if the configuration has been changed. This flag must not be changed, only read. // getValidityFlag returns a flag that signifies if the configuration has been changed. This flag must not be changed, only read.
func GetValidityFlag() *abool.AtomicBool { func getValidityFlag() *abool.AtomicBool {
validityFlagLock.RLock() validityFlagLock.RLock()
defer validityFlagLock.RUnlock() defer validityFlagLock.RUnlock()
return validityFlag return validityFlag

30
config/validity.go Normal file
View file

@ -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
}