Ensure alignment of struct members used in sync.atomic functions.

This commit is contained in:
beorn7 2015-05-21 12:19:38 +02:00
parent 438d8aefa8
commit 944920c696
2 changed files with 12 additions and 4 deletions

View File

@ -213,6 +213,13 @@ func newHistogram(desc *Desc, opts HistogramOpts, labelValues ...string) Histogr
} }
type histogram struct { type histogram struct {
// sumBits contains the bits of the float64 representing the sum of all
// observations. sumBits and count have to go first in the struct to
// guarantee alignment for atomic operations.
// http://golang.org/pkg/sync/atomic/#pkg-note-BUG
sumBits uint64
count uint64
SelfCollector SelfCollector
// Note that there is no mutex required. // Note that there is no mutex required.
@ -222,9 +229,6 @@ type histogram struct {
counts []uint64 counts []uint64
labelPairs []*dto.LabelPair labelPairs []*dto.LabelPair
sumBits uint64 // The bits of the float64 representing the sum of all observations.
count uint64
} }
func (h *histogram) Desc() *Desc { func (h *histogram) Desc() *Desc {

View File

@ -43,11 +43,15 @@ var errInconsistentCardinality = errors.New("inconsistent label cardinality")
// ValueType. This is a low-level building block used by the library to back the // ValueType. This is a low-level building block used by the library to back the
// implementations of Counter, Gauge, and Untyped. // implementations of Counter, Gauge, and Untyped.
type value struct { type value struct {
// valBits containst the bits of the represented float64 value. It has
// to go first in the struct to guarantee alignment for atomic
// operations. http://golang.org/pkg/sync/atomic/#pkg-note-BUG
valBits uint64
SelfCollector SelfCollector
desc *Desc desc *Desc
valType ValueType valType ValueType
valBits uint64 // These are the bits of the represented float64 value.
labelPairs []*dto.LabelPair labelPairs []*dto.LabelPair
} }