From 0ac2a08333b72a93e3b5f0b996d3cf954555a6bd Mon Sep 17 00:00:00 2001 From: chenshijun <csj_sky@126.com> Date: 星期一, 30 三月 2020 13:53:16 +0800 Subject: [PATCH] 添加shmData库,支持共享内存中使用[]byte --- shmData.go | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 58 insertions(+), 0 deletions(-) diff --git a/shmData.go b/shmData.go new file mode 100644 index 0000000..229a0cd --- /dev/null +++ b/shmData.go @@ -0,0 +1,58 @@ +package shmqueue + +import ( + "reflect" + "unsafe" +) + +// lock free queue struct +type ShmDataInfo struct { + Capacity uint32 + Cache []byte +} + +// shmData2Info convert []byte to *ShmDataInfo +func shmData2Info(b []byte) *ShmDataInfo { + return (*ShmDataInfo)(unsafe.Pointer( + (*reflect.SliceHeader)(unsafe.Pointer(&b)).Data, + )) +} + +// ConvertToSlice convert to []byte +func ptr2Slice(s unsafe.Pointer, size int) []byte { + var x reflect.SliceHeader + x.Len = size + x.Cap = size + x.Data = uintptr(s) + return *(*[]byte)(unsafe.Pointer(&x)) +} + +func WriteShmData(data []byte, shmId int) error { + shmdata,err := Attach(shmId) + if err != nil { + return err + } + sdi := shmData2Info(shmdata) + if len(data) <= len(shmdata) { + sdi.Capacity = uint32(len(data)) + } else { + sdi.Capacity = uint32(len(shmdata)) + } + + tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity)) + copy(tmpData, data) + + return nil +} + +func ReadShmData(shmId int) ([]byte,error) { + shmdata,err := Attach(shmId) + if err != nil { + return nil,err + } + + sdi := shmData2Info(shmdata) + tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity)) + + return tmpData, nil +} -- Gitblit v1.8.0