From ef7f3ebd582fa0abeedb677b55dd09b090805258 Mon Sep 17 00:00:00 2001
From: chenshijun <csj_sky@126.com>
Date: 星期三, 01 四月 2020 15:59:21 +0800
Subject: [PATCH] 把shmData的库拆开,把attach和detach放到外面去,使用更灵活 增加通过shmid获取shmkey的接口
---
shmwrap.go | 11 +++++
shmData.go | 51 +++++++++++++++++++++++--
2 files changed, 58 insertions(+), 4 deletions(-)
diff --git a/shmData.go b/shmData.go
index 6b3ebf2..eb9e5c1 100644
--- a/shmData.go
+++ b/shmData.go
@@ -28,8 +28,10 @@
}
//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
}
@@ -43,14 +45,20 @@
tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
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)
@@ -58,3 +66,38 @@
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) {
+ sdi.Capacity = uint32(len(memData))
+ } else {
+ sdi.Capacity = uint32(len(shmData))
+ }
+
+ tmpData := ptr2Slice(unsafe.Pointer(&sdi.Cache), int(sdi.Capacity))
+ 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.Capacity))
+
+ return tmpData
+}
+
+//UpdateDataToShm (绫讳技娴呮嫹璐�)鏇存柊鏁版嵁鍒板叡浜唴瀛�
+// 杈撳叆: ConvertShmToData寰楀埌鐨勬暟鎹甦ata,缁忚繃涓氬姟澶勭悊鍚�,璇ユ暟鎹湁鍙樺寲,闇�瑕乽pdate鍒皊hm閲�
+// 鏇存柊鏁版嵁鍒板叡浜唴瀛樹娇鐢�: attach->ConvertShmToData->淇敼data鏁版嵁,涓氬姟澶勭悊缁撴潫鍚�->UpdateDataToShm->detach
+func UpdateDataToShm(data, shmData []byte) {
+ sdi := shmData2Info(shmData)
+ sdi.Capacity = uint32(len(data))
+}
\ No newline at end of file
diff --git a/shmwrap.go b/shmwrap.go
index e855c8e..8dad1d7 100644
--- a/shmwrap.go
+++ b/shmwrap.go
@@ -211,4 +211,15 @@
}
return int(idDs.Nattch), nil
+}
+
+func GetKeyById(shmId int) (int,error) {
+ var idDs shm.IdDs
+
+ _, err := shm.Ctl(shmId, shm.IPC_STAT, &idDs)
+ if err != nil {
+ return 0, err
+ }
+
+ return int(idDs.Perm.Key), nil
}
\ No newline at end of file
--
Gitblit v1.8.0