| 提交 | 用户 | 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 | } |