From b4f186a5d496fd2085a2bf1405a6384cd7802236 Mon Sep 17 00:00:00 2001
From: chenshijun <chenshijun@aiotlink.com>
Date: 星期五, 24 四月 2020 16:34:05 +0800
Subject: [PATCH] 把延时单位修正成const=5毫秒,增加CreateShmOnlyTime接口

---
 shmwrap.go |   36 ++++++++++++++++++++++++++++++++----
 1 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/shmwrap.go b/shmwrap.go
index 8634dbf..418dc24 100644
--- a/shmwrap.go
+++ b/shmwrap.go
@@ -7,6 +7,8 @@
     "github.com/gen2brain/shm"
 )
 
+const sleepPeriod = time.Duration(5) * time.Millisecond
+
 // NewBlock shm block with size
 func NewBlock(size int, key int) ([]byte, int, error) {
     id, err := shm.Get(key, size, shm.IPC_CREAT|0666)
@@ -72,7 +74,7 @@
                 if err == nil {
                     break loopB
                 }
-                time.Sleep(time.Millisecond)
+                time.Sleep(sleepPeriod)
                 data, id, err = NewBlock(size, key)
             }
         }
@@ -93,7 +95,7 @@
                 if err == nil {
                     break loopB
                 }
-                time.Sleep(time.Millisecond)
+                time.Sleep(sleepPeriod)
                 data, id, err = AttachBlock(key)
             }
         }
@@ -115,7 +117,33 @@
                 if err == nil {
                     break loopB
                 }
-                time.Sleep(time.Millisecond)
+                time.Sleep(sleepPeriod)
+                id, err = NewBlockOnly(size, key)
+            }
+        }
+    }
+    return id
+}
+
+// CreateShmOnly create shm block with size, only space, no padding, return id(int)
+// context for quit
+func CreateShmOnlyTime(ctx context.Context, size int, key int, timeout int) int {
+    id, err := NewBlockOnly(size, key)
+    if err != nil {
+        to := time.NewTimer(time.Duration(timeout) * time.Millisecond)
+        defer to.Stop()
+    loopB:
+        for {
+            select {
+            case <-ctx.Done():
+                return -1
+            case <-to.C:
+                return -1
+            default:
+                if err == nil {
+                    break loopB
+                }
+                time.Sleep(sleepPeriod)
                 id, err = NewBlockOnly(size, key)
             }
         }
@@ -139,7 +167,7 @@
                 } else {
                     fmt.Println("createShm error:", err)
                 }
-                time.Sleep(time.Millisecond)
+                time.Sleep(sleepPeriod)
                 data, id, err = NewBlock(size, key)
             }
         }

--
Gitblit v1.8.0