diff --git a/tools/utils/shm/shm.go b/tools/utils/shm/shm.go index 65c44bb56..5450deb41 100644 --- a/tools/utils/shm/shm.go +++ b/tools/utils/shm/shm.go @@ -56,6 +56,8 @@ type MMap interface { Seek(offset int64, whence int) (int64, error) Read(b []byte) (int, error) ReadWithSize() ([]byte, error) + Write(p []byte) (n int, err error) + WriteWithSize([]byte) error } type AccessFlags int @@ -132,6 +134,16 @@ func read_with_size(f *os.File) ([]byte, error) { return read_till_buf_full(f, make([]byte, size)) } +func write_with_size(f *os.File, b []byte) error { + szbuf := []byte{0, 0, 0, 0} + binary.BigEndian.PutUint32(szbuf, uint32(len(b))) + _, err := f.Write(szbuf) + if err == nil { + _, err = f.Write(b) + } + return err +} + func test_integration_with_python(args []string) (rc int, err error) { switch args[0] { default: @@ -154,9 +166,8 @@ func test_integration_with_python(args []string) (rc int, err error) { if err != nil { return 1, err } - defer mmap.Close() - binary.BigEndian.PutUint32(mmap.Slice(), uint32(len(data))) - copy(mmap.Slice()[4:], data) + mmap.WriteWithSize(data) + mmap.Close() fmt.Println(mmap.Name()) } return 0, nil diff --git a/tools/utils/shm/shm_fs.go b/tools/utils/shm/shm_fs.go index 3a79beeab..15a7d8321 100644 --- a/tools/utils/shm/shm_fs.go +++ b/tools/utils/shm/shm_fs.go @@ -65,6 +65,14 @@ func (self *file_based_mmap) Read(b []byte) (int, error) { return self.f.Read(b) } +func (self *file_based_mmap) Write(b []byte) (int, error) { + return self.f.Write(b) +} + +func (self *file_based_mmap) WriteWithSize(b []byte) error { + return write_with_size(self.f, b) +} + func (self *file_based_mmap) ReadWithSize() ([]byte, error) { return read_with_size(self.f) } diff --git a/tools/utils/shm/shm_syscall.go b/tools/utils/shm/shm_syscall.go index caddbd002..dcabe70aa 100644 --- a/tools/utils/shm/shm_syscall.go +++ b/tools/utils/shm/shm_syscall.go @@ -108,6 +108,14 @@ func (self *syscall_based_mmap) Read(b []byte) (int, error) { return self.f.Read(b) } +func (self *syscall_based_mmap) Write(b []byte) (int, error) { + return self.f.Write(b) +} + +func (self *syscall_based_mmap) WriteWithSize(b []byte) error { + return write_with_size(self.f, b) +} + func (self *syscall_based_mmap) ReadWithSize() ([]byte, error) { return read_with_size(self.f) }