zhangmeng
2019-05-22 c2bbe31e7c6c9f83f7bcce26dea98bc18ed8f39c
提交 | 用户 | 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         fmt.Println(v)
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     }
77     if len(param) != 2 {
c2bbe3 78         return nil, errors.New("shmServer created recv too much parameters")
9a89af 79     }
c2bbe3 80
Z 81     rw, err := shm.CreateSimplex(url, 0644, param[0], param[1])
82     if err == nil {
e3c917 83         fmt.Println(rw.Name())
9a89af 84         return &SHM{
Z 85             rw,
86             agent,
c2bbe3 87         }, nil
9a89af 88     }
Z 89
c2bbe3 90     return nil, err
9a89af 91 }
Z 92
c2bbe3 93 func shmClient(m Mode, url string, args ...interface{}) (*SHM, error) {
9a89af 94     if m != Shm {
c2bbe3 95         return nil, errors.New("please use deliver.Shm mode")
9a89af 96     }
Z 97
c2bbe3 98     rw, err := shm.OpenSimplex(url)
Z 99     if err == nil {
9a89af 100         return &SHM{
Z 101             rw,
102             coactee,
c2bbe3 103         }, nil
9a89af 104     }
c2bbe3 105     return nil, err
9a89af 106 }