zhangmeng
2019-05-21 93ff14f01eb200848336c95ea75658282e14947a
提交 | 用户 | 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 {
19     if s.rw == nil {
20         return errors.New("please init shm producer first")
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
34     if s.rw == nil {
35         return nil, errors.New("please open shm consumer first")
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() {
50     if s.rw != nil {
51         s.rw.Close()
52     }
53     if s.typ == agent {
54         shm.Unlink(s.rw.Name())
55     }
56 }
57
58 func shmServer(m Mode, url string, args ...interface{}) *SHM {
59     if m != Shm {
60         fmt.Println("this is not a shm mode: ", m)
61         return nil
62     }
63
64     var param []int
65     for _, v := range args {
66         fmt.Println(v)
67         switch v.(type) {
68         case int:
69             param = append(param, v.(int))
70         default:
71             fmt.Println("shmProducer recv error parameters")
72
73             return nil
74         }
75     }
76     if len(param) != 2 {
77         fmt.Println("shmProducer recv too much parameter: ", len(param))
78         return nil
79     }
e3c917 80     shm.Unlink(url)
9a89af 81     if rw, err := shm.CreateSimplex(url, 0644, param[0], param[1]); err == nil {
e3c917 82         fmt.Println(rw.Name())
9a89af 83         return &SHM{
Z 84             rw,
85             agent,
86         }
87     }
88
89     fmt.Println("create simple shm error")
90     return nil
91 }
92
93 func shmClient(m Mode, url string, args ...interface{}) *SHM {
94
95     if m != Shm {
96         fmt.Println("this is not a shm mode: ", m)
97         return nil
98     }
99
100     if rw, err := shm.OpenSimplex(url); err == nil {
101         return &SHM{
102             rw,
103             coactee,
104         }
105     }
106     fmt.Println("shmConsumer open error")
107     return nil
108 }