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