github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/data/shm/shm.go (about) 1 package shm 2 3 import ( 4 "fmt" 5 "io" 6 ) 7 8 // SharedMemory is shared memory struct 9 type SharedMemory struct { 10 m *sharedMemory 11 pos int64 12 } 13 14 // Create is create shared memory 15 func Create(name string, size int32) (*SharedMemory, error) { 16 m, err := create(name, size) 17 if err != nil { 18 return nil, err 19 } 20 return &SharedMemory{m, 0}, nil 21 } 22 23 // Open is open exist shared memory 24 func Open(name string, size int32) (*SharedMemory, error) { 25 m, err := open(name, size) 26 if err != nil { 27 return nil, err 28 } 29 return &SharedMemory{m, 0}, nil 30 } 31 32 // Close is close & discard shared memory 33 func (o *SharedMemory) Close() (err error) { 34 if o.m != nil { 35 err = o.m.close() 36 if err == nil { 37 o.m = nil 38 } 39 } 40 return err 41 } 42 43 // Read is read shared memory (current position) 44 func (o *SharedMemory) Read(p []byte) (n int, err error) { 45 n, err = o.ReadAt(p, o.pos) 46 if err != nil { 47 return 0, err 48 } 49 o.pos += int64(n) 50 return n, nil 51 } 52 53 // ReadAt is read shared memory (offset) 54 func (o *SharedMemory) ReadAt(p []byte, off int64) (n int, err error) { 55 return o.m.readAt(p, off) 56 } 57 58 // Seek is move read/write position at shared memory 59 func (o *SharedMemory) Seek(offset int64, whence int) (int64, error) { 60 switch whence { 61 case io.SeekStart: 62 offset += int64(0) 63 case io.SeekCurrent: 64 offset += o.pos 65 case io.SeekEnd: 66 offset += int64(o.m.size) 67 } 68 if offset < 0 || offset >= int64(o.m.size) { 69 return 0, fmt.Errorf("invalid offset") 70 } 71 o.pos = offset 72 return offset, nil 73 } 74 75 // Write is write shared memory (current position) 76 func (o *SharedMemory) Write(p []byte) (n int, err error) { 77 n, err = o.WriteAt(p, o.pos) 78 if err != nil { 79 return 0, err 80 } 81 o.pos += int64(n) 82 return n, nil 83 } 84 85 // WriteAt is write shared memory (offset) 86 func (o *SharedMemory) WriteAt(p []byte, off int64) (n int, err error) { 87 return o.m.writeAt(p, off) 88 }