Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

log: use atomic types #27763

Merged
merged 4 commits into from
Aug 4, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions log/format.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,19 +33,19 @@ var locationTrims = []string{
// format output.
func PrintOrigins(print bool) {
if print {
atomic.StoreUint32(&locationEnabled, 1)
locationEnabled.Store(true)
} else {
atomic.StoreUint32(&locationEnabled, 0)
locationEnabled.Store(false)
}
}

// locationEnabled is an atomic flag controlling whether the terminal formatter
// should append the log locations too when printing entries.
var locationEnabled uint32
var locationEnabled atomic.Bool

// locationLength is the maxmimum path length encountered, which all logs are
// padded to to aid in alignment.
var locationLength uint32
var locationLength atomic.Uint32

// fieldPadding is a global map with maximum field value lengths seen until now
// to allow padding log contexts in a bit smarter way.
Expand Down Expand Up @@ -109,17 +109,17 @@ func TerminalFormat(usecolor bool) Format {

b := &bytes.Buffer{}
lvl := r.Lvl.AlignedString()
if atomic.LoadUint32(&locationEnabled) != 0 {
if locationEnabled.Load() {
// Log origin printing was requested, format the location path and line number
location := fmt.Sprintf("%+v", r.Call)
for _, prefix := range locationTrims {
location = strings.TrimPrefix(location, prefix)
}
// Maintain the maximum location length for fancyer alignment
align := int(atomic.LoadUint32(&locationLength))
align := int(locationLength.Load())
if align < len(location) {
align = len(location)
atomic.StoreUint32(&locationLength, uint32(align))
locationLength.Store(uint32(align))
}
padding := strings.Repeat(" ", align-len(location))

Expand Down
18 changes: 9 additions & 9 deletions log/handler_glog.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ var errTraceSyntax = errors.New("expect file.go:234")
type GlogHandler struct {
origin Handler // The origin handler this wraps

level uint32 // Current log level, atomically accessible
override uint32 // Flag whether overrides are used, atomically accessible
backtrace uint32 // Flag whether backtrace location is set
level atomic.Uint32 // Current log level, atomically accessible
override atomic.Bool // Flag whether overrides are used, atomically accessible
backtrace atomic.Bool // Flag whether backtrace location is set

patterns []pattern // Current list of patterns to override with
siteCache map[uintptr]Lvl // Cache of callsite pattern evaluations
Expand Down Expand Up @@ -72,7 +72,7 @@ type pattern struct {
// Verbosity sets the glog verbosity ceiling. The verbosity of individual packages
// and source files can be raised using Vmodule.
func (h *GlogHandler) Verbosity(level Lvl) {
atomic.StoreUint32(&h.level, uint32(level))
h.level.Store(uint32(level))
}

// Vmodule sets the glog verbosity pattern.
Expand Down Expand Up @@ -138,7 +138,7 @@ func (h *GlogHandler) Vmodule(ruleset string) error {

h.patterns = filter
h.siteCache = make(map[uintptr]Lvl)
atomic.StoreUint32(&h.override, uint32(len(filter)))
h.override.Store(len(filter) != 0)

return nil
}
Expand Down Expand Up @@ -171,7 +171,7 @@ func (h *GlogHandler) BacktraceAt(location string) error {
defer h.lock.Unlock()

h.location = location
atomic.StoreUint32(&h.backtrace, uint32(len(location)))
h.backtrace.Store(len(location) > 0)

return nil
}
Expand All @@ -180,7 +180,7 @@ func (h *GlogHandler) BacktraceAt(location string) error {
// and backtrace filters, finally emitting it if either allow it through.
func (h *GlogHandler) Log(r *Record) error {
// If backtracing is requested, check whether this is the callsite
if atomic.LoadUint32(&h.backtrace) > 0 {
if h.backtrace.Load() {
// Everything below here is slow. Although we could cache the call sites the
// same way as for vmodule, backtracing is so rare it's not worth the extra
// complexity.
Expand All @@ -198,11 +198,11 @@ func (h *GlogHandler) Log(r *Record) error {
}
}
// If the global log level allows, fast track logging
if atomic.LoadUint32(&h.level) >= uint32(r.Lvl) {
if h.level.Load() >= uint32(r.Lvl) {
return h.origin.Log(r)
}
// If no local overrides are present, fast track skipping
if atomic.LoadUint32(&h.override) == 0 {
if !h.override.Load() {
return nil
}
// Check callsite cache for previously calculated log levels
Expand Down