package statsclient
import (
- "fmt"
"sync/atomic"
"unsafe"
}
}
-func (ss *statSegmentV2) GetDirectoryVector() (unsafe.Pointer, error) {
+func (ss *statSegmentV2) GetDirectoryVector() unsafe.Pointer {
header := ss.loadSharedHeader(ss.sharedHeader)
return ss.adjust(unsafe.Pointer(&header.dirVector))
}
return adapter.ScalarStat(dirEntry.unionData)
case statDirErrorIndex:
- dirVector, err := ss.getErrorVector()
- if err != nil {
+ dirVector := ss.getErrorVector()
+ if dirVector == nil {
debugf("error vector pointer is out of range for %s", dirEntry.name)
return nil
}
vecLen := *(*uint32)(vectorLen(dirVector))
- var errData adapter.Counter
+ var errData []adapter.Counter
for i := uint32(0); i < vecLen; i++ {
cb := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
- cbVal, err := ss.adjust(vectorLen(cb))
- if err != nil {
+ cbVal := ss.adjust(vectorLen(cb))
+ if cbVal == nil {
debugf("error counter pointer out of range")
continue
}
offset := uintptr(dirEntry.unionData) * unsafe.Sizeof(adapter.Counter(0))
val := *(*adapter.Counter)(statSegPointer(cbVal, offset))
- errData += val
+ errData = append(errData, val)
}
return adapter.ErrorStat(errData)
case statDirCounterVectorSimple:
- dirVector, err := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
- if err != nil {
+ dirVector := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
+ if dirVector == nil {
debugf("data vector pointer is out of range for %s", dirEntry.name)
return nil
}
data := make([][]adapter.Counter, vecLen)
for i := uint32(0); i < vecLen; i++ {
counterVectorOffset := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
- counterVector, err := ss.adjust(vectorLen(counterVectorOffset))
- if err != nil {
+ counterVector := ss.adjust(vectorLen(counterVectorOffset))
+ if counterVector == nil {
debugf("counter (vector simple) pointer out of range")
continue
}
return adapter.SimpleCounterStat(data)
case statDirCounterVectorCombined:
- dirVector, err := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
- if err != nil {
+ dirVector := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
+ if dirVector == nil {
debugf("data vector pointer is out of range for %s", dirEntry.name)
return nil
}
data := make([][]adapter.CombinedCounter, vecLen)
for i := uint32(0); i < vecLen; i++ {
counterVectorOffset := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
- counterVector, err := ss.adjust(vectorLen(counterVectorOffset))
- if err != nil {
+ counterVector := ss.adjust(vectorLen(counterVectorOffset))
+ if counterVector == nil {
debugf("counter (vector combined) pointer out of range")
continue
}
return adapter.CombinedCounterStat(data)
case statDirNameVector:
- dirVector, err := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
- if err != nil {
+ dirVector := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
+ if dirVector == nil {
debugf("data vector pointer is out of range for %s", dirEntry.name)
return nil
}
debugf("name vector out of range for %s (%v)", dirEntry.name, i)
continue
}
- nameVector, err := ss.adjust(vectorLen(nameVectorOffset))
- if err != nil {
+ nameVector := ss.adjust(vectorLen(nameVectorOffset))
+ if nameVector == nil {
debugf("name data pointer out of range")
continue
}
return adapter.NameStat(data)
case statDirEmpty:
+ return adapter.EmptyStat("<none>")
// no-op
default:
*stat = adapter.ScalarStat(dirEntry.unionData)
case adapter.ErrorStat:
- dirVector, err := ss.getErrorVector()
- if err != nil {
+ dirVector := ss.getErrorVector()
+ if dirVector == nil {
debugf("error vector pointer is out of range for %s", dirEntry.name)
return nil
}
vecLen := *(*uint32)(vectorLen(dirVector))
- var errData adapter.Counter
+ var errData []adapter.Counter
for i := uint32(0); i < vecLen; i++ {
cb := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
- cbVal, err := ss.adjust(vectorLen(cb))
- if err != nil {
+ cbVal := ss.adjust(vectorLen(cb))
+ if cbVal == nil {
debugf("error counter pointer out of range")
continue
}
offset := uintptr(dirEntry.unionData) * unsafe.Sizeof(adapter.Counter(0))
val := *(*adapter.Counter)(statSegPointer(cbVal, offset))
- errData += val
+ errData = append(errData, val)
}
*stat = adapter.ErrorStat(errData)
case adapter.SimpleCounterStat:
- dirVector, err := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
- if err != nil {
+ dirVector := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
+ if dirVector == nil {
debugf("data vector pointer is out of range for %s", dirEntry.name)
return nil
}
}
for i := uint32(0); i < vecLen; i++ {
counterVectorOffset := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
- counterVector, err := ss.adjust(vectorLen(counterVectorOffset))
- if err != nil {
+ counterVector := ss.adjust(vectorLen(counterVectorOffset))
+ if counterVector == nil {
debugf("counter (vector simple) pointer out of range")
continue
}
}
case adapter.CombinedCounterStat:
- dirVector, err := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
- if err != nil {
+ dirVector := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
+ if dirVector == nil {
debugf("data vector pointer is out of range for %s", dirEntry.name)
return nil
}
data := (*stat).(adapter.CombinedCounterStat)
for i := uint32(0); i < vecLen; i++ {
counterVectorOffset := statSegPointer(dirVector, uintptr(i+1)*unsafe.Sizeof(uint64(0)))
- counterVector, err := ss.adjust(vectorLen(counterVectorOffset))
- if err != nil {
+ counterVector := ss.adjust(vectorLen(counterVectorOffset))
+ if counterVector == nil {
debugf("counter (vector combined) pointer out of range")
continue
}
}
case adapter.NameStat:
- dirVector, err := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
- if err != nil {
+ dirVector := ss.adjust(unsafe.Pointer(&dirEntry.unionData))
+ if dirVector == nil {
debugf("data vector pointer is out of range for %s", dirEntry.name)
return nil
}
debugf("name vector out of range for %s (%v)", dirEntry.name, i)
continue
}
- nameVector, err := ss.adjust(vectorLen(nameVectorOffset))
- if err != nil {
+ nameVector := ss.adjust(vectorLen(nameVectorOffset))
+ if nameVector == nil {
debugf("name data pointer out of range")
continue
}
// Adjust data pointer using shared header and base and return
// the pointer to a data segment
-func (ss *statSegmentV2) adjust(data unsafe.Pointer) (unsafe.Pointer, error) {
+func (ss *statSegmentV2) adjust(data unsafe.Pointer) unsafe.Pointer {
header := ss.loadSharedHeader(ss.sharedHeader)
adjusted := unsafe.Pointer(uintptr(unsafe.Pointer(&ss.sharedHeader[0])) +
uintptr(*(*uint64)(data)) - uintptr(*(*uint64)(unsafe.Pointer(&header.base))))
if uintptr(unsafe.Pointer(&ss.sharedHeader[len(ss.sharedHeader)-1])) <= uintptr(adjusted) ||
uintptr(unsafe.Pointer(&ss.sharedHeader[0])) >= uintptr(adjusted) {
- return nil, fmt.Errorf("adjusted data out of range for %v", data)
+ return nil
}
- return adjusted, nil
+ return adjusted
}
-func (ss *statSegmentV2) getErrorVector() (unsafe.Pointer, error) {
+func (ss *statSegmentV2) getErrorVector() unsafe.Pointer {
header := ss.loadSharedHeader(ss.sharedHeader)
return ss.adjust(unsafe.Pointer(&header.errorVector))
}