From 82a262ef5cf721e5a236c8b1d2ab3ff92ca33122 Mon Sep 17 00:00:00 2001 From: zhangmeng <775834166@qq.com> Date: 星期五, 24 九月 2021 11:40:20 +0800 Subject: [PATCH] bug fixed withintime --- shmData.go | 74 +++++++++++++++++++++++++++++------- 1 files changed, 59 insertions(+), 15 deletions(-) diff --git a/shmData.go b/shmData.go index eca690b..fad696c 100644 --- a/shmData.go +++ b/shmData.go @@ -5,9 +5,9 @@ "unsafe" ) -// lock free queue struct +// []byte struct type ShmDataInfo struct { - Capacity uint32 + Len uint32 Cache []byte } @@ -18,43 +18,87 @@ )) } +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)) } //WriteShmData data寰呭啓鍏ョ殑鏁版嵁; shmId:鍏变韩鍐呭瓨id,鍙猘ttach,涓峜reate +// 鎶奷ata鍐欏叆shmId瀵瑰簲鐨剆hm涓�, 娴佺▼: attach->鍐欏叆鏁版嵁->detach +// 閫傚悎shm鏄┖鐨�,瑙g爜浣跨敤 func WriteShmData(data []byte, shmId int) error { - shmdata,err := Attach(shmId) + shmData, err := Attach(shmId) if err != nil { return err } - sdi := shmData2Info(shmdata) - if len(data) <= len(shmdata) { - sdi.Capacity = uint32(len(data)) + sdi := shmData2Info(shmData) + if len(data) <= len(shmData)-SHMSLICEOFFSET { + sdi.Len = uint32(len(data)) } else { - sdi.Capacity = uint32(len(shmdata)) + sdi.Len = uint32(len(shmData)-SHMSLICEOFFSET) } - 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) + if err != nil { + return err + } return nil } //ReadShmData attach鍒皊hmId瀵瑰簲鐨勫叡浜唴瀛�,骞惰鍑烘暟鎹甗]byte -func ReadShmData(shmId int) ([]byte,error) { - shmdata,err := Attach(shmId) +// 浣跨敤涔嬪悗闇�瑕乨etach +func ReadShmData(shmId int) ([]byte, error) { + shmData, err := Attach(shmId) if err != nil { - return nil,err + return nil, err } - sdi := shmData2Info(shmdata) - tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity)) + sdi := shmData2Info(shmData) + tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Len), len(shmData)-SHMSLICEOFFSET) return tmpData, nil } + +//DeepCopyDataToShm 娣辨嫹璐�,鎶婂唴瀛樼殑鏁版嵁鎷疯礉attach涔嬪悗鍏变韩鍐呭瓨涓� +// 杈撳叆: shmData鏄痑ttach杩斿洖鐨刐]byte, memdData鏄唴瀛樹腑鐨勬暟鎹� +// 鍐欏叆鏁版嵁鍒板叡浜唴瀛樹娇鐢�:attach->DeepCopyDataToShm->detach +// 閫傚悎瑙g爜浣跨敤 +func DeepCopyDataToShm(memData,shmData []byte) { + sdi := shmData2Info(shmData) + if len(memData) <= len(shmData)-SHMSLICEOFFSET { + sdi.Len = uint32(len(memData)) + } else { + sdi.Len = uint32(len(shmData)-SHMSLICEOFFSET) + } + + tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Len), len(shmData)-SHMSLICEOFFSET) + copy(tmpData, memData) +} + +//ReadShmData 鎶奱ttach鍚庣殑shmData杞垚鍐呭瓨data +// 杈撳叆:attach鍒板叡浜唴瀛樺緱鍒扮殑shmData +// 杈撳嚭:杞崲鍚庣殑data +// 浠庡叡浜唴瀛樹腑璇诲彇鏁版嵁浣跨敤:attach->ConvertShmToData->鍙,涓氬姟澶勭悊缁撴潫鍚�->detach +func ConvertShmToData(shmData []byte) []byte { + sdi := shmData2Info(shmData) + tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Len), len(shmData)-SHMSLICEOFFSET) + + return tmpData +} + +//UpdateDataToShm (绫讳技娴呮嫹璐�)鏇存柊鏁版嵁鍒板叡浜唴瀛� +// 杈撳叆: ConvertShmToData寰楀埌鐨勬暟鎹甦ata,缁忚繃涓氬姟澶勭悊鍚�,璇ユ暟鎹湁鍙樺寲,闇�瑕乽pdate鍒皊hm閲� +// 鏇存柊鏁版嵁鍒板叡浜唴瀛樹娇鐢�: attach->ConvertShmToData->淇敼data鏁版嵁,涓氬姟澶勭悊缁撴潫鍚�->UpdateDataToShm->detach +func UpdateDataToShm(data, shmData []byte) { + sdi := shmData2Info(shmData) + sdi.Len = uint32(len(data)) +} \ No newline at end of file -- Gitblit v1.8.0