From 91c331e476b5090d4dd4fb85b82f45c890d39e46 Mon Sep 17 00:00:00 2001 From: hossinasaadi Date: Tue, 30 Dec 2025 17:50:54 +0330 Subject: [PATCH 1/2] Implement mmap in filesystem to reduce ram usage --- common/platform/filesystem/file.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/common/platform/filesystem/file.go b/common/platform/filesystem/file.go index e4fe2a9aaea1..f7f434ded3f4 100644 --- a/common/platform/filesystem/file.go +++ b/common/platform/filesystem/file.go @@ -4,6 +4,7 @@ import ( "io" "os" "path/filepath" + "syscall" "github.com/xtls/xray-core/common/buf" "github.com/xtls/xray-core/common/platform" @@ -16,6 +17,29 @@ var NewFileReader FileReaderFunc = func(path string) (io.ReadCloser, error) { } func ReadFile(path string) ([]byte, error) { + file, err := os.Open(path) + if err != nil { + return nil, err + } + defer file.Close() + + stat, err := file.Stat() + if err != nil { + return nil, err + } + + size := stat.Size() + if size == 0 { + return []byte{}, nil + } + + // use mmap to save RAM + bs, err := syscall.Mmap(int(file.Fd()), 0, int(size), syscall.PROT_READ, syscall.MAP_SHARED) + if err == nil { + return bs, nil + } + + // fallback reader, err := NewFileReader(path) if err != nil { return nil, err From d66d752146e5b1f79819b9590201e1687a4daa74 Mon Sep 17 00:00:00 2001 From: hossinasaadi Date: Tue, 30 Dec 2025 18:00:44 +0330 Subject: [PATCH 2/2] fix filesystem for other platforms --- common/platform/filesystem/file.go | 2 + common/platform/filesystem/file_other.go | 54 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 common/platform/filesystem/file_other.go diff --git a/common/platform/filesystem/file.go b/common/platform/filesystem/file.go index f7f434ded3f4..ebe9b0f10be0 100644 --- a/common/platform/filesystem/file.go +++ b/common/platform/filesystem/file.go @@ -1,3 +1,5 @@ +//go:build !windows && !wasm + package filesystem import ( diff --git a/common/platform/filesystem/file_other.go b/common/platform/filesystem/file_other.go new file mode 100644 index 000000000000..d3cbdcc7b8c6 --- /dev/null +++ b/common/platform/filesystem/file_other.go @@ -0,0 +1,54 @@ +//go:build windows || wasm + +package filesystem + +import ( + "io" + "os" + "path/filepath" + + "github.com/xtls/xray-core/common/buf" + "github.com/xtls/xray-core/common/platform" +) + +type FileReaderFunc func(path string) (io.ReadCloser, error) + +var NewFileReader FileReaderFunc = func(path string) (io.ReadCloser, error) { + return os.Open(path) +} + +func ReadFile(path string) ([]byte, error) { + reader, err := NewFileReader(path) + if err != nil { + return nil, err + } + defer reader.Close() + + return buf.ReadAllToBytes(reader) +} + +func ReadAsset(file string) ([]byte, error) { + return ReadFile(platform.GetAssetLocation(file)) +} + +func ReadCert(file string) ([]byte, error) { + if filepath.IsAbs(file) { + return ReadFile(file) + } + return ReadFile(platform.GetCertLocation(file)) +} + +func CopyFile(dst string, src string) error { + bytes, err := ReadFile(src) + if err != nil { + return err + } + f, err := os.OpenFile(dst, os.O_CREATE|os.O_WRONLY, 0o644) + if err != nil { + return err + } + defer f.Close() + + _, err = f.Write(bytes) + return err +}