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