shmdata 的shmData转内存slice的capacity修改成实际shmdata的长度减去预留32字节记录Len的字段
1个文件已修改
25 ■■■■ 已修改文件
shmData.go 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
shmData.go
@@ -7,7 +7,7 @@
// []byte struct
type ShmDataInfo struct {
    Capacity uint32
    Len uint32
    Cache    []byte
}
@@ -18,11 +18,12 @@
    ))
}
const SHMSLICEOFFSET int = 32
// ConvertToSlice convert to []byte
func ptr2Slice(s unsafe.Pointer, size int) []byte {
func ptr2Slice(s unsafe.Pointer, size,cap int) []byte {
    var x reflect.SliceHeader
    x.Len = size
    x.Cap = size
    x.Cap = cap
    x.Data = uintptr(s)
    return *(*[]byte)(unsafe.Pointer(&x))
}
@@ -37,12 +38,12 @@
    }
    sdi := shmData2Info(shmData)
    if len(data) <= len(shmData) {
        sdi.Capacity = uint32(len(data))
        sdi.Len = uint32(len(data))
    } else {
        sdi.Capacity = uint32(len(shmData))
        sdi.Len = uint32(len(shmData))
    }
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Len), len(shmData)-SHMSLICEOFFSET)
    copy(tmpData, data)
    err = Detach(shmData)
@@ -62,7 +63,7 @@
    }
    sdi := shmData2Info(shmData)
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Len), len(shmData)-SHMSLICEOFFSET)
    return tmpData, nil
}
@@ -74,12 +75,12 @@
func DeepCopyDataToShm(memData,shmData []byte) {
    sdi := shmData2Info(shmData)
    if len(memData) <= len(shmData) {
        sdi.Capacity = uint32(len(memData))
        sdi.Len = uint32(len(memData))
    } else {
        sdi.Capacity = uint32(len(shmData))
        sdi.Len = uint32(len(shmData))
    }
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Len), len(shmData)-SHMSLICEOFFSET)
    copy(tmpData, memData)
}
@@ -89,7 +90,7 @@
// 从共享内存中读取数据使用:attach->ConvertShmToData->只读,业务处理结束后->detach
func ConvertShmToData(shmData []byte) []byte {
    sdi := shmData2Info(shmData)
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
    tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Len), len(shmData)-SHMSLICEOFFSET)
    return tmpData
}
@@ -99,5 +100,5 @@
// 更新数据到共享内存使用: attach->ConvertShmToData->修改data数据,业务处理结束后->UpdateDataToShm->detach
func UpdateDataToShm(data, shmData []byte) {
    sdi := shmData2Info(shmData)
    sdi.Capacity = uint32(len(data))
    sdi.Len = uint32(len(data))
}