2026-07-14 05:49:10 +07:00
|
|
|
//go:build unix
|
|
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
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-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
|
|
|
}
|