zhangmeng
2019-08-26 7385a596ec1a6831474d5815d3d6c614c667f270
shm.go
@@ -3,17 +3,19 @@
import (
   "errors"
   "fmt"
   "io"
   // "io"
   "time"
   "github.com/tmthrgd/shm-go"
   "basic.com/valib/shm.git"
)
// SHM share memory
type SHM struct {
   rw  *shm.ReadWriteCloser
   typ td
   data []byte
}
// Send impl interface Diliver
@@ -51,18 +53,18 @@
      return nil, errors.New("please open shm consumer first")
   }
   ch := make(chan []byte)
   ch := make(chan int)
   go func(){
      data := make([]byte, maxRecvSize)
      n, err := s.rw.Read(data)
      if err == nil || err == io.EOF {
         data = data[:n:n]
      }
      ch <- data
      n, _ := s.rw.Read(s.data)
      ch <- n
   }()
   select{
   case d := <-ch:
      return d, nil
      if d > 0{
         data := make([]byte, d)
         copy(data, s.data)
         return data, nil
      }
   case <- time.After(3 * time.Second):
      return nil, errors.New("recv time out")
   }
@@ -100,7 +102,6 @@
   var param []int
   for _, v := range args {
      fmt.Println(v)
      switch v.(type) {
      case int:
         param = append(param, v.(int))
@@ -109,18 +110,21 @@
         return nil, errors.New("shmServer created recv error parameters")
      }
   }
   if len(param) != 2 {
      return nil, errors.New("shmServer created recv too much parameters")
   }
   blocks, size := 2, maxRecvSize
   if len(param) == 2 {
      blocks, size = param[0], param[1]
      // return nil, errors.New("shmServer created recv too much parameters")
   }
   shm.Unlink(url)
   rw, err := shm.CreateSimplex(url, 0644, param[0], param[1])
   rw, err := shm.CreateSimplex(url, 0644, blocks, size)
   if err == nil {
      fmt.Println(rw.Name())
      return &SHM{
         rw,
         agent,
         make([]byte, maxRecvSize),
      }, nil
   }
@@ -137,6 +141,7 @@
      return &SHM{
         rw,
         coactee,
         make([]byte, maxRecvSize),
      }, nil
   }
   return nil, err