package nettrace import "time" type evtRing struct { evts []event max int pos int // Points to the latest element. firstDrop time.Time } func newEvtRing(n int) *evtRing { return &evtRing{ max: n, pos: -1, } } func (r *evtRing) Add(e *event) { if len(r.evts) < r.max { r.evts = append(r.evts, *e) r.pos++ return } r.pos = (r.pos + 1) % r.max // Record the first drop as the time of the first dropped message. if r.firstDrop.IsZero() { r.firstDrop = r.evts[r.pos].When } r.evts[r.pos] = *e } func (r *evtRing) Do(f func(e *event)) { for i := 0; i < len(r.evts); i++ { // Go from older to newer by starting at (r.pos+1). pos := (r.pos + 1 + i) % len(r.evts) f(&r.evts[pos]) } }