| | |
| | | |
| | | // []byte struct |
| | | type ShmDataInfo struct { |
| | | Capacity uint32 |
| | | Len uint32 |
| | | Cache []byte |
| | | } |
| | | |
| | |
| | | )) |
| | | } |
| | | |
| | | 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)) |
| | | } |
| | |
| | | } |
| | | 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) |
| | |
| | | } |
| | | |
| | | 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 |
| | | } |
| | |
| | | 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) |
| | | } |
| | | |
| | |
| | | // 从共享内存中读取数据使用: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 |
| | | } |
| | |
| | | // 更新数据到共享内存使用: attach->ConvertShmToData->修改data数据,业务处理结束后->UpdateDataToShm->detach |
| | | func UpdateDataToShm(data, shmData []byte) { |
| | | sdi := shmData2Info(shmData) |
| | | sdi.Capacity = uint32(len(data)) |
| | | sdi.Len = uint32(len(data)) |
| | | } |