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