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