10 MaxWaitInProgress = time.Millisecond * 100
11 CheckDelayInProgress = time.Microsecond * 10
14 type sharedHeaderBase struct {
22 type sharedHeaderV0 struct {
26 type sharedHeader struct {
31 func (h *sharedHeader) legacyVersion() bool {
32 // older VPP (<=19.04) did not have version in stat segment header
33 // we try to provide fallback support by skipping it in header
34 if h.version > maxVersion && h.inProgress > 1 && h.epoch == 0 {
40 func loadSharedHeader(b []byte) (header sharedHeader) {
41 h := (*sharedHeader)(unsafe.Pointer(&b[0]))
42 header.version = atomic.LoadUint64(&h.version)
43 header.epoch = atomic.LoadInt64(&h.epoch)
44 header.inProgress = atomic.LoadInt64(&h.inProgress)
45 header.directoryOffset = atomic.LoadInt64(&h.directoryOffset)
46 header.errorOffset = atomic.LoadInt64(&h.errorOffset)
47 header.statsOffset = atomic.LoadInt64(&h.statsOffset)
51 func loadSharedHeaderLegacy(b []byte) (header sharedHeader) {
52 h := (*sharedHeaderV0)(unsafe.Pointer(&b[0]))
54 header.epoch = atomic.LoadInt64(&h.epoch)
55 header.inProgress = atomic.LoadInt64(&h.inProgress)
56 header.directoryOffset = atomic.LoadInt64(&h.directoryOffset)
57 header.errorOffset = atomic.LoadInt64(&h.errorOffset)
58 header.statsOffset = atomic.LoadInt64(&h.statsOffset)
62 type statSegAccess struct {
66 func (c *statSegment) accessStart() statSegAccess {
69 epoch, inprog := c.getEpoch()
71 if time.Since(t) > MaxWaitInProgress {
72 return statSegAccess{}
74 time.Sleep(CheckDelayInProgress)
76 epoch, inprog = c.getEpoch()
83 func (c *statSegment) accessEnd(acc *statSegAccess) bool {
84 epoch, inprog := c.getEpoch()
85 if acc.epoch != epoch || inprog {
91 type vecHeader struct {
96 func vectorLen(v unsafe.Pointer) uint64 {
97 vec := *(*vecHeader)(unsafe.Pointer(uintptr(v) - unsafe.Sizeof(uint64(0))))
102 func statSegPointer(p unsafe.Pointer, offset uintptr) unsafe.Pointer {
103 return unsafe.Pointer(uintptr(p) + offset)