diff --git a/tools/utils/shm/shm.go b/tools/utils/shm/shm.go index 90a7de63f..09f7698a4 100644 --- a/tools/utils/shm/shm.go +++ b/tools/utils/shm/shm.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "io" + "io/fs" not_rand "math/rand" "os" "strconv" @@ -63,6 +64,7 @@ type MMap interface { Name() string IsFileSystemBacked() bool FileSystemName() string + Stat() (fs.FileInfo, error) } type AccessFlags int diff --git a/tools/utils/shm/shm_fs.go b/tools/utils/shm/shm_fs.go index 1b4b0c298..4ca5c8e6c 100644 --- a/tools/utils/shm/shm_fs.go +++ b/tools/utils/shm/shm_fs.go @@ -39,6 +39,10 @@ func file_mmap(f *os.File, size uint64, access AccessFlags, truncate bool, speci return &file_based_mmap{f: f, region: region, special_name: special_name}, nil } +func (self *file_based_mmap) Stat() (fs.FileInfo, error) { + return self.f.Stat() +} + func (self *file_based_mmap) Name() string { if self.special_name != "" { return self.special_name @@ -134,12 +138,18 @@ func Open(name string, size uint64) (MMap, error) { return file_mmap(ans, size, READ, false, name) } -func ReadWithSizeAndUnlink(name string) ([]byte, error) { +func ReadWithSizeAndUnlink(name string, file_callback ...func(*os.File) error) ([]byte, error) { f, err := open(name) if err != nil { return nil, err } defer f.Close() defer os.Remove(f.Name()) + for _, cb := range file_callback { + err = cb(f) + if err != nil { + return nil, err + } + } return read_with_size(f) } diff --git a/tools/utils/shm/shm_syscall.go b/tools/utils/shm/shm_syscall.go index a48ab0e2d..901a34087 100644 --- a/tools/utils/shm/shm_syscall.go +++ b/tools/utils/shm/shm_syscall.go @@ -86,6 +86,9 @@ func syscall_mmap(f *os.File, size uint64, access AccessFlags, truncate bool) (M func (self *syscall_based_mmap) Name() string { return self.f.Name() } +func (self *syscall_based_mmap) Stat() (fs.FileInfo, error) { + return self.f.Stat() +} func (self *syscall_based_mmap) Slice() []byte { return self.region @@ -152,12 +155,18 @@ func Open(name string, size uint64) (MMap, error) { return syscall_mmap(ans, size, READ, false) } -func ReadWithSizeAndUnlink(name string) ([]byte, error) { +func ReadWithSizeAndUnlink(name string, file_callback ...func(*os.File) error) ([]byte, error) { f, err := shm_open(name, os.O_RDONLY, 0) if err != nil { return nil, err } defer f.Close() defer shm_unlink(f.Name()) + for _, cb := range file_callback { + err = cb(f) + if err != nil { + return nil, err + } + } return read_with_size(f) }