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