zhangmeng
2019-08-30 4f3bd6a122917eed4b5a5ead80a05ef9c143e395
shm.go
@@ -4,10 +4,11 @@
   "errors"
   "fmt"
   "io"
   "reflect"
   "time"
   "unsafe"
   "github.com/tmthrgd/shm-go"
   "basic.com/valib/shm.git"
)
// SHM share memory
@@ -15,7 +16,7 @@
   rw  *shm.ReadWriteCloser
   typ td
   data []byte
   recvData []byte
}
// Send impl interface Diliver
@@ -24,26 +25,12 @@
      return errors.New("please init shm producer first")
   }
   ch := make(chan int)
   go func(){
      n, _ := s.rw.Write(data)
      ch <- n
   }()
   select{
   case <-ch:
      return nil
   case <- time.After(3 * time.Second):
      return errors.New("send time out")
   n, err := s.rw.Write(data)
   if n < 1 {
      fmt.Println("recv data less than 1 length")
   }
   return errors.New("send should't here")
   // n, err := s.rw.Write(data)
   // if n < 1 {
   //    fmt.Println("recv data less than 1 length")
   // }
   // return err
   return err
}
// Recv impl interface Diliver
@@ -53,32 +40,53 @@
      return nil, errors.New("please open shm consumer first")
   }
   ch := make(chan []byte)
   go func(){
      n, err := s.rw.Read(s.data)
      if err == nil || err == io.EOF {
         s.data = s.data[:n:n]
      }
      ch <- s.data
   }()
   select{
   case d := <-ch:
      return d, nil
   case <- time.After(3 * time.Second):
      return nil, errors.New("recv time out")
   }
   return nil, errors.New("recv should't here")
   // orig
   // data := make([]byte, maxRecvSize)
   // n, err := s.rw.Read(data)
   // if err == nil || err == io.EOF {
   //    data = data[:n:n]
   //    data := data[:n:n]
   //    return data, nil
   // }
   // return nil, err
   // cur
   // data, err := s.rw.DirectRead()
   // if err == nil || err == io.EOF {
   //    return data, nil
   // }
   // new
   if s.recvData == nil {
      s.recvData = make([]byte, maxRecvSize)
   }
   sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&s.recvData))
   sliceHeader.Cap = maxRecvSize
   sliceHeader.Len = 0
   n, err := s.rw.Read(s.recvData)
   if err == nil || err == io.EOF {
      sliceHeader.Len = n
      return s.recvData, nil
   }
   return nil, err
}
// Recv2 impl interface
func (s *SHM) Recv2(data []byte) (int, error) {
   if s == nil || s.rw == nil {
      return 0, errors.New("please open shm consumer first")
   }
   n, err := s.rw.Read(data)
   if err == nil || err == io.EOF {
      data = data[:n:n]
      return n, nil
   }
   return 0, err
}
// Close impl interface Deliver
@@ -115,15 +123,16 @@
      blocks, size = param[0], param[1]
      // return nil, errors.New("shmServer created recv too much parameters")
   }
   time.Sleep(time.Millisecond)
   shm.Unlink(url)
   rw, err := shm.CreateSimplex(url, 0644, blocks, size)
   if err == nil {
      fmt.Println(rw.Name())
      return &SHM{
         rw,
         agent,
         make([]byte, maxRecvSize),
         rw:  rw,
         typ: agent,
      }, nil
   }
@@ -138,9 +147,8 @@
   rw, err := shm.OpenSimplex(url)
   if err == nil {
      return &SHM{
         rw,
         coactee,
         make([]byte, maxRecvSize),
         rw:  rw,
         typ: coactee,
      }, nil
   }
   return nil, err