zhangmeng
2019-08-26 4338cf10114f5176d120719cbc51bdc2177eae1c
提交 | 用户 | age
9a89af 1 package deliver
Z 2
3 import (
4     "errors"
5     "fmt"
fb46ee 6     "io"
512af9 7     "time"
9a89af 8
b8c958 9     "basic.com/valib/shm.git"
9a89af 10 )
Z 11
12 // SHM share memory
13 type SHM struct {
93ff14 14     rw  *shm.ReadWriteCloser
Z 15     typ td
9a89af 16 }
Z 17
18 // Send impl interface Diliver
19 func (s *SHM) Send(data []byte) error {
c2bbe3 20     if s == nil || s.rw == nil {
9a89af 21         return errors.New("please init shm producer first")
Z 22     }
23
fb46ee 24     n, err := s.rw.Write(data)
Z 25     if n < 1 {
26         fmt.Println("recv data less than 1 length")
9a89af 27     }
Z 28
fb46ee 29     return err
9a89af 30 }
Z 31
32 // Recv impl interface Diliver
33 func (s *SHM) Recv() ([]byte, error) {
34
c2bbe3 35     if s == nil || s.rw == nil {
9a89af 36         return nil, errors.New("please open shm consumer first")
Z 37     }
38
fb46ee 39     data := make([]byte, maxRecvSize)
Z 40     n, err := s.rw.Read(data)
41     if err == nil || err == io.EOF {
42         data = data[:n:n]
43         return data, nil
9a89af 44     }
Z 45
fb46ee 46     return nil, err
9a89af 47 }
Z 48
49 // Close impl interface Deliver
50 func (s *SHM) Close() {
c2bbe3 51     if s == nil {
Z 52         return
53     }
9a89af 54     if s.rw != nil {
Z 55         s.rw.Close()
56     }
57     if s.typ == agent {
58         shm.Unlink(s.rw.Name())
59     }
60 }
61
c2bbe3 62 func shmServer(m Mode, url string, args ...interface{}) (*SHM, error) {
9a89af 63     if m != Shm {
c2bbe3 64         return nil, errors.New("please use deliver.Shm mode")
9a89af 65     }
Z 66
67     var param []int
68     for _, v := range args {
69         switch v.(type) {
70         case int:
71             param = append(param, v.(int))
72         default:
73
c2bbe3 74             return nil, errors.New("shmServer created recv error parameters")
9a89af 75         }
Z 76     }
fb46ee 77
512af9 78     blocks, size := 2, maxRecvSize
Z 79     if len(param) == 2 {
80         blocks, size = param[0], param[1]
81         // return nil, errors.New("shmServer created recv too much parameters")
82     }
83
84     time.Sleep(time.Millisecond)
25d8c3 85     shm.Unlink(url)
Z 86
512af9 87     rw, err := shm.CreateSimplex(url, 0644, blocks, size)
c2bbe3 88     if err == nil {
e3c917 89         fmt.Println(rw.Name())
9a89af 90         return &SHM{
Z 91             rw,
92             agent,
c2bbe3 93         }, nil
9a89af 94     }
Z 95
c2bbe3 96     return nil, err
9a89af 97 }
Z 98
c2bbe3 99 func shmClient(m Mode, url string, args ...interface{}) (*SHM, error) {
9a89af 100     if m != Shm {
c2bbe3 101         return nil, errors.New("please use deliver.Shm mode")
9a89af 102     }
Z 103
c2bbe3 104     rw, err := shm.OpenSimplex(url)
Z 105     if err == nil {
9a89af 106         return &SHM{
Z 107             rw,
108             coactee,
c2bbe3 109         }, nil
9a89af 110     }
c2bbe3 111     return nil, err
9a89af 112 }