Fix ReadWithSizeAndUnlink on systems that have syscall based mmap

This commit is contained in:
Kovid Goyal
2023-02-28 13:44:09 +05:30
parent 4d3ce47813
commit ce12fd3515
2 changed files with 13 additions and 9 deletions

View File

@@ -118,6 +118,7 @@ func read_till_buf_full(f *os.File, buf []byte) ([]byte, error) {
if len(p) == 0 && errors.Is(err, io.EOF) { if len(p) == 0 && errors.Is(err, io.EOF) {
err = nil err = nil
} }
err = fmt.Errorf("Failed to read from SHM file with error: %w", err)
return buf[:len(buf)-len(p)], err return buf[:len(buf)-len(p)], err
} }
} }

View File

@@ -4,6 +4,7 @@
package shm package shm
import ( import (
"encoding/binary"
"errors" "errors"
"fmt" "fmt"
"io/fs" "io/fs"
@@ -182,17 +183,19 @@ func Open(name string, size uint64) (MMap, error) {
} }
func ReadWithSizeAndUnlink(name string, file_callback ...func(*os.File) error) ([]byte, error) { func ReadWithSizeAndUnlink(name string, file_callback ...func(*os.File) error) ([]byte, error) {
f, err := shm_open(name, os.O_RDONLY, 0) mmap, err := Open(name, 4)
if err != nil { if err != nil {
return nil, err return nil, err
} }
defer f.Close() size := uint64(binary.BigEndian.Uint32(mmap.Slice()))
defer shm_unlink(f.Name()) mmap.Close()
for _, cb := range file_callback { mmap, err = Open(name, 4+size)
err = cb(f) if err != nil {
if err != nil { return nil, err
return nil, err
}
} }
return read_with_size(f) ans := make([]byte, size)
copy(ans, mmap.Slice()[4:])
mmap.Close()
mmap.Unlink()
return ans, nil
} }