Files
TrollSSH/internal/tsf/mmap_unix.go
T

47 lines
923 B
Go
Raw Normal View History

2026-07-14 05:49:10 +07:00
//go:build unix
2026-07-16 23:29:14 +07:00
package tsf
2026-07-14 05:49:10 +07:00
import (
"os"
"syscall"
)
2026-07-16 21:56:41 +07:00
func readFrameFile(filename string) (*frameFile, error) {
2026-07-14 05:49:10 +07:00
f, err := os.Open(filename)
if err != nil {
return nil, err
}
defer func() { _ = f.Close() }()
info, err := f.Stat()
if err != nil {
return nil, err
}
size := info.Size()
if size <= 0 || size != int64(int(size)) {
2026-07-16 21:56:41 +07:00
data, err := os.ReadFile(filename)
return &frameFile{data: data}, err
2026-07-14 05:49:10 +07:00
}
data, err := syscall.Mmap(int(f.Fd()), 0, int(size), syscall.PROT_READ, syscall.MAP_SHARED)
if err != nil {
2026-07-16 21:56:41 +07:00
data, err := os.ReadFile(filename)
return &frameFile{data: data}, err
2026-07-14 05:49:10 +07:00
}
2026-07-17 01:28:35 +07:00
_ = syscall.Madvise(data, syscall.MADV_RANDOM)
2026-07-16 21:56:41 +07:00
return &frameFile{
data: data,
cleanup: func() error {
return syscall.Munmap(data)
},
}, nil
2026-07-14 05:49:10 +07:00
}
2026-07-17 01:28:35 +07:00
func (f *frameFile) dropResident() {
if f == nil || f.cleanup == nil || len(f.data) == 0 {
return
}
_ = syscall.Madvise(f.data, syscall.MADV_DONTNEED)
}