"sync/atomic"
"unsafe"
- "git.fd.io/govpp.git/adapter"
+ "go.fd.io/govpp/adapter"
)
type statSegmentV1 struct {
}
type statSegDirectoryEntryV1 struct {
- directoryType statDirectoryType
+ directoryType dirType
// unionData can represent:
// - offset
// - index
}
}
-func (ss *statSegmentV1) GetDirectoryVector() (unsafe.Pointer, error) {
+func (ss *statSegmentV1) GetDirectoryVector() dirVector {
dirOffset, _, _ := ss.getOffsets()
- return unsafe.Pointer(&ss.sharedHeader[dirOffset]), nil
+ return dirVector(&ss.sharedHeader[dirOffset])
}
-func (ss *statSegmentV1) GetErrorVector() (unsafe.Pointer, error) {
+func (ss *statSegmentV1) getErrorVector() (unsafe.Pointer, error) {
return nil, fmt.Errorf("error vector is not defined for stats API v1")
}
-func (ss *statSegmentV1) GetStatDirOnIndex(p unsafe.Pointer, index uint32) (unsafe.Pointer, statDirectoryName, statDirectoryType) {
- statSegDir := unsafe.Pointer(uintptr(p) + uintptr(index)*unsafe.Sizeof(statSegDirectoryEntryV1{}))
+func (ss *statSegmentV1) GetStatDirOnIndex(v dirVector, index uint32) (dirSegment, dirName, adapter.StatType) {
+ statSegDir := dirSegment(uintptr(v) + uintptr(index)*unsafe.Sizeof(statSegDirectoryEntryV1{}))
dir := (*statSegDirectoryEntryV1)(statSegDir)
var name []byte
for n := 0; n < len(dir.name); n++ {
break
}
}
- return statSegDir, name, dir.directoryType
+ return statSegDir, name, getStatType(dir.directoryType, true)
}
func (ss *statSegmentV1) GetEpoch() (int64, bool) {
return sh.epoch, sh.inProgress != 0
}
-func (ss *statSegmentV1) CopyEntryData(statSegDir unsafe.Pointer) adapter.Stat {
- dirEntry := (*statSegDirectoryEntryV1)(statSegDir)
- dirType := adapter.StatType(dirEntry.directoryType)
+func (ss *statSegmentV1) CopyEntryData(segment dirSegment, _ uint32) adapter.Stat {
+ dirEntry := (*statSegDirectoryEntryV1)(segment)
+ typ := getStatType(dirEntry.directoryType, true)
- switch dirType {
- case statDirScalarIndex:
+ switch typ {
+ case adapter.ScalarIndex:
return adapter.ScalarStat(dirEntry.unionData)
- case statDirErrorIndex:
- if dirEntry.unionData == 0 {
- debugf("offset invalid for %s", dirEntry.name)
- break
- } else if dirEntry.unionData >= uint64(len(ss.sharedHeader)) {
+ case adapter.ErrorIndex:
+ if dirEntry.unionData >= uint64(len(ss.sharedHeader)) {
debugf("offset out of range for %s", dirEntry.name)
break
}
_, errOffset, _ := ss.getOffsets()
- offsetVector := unsafe.Pointer(&ss.sharedHeader[errOffset])
+ offsetVector := dirVector(&ss.sharedHeader[errOffset])
- var errData adapter.Counter
+ var errData []adapter.Counter
vecLen := *(*uint32)(vectorLen(offsetVector))
for i := uint32(0); i < vecLen; i++ {
cb := *(*uint64)(statSegPointer(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
offset := uintptr(cb) + uintptr(dirEntry.unionData)*unsafe.Sizeof(adapter.Counter(0))
debugf("error index, cb: %d, offset: %d", cb, offset)
- val := *(*adapter.Counter)(statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), offset))
- errData += val
+ val := *(*adapter.Counter)(statSegPointer(dirVector(&ss.sharedHeader[0]), offset))
+ errData = append(errData, val)
}
return adapter.ErrorStat(errData)
- case statDirCounterVectorSimple:
+ case adapter.SimpleCounterVector:
if dirEntry.unionData == 0 {
debugf("offset invalid for %s", dirEntry.name)
break
break
}
- vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[dirEntry.unionData])))
- offsetVector := statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
+ vecLen := *(*uint32)(vectorLen(dirVector(&ss.sharedHeader[dirEntry.unionData])))
+ offsetVector := statSegPointer(dirVector(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
data := make([][]adapter.Counter, vecLen)
for i := uint32(0); i < vecLen; i++ {
cb := *(*uint64)(statSegPointer(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
- counterVec := unsafe.Pointer(&ss.sharedHeader[uintptr(cb)])
+ counterVec := dirVector(&ss.sharedHeader[uintptr(cb)])
vecLen2 := *(*uint32)(vectorLen(counterVec))
data[i] = make([]adapter.Counter, vecLen2)
for j := uint32(0); j < vecLen2; j++ {
}
return adapter.SimpleCounterStat(data)
- case statDirCounterVectorCombined:
+ case adapter.CombinedCounterVector:
if dirEntry.unionData == 0 {
debugf("offset invalid for %s", dirEntry.name)
break
break
}
- vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[dirEntry.unionData])))
- offsetVector := statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
+ vecLen := *(*uint32)(vectorLen(dirVector(&ss.sharedHeader[dirEntry.unionData])))
+ offsetVector := statSegPointer(dirVector(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
data := make([][]adapter.CombinedCounter, vecLen)
for i := uint32(0); i < vecLen; i++ {
cb := *(*uint64)(statSegPointer(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
- counterVec := unsafe.Pointer(&ss.sharedHeader[uintptr(cb)])
+ counterVec := dirVector(&ss.sharedHeader[uintptr(cb)])
vecLen2 := *(*uint32)(vectorLen(counterVec))
data[i] = make([]adapter.CombinedCounter, vecLen2)
for j := uint32(0); j < vecLen2; j++ {
}
return adapter.CombinedCounterStat(data)
- case statDirNameVector:
+ case adapter.NameVector:
if dirEntry.unionData == 0 {
debugf("offset invalid for %s", dirEntry.name)
break
break
}
- vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[dirEntry.unionData])))
- offsetVector := statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
+ vecLen := *(*uint32)(vectorLen(dirVector(&ss.sharedHeader[dirEntry.unionData])))
+ offsetVector := statSegPointer(dirVector(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
data := make([]adapter.Name, vecLen)
for i := uint32(0); i < vecLen; i++ {
debugf("name vector out of range for %s (%v)", dirEntry.name, i)
continue
}
- nameVec := unsafe.Pointer(&ss.sharedHeader[cb])
+ nameVec := dirVector(&ss.sharedHeader[cb])
vecLen2 := *(*uint32)(vectorLen(nameVec))
nameStr := make([]byte, 0, vecLen2)
}
return adapter.NameStat(data)
- case statDirEmpty:
+ case adapter.Empty:
// no-op
+ case adapter.Symlink:
+ debugf("Symlinks are not supported for stats v1")
+
default:
// TODO: monitor occurrences with metrics
debugf("Unknown type %d for stat entry: %q", dirEntry.directoryType, dirEntry.name)
return nil
}
-func (ss *statSegmentV1) UpdateEntryData(statSegDir unsafe.Pointer, stat *adapter.Stat) error {
- dirEntry := (*statSegDirectoryEntryV1)(statSegDir)
+func (ss *statSegmentV1) UpdateEntryData(segment dirSegment, stat *adapter.Stat) error {
+ dirEntry := (*statSegDirectoryEntryV1)(segment)
switch (*stat).(type) {
case adapter.ScalarStat:
*stat = adapter.ScalarStat(dirEntry.unionData)
}
_, errOffset, _ := ss.getOffsets()
- offsetVector := unsafe.Pointer(&ss.sharedHeader[errOffset])
+ offsetVector := dirVector(&ss.sharedHeader[errOffset])
- var errData adapter.Counter
+ var errData []adapter.Counter
- vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[errOffset])))
+ vecLen := *(*uint32)(vectorLen(dirVector(&ss.sharedHeader[errOffset])))
for i := uint32(0); i < vecLen; i++ {
cb := *(*uint64)(statSegPointer(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
offset := uintptr(cb) + uintptr(dirEntry.unionData)*unsafe.Sizeof(adapter.Counter(0))
- val := *(*adapter.Counter)(statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), offset))
- errData += val
+ val := *(*adapter.Counter)(statSegPointer(dirVector(&ss.sharedHeader[0]), offset))
+ errData = append(errData, val)
}
*stat = adapter.ErrorStat(errData)
break
}
- vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[dirEntry.unionData])))
- offsetVector := statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
+ vecLen := *(*uint32)(vectorLen(dirVector(&ss.sharedHeader[dirEntry.unionData])))
+ offsetVector := statSegPointer(dirVector(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
data := (*stat).(adapter.SimpleCounterStat)
if uint32(len(data)) != vecLen {
}
for i := uint32(0); i < vecLen; i++ {
cb := *(*uint64)(statSegPointer(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
- counterVec := unsafe.Pointer(&ss.sharedHeader[uintptr(cb)])
+ counterVec := dirVector(&ss.sharedHeader[uintptr(cb)])
vecLen2 := *(*uint32)(vectorLen(counterVec))
simpleData := data[i]
if uint32(len(simpleData)) != vecLen2 {
break
}
- vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[dirEntry.unionData])))
- offsetVector := statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
+ vecLen := *(*uint32)(vectorLen(dirVector(&ss.sharedHeader[dirEntry.unionData])))
+ offsetVector := statSegPointer(dirVector(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
data := (*stat).(adapter.CombinedCounterStat)
if uint32(len(data)) != vecLen {
}
for i := uint32(0); i < vecLen; i++ {
cb := *(*uint64)(statSegPointer(offsetVector, uintptr(i)*unsafe.Sizeof(uint64(0))))
- counterVec := unsafe.Pointer(&ss.sharedHeader[uintptr(cb)])
+ counterVec := dirVector(&ss.sharedHeader[uintptr(cb)])
vecLen2 := *(*uint32)(vectorLen(counterVec))
combData := data[i]
if uint32(len(combData)) != vecLen2 {
break
}
- vecLen := *(*uint32)(vectorLen(unsafe.Pointer(&ss.sharedHeader[dirEntry.unionData])))
- offsetVector := statSegPointer(unsafe.Pointer(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
+ vecLen := *(*uint32)(vectorLen(dirVector(&ss.sharedHeader[dirEntry.unionData])))
+ offsetVector := statSegPointer(dirVector(&ss.sharedHeader[0]), uintptr(dirEntry.offsetVector))
data := (*stat).(adapter.NameStat)
if uint32(len(data)) != vecLen {
if cb == 0 {
continue
}
- nameVec := unsafe.Pointer(&ss.sharedHeader[cb])
+ nameVec := dirVector(&ss.sharedHeader[cb])
vecLen2 := *(*uint32)(vectorLen(nameVec))
nameData := data[i]