zhangmeng
2019-09-27 2d390df9ede39c9d7c34bd8190b9329cfc371325
提交 | 用户 | 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
4f3bd6 16
47adbb 17     // recvData []byte
9a89af 18 }
Z 19
20 // Send impl interface Diliver
21 func (s *SHM) Send(data []byte) error {
c2bbe3 22     if s == nil || s.rw == nil {
9a89af 23         return errors.New("please init shm producer first")
Z 24     }
25
fb46ee 26     n, err := s.rw.Write(data)
Z 27     if n < 1 {
28         fmt.Println("recv data less than 1 length")
9a89af 29     }
Z 30
fb46ee 31     return err
9a89af 32 }
Z 33
34 // Recv impl interface Diliver
35 func (s *SHM) Recv() ([]byte, error) {
36
c2bbe3 37     if s == nil || s.rw == nil {
9a89af 38         return nil, errors.New("please open shm consumer first")
Z 39     }
40
4f3bd6 41     // orig
Z 42
20a4c4 43     // data := make([]byte, maxRecvSize)
Z 44     // n, err := s.rw.Read(data)
45     // if err == nil || err == io.EOF {
020e17 46     //     data := data[:n:n]
20a4c4 47     //     return data, nil
Z 48     // }
49
4f3bd6 50     // cur
Z 51
47adbb 52     data, err := s.rw.DirectRead()
Z 53     if err == nil || err == io.EOF {
54         return data, nil
55     }
4f3bd6 56
Z 57     // new
58
47adbb 59     // if s.recvData == nil {
Z 60     //     s.recvData = make([]byte, maxRecvSize)
61     // }
62     // sliceHeader := (*reflect.SliceHeader)(unsafe.Pointer(&s.recvData))
63     // // sliceHeader.Cap = maxRecvSize
64     // sliceHeader.Len = maxRecvSize
4f3bd6 65
47adbb 66     // n, err := s.rw.Read(s.recvData)
Z 67     // if err == nil || err == io.EOF {
68     //     sliceHeader.Len = n
69     //     return s.recvData, nil
70     // }
4f3bd6 71
fb46ee 72     return nil, err
9a89af 73 }
Z 74
020e17 75 // Recv2 impl interface
058b21 76 func (s *SHM) Recv2(data []byte) (int, error) {
020e17 77     if s == nil || s.rw == nil {
058b21 78         return 0, errors.New("please open shm consumer first")
020e17 79     }
Z 80
81     n, err := s.rw.Read(data)
82     if err == nil || err == io.EOF {
83         data = data[:n:n]
058b21 84         return n, nil
020e17 85     }
Z 86
058b21 87     return 0, err
020e17 88 }
Z 89
9a89af 90 // Close impl interface Deliver
Z 91 func (s *SHM) Close() {
c2bbe3 92     if s == nil {
Z 93         return
94     }
9a89af 95     if s.rw != nil {
Z 96         s.rw.Close()
97     }
98     if s.typ == agent {
99         shm.Unlink(s.rw.Name())
100     }
101 }
102
c2bbe3 103 func shmServer(m Mode, url string, args ...interface{}) (*SHM, error) {
9a89af 104     if m != Shm {
c2bbe3 105         return nil, errors.New("please use deliver.Shm mode")
9a89af 106     }
Z 107
108     var param []int
109     for _, v := range args {
110         switch v.(type) {
111         case int:
112             param = append(param, v.(int))
113         default:
114
c2bbe3 115             return nil, errors.New("shmServer created recv error parameters")
9a89af 116         }
Z 117     }
fb46ee 118
512af9 119     blocks, size := 2, maxRecvSize
Z 120     if len(param) == 2 {
121         blocks, size = param[0], param[1]
122         // return nil, errors.New("shmServer created recv too much parameters")
123     }
124
125     time.Sleep(time.Millisecond)
25d8c3 126     shm.Unlink(url)
Z 127
512af9 128     rw, err := shm.CreateSimplex(url, 0644, blocks, size)
c2bbe3 129     if err == nil {
e3c917 130         fmt.Println(rw.Name())
9a89af 131         return &SHM{
20a4c4 132             rw:  rw,
Z 133             typ: agent,
c2bbe3 134         }, nil
9a89af 135     }
Z 136
c2bbe3 137     return nil, err
9a89af 138 }
Z 139
c2bbe3 140 func shmClient(m Mode, url string, args ...interface{}) (*SHM, error) {
9a89af 141     if m != Shm {
c2bbe3 142         return nil, errors.New("please use deliver.Shm mode")
9a89af 143     }
Z 144
c2bbe3 145     rw, err := shm.OpenSimplex(url)
Z 146     if err == nil {
9a89af 147         return &SHM{
20a4c4 148             rw:  rw,
Z 149             typ: coactee,
c2bbe3 150         }, nil
9a89af 151     }
c2bbe3 152     return nil, err
9a89af 153 }