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