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