zhangmeng
2019-05-20 9a89af693b9336633bcac2a652c294f782e6b3b1
提交 | 用户 | 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 {
13     rw   *shm.ReadWriteCloser
14     typ  td
15     data []byte
16 }
17
18 // Send impl interface Diliver
19 func (s *SHM) Send(data []byte) error {
20     if s.rw == nil {
21         return errors.New("please init shm producer first")
22     }
23
24     n, err := s.rw.Write(data)
25     if n < 1 {
26         fmt.Println("recv data less than 1 length")
27     }
28
29     return err
30 }
31
32 // Recv impl interface Diliver
33 func (s *SHM) Recv() ([]byte, error) {
34
35     if s.rw == nil {
36         return nil, errors.New("please open shm consumer first")
37     }
38
39     n, err := s.rw.Read(s.data)
40     if err == nil || err == io.EOF {
41         s.data = s.data[:n:n]
42         return s.data, nil
43     }
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 {
81         return &SHM{
82             rw,
83             agent,
84             nil,
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             make([]byte, maxRecvSize),
104         }
105     }
106     fmt.Println("shmConsumer open error")
107     return nil
108 }