zhangmeng
2019-05-22 a8b90cfcf722f4b1c4aac9f318e35824f02b8787
提交 | 用户 | 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     }
80     if rw, err := shm.CreateSimplex(url, 0644, param[0], param[1]); err == nil {
e3c917 81         fmt.Println(rw.Name())
9a89af 82         return &SHM{
Z 83             rw,
84             agent,
85         }
86     }
87
88     fmt.Println("create simple shm error")
89     return nil
90 }
91
92 func shmClient(m Mode, url string, args ...interface{}) *SHM {
93
94     if m != Shm {
95         fmt.Println("this is not a shm mode: ", m)
96         return nil
97     }
98
99     if rw, err := shm.OpenSimplex(url); err == nil {
100         return &SHM{
101             rw,
102             coactee,
103         }
104     }
105     fmt.Println("shmConsumer open error")
106     return nil
107 }