github.com/Ptt-official-app/go-bbs@v0.12.0/cache/mmap.go (about) 1 package cache 2 3 import ( 4 "fmt" 5 "os" 6 "runtime" 7 // "strings" 8 ) 9 10 type Mmap struct { 11 file *os.File 12 buf []byte 13 } 14 15 func CreateMmap(filePath string, size int64) (*Mmap, error) { 16 f, err := os.Create(filePath) 17 // f, err := os.Open("../../../dump.shm") 18 if err != nil { 19 return nil, fmt.Errorf("create error: %w", err) 20 } 21 err = f.Truncate(size) 22 if err != nil { 23 return nil, fmt.Errorf("truncate error: %v", err) 24 } 25 26 return openFile(f) 27 28 } 29 30 func OpenMmap(filePath string) (*Mmap, error) { 31 // := os.Open(filePath) 32 f, err := os.OpenFile(filePath, os.O_RDWR, 0644) 33 // f, err := os.Open("../../../dump.shm") 34 if err != nil { 35 return nil, fmt.Errorf("open error: %w", err) 36 } 37 return openFile(f) 38 } 39 40 func openFile(f *os.File) (*Mmap, error) { 41 42 fd := int(f.Fd()) 43 // fmt.Println("fd:", fd) 44 45 stat, err := f.Stat() 46 if err != nil { 47 // fmt.Println("stat error", err) 48 return nil, fmt.Errorf("stat error: %w", err) 49 } 50 51 size := int(stat.Size()) 52 // fmt.Println("size", size) 53 54 b, err := openMmap(fd, size) 55 if err != nil { 56 fmt.Println("mmap error", err) 57 return nil, fmt.Errorf("mmap error: %v", err) 58 } 59 60 ret := Mmap{ 61 file: f, 62 buf: b, 63 } 64 65 // For GC 66 runtime.SetFinalizer(&ret, (*Mmap).Close) 67 return &ret, nil 68 } 69 70 func (m *Mmap) Bytes() []byte { 71 return m.buf 72 } 73 74 func (m *Mmap) Close() error { 75 err := closeMmap(m.buf) 76 77 m.file.Close() 78 79 // release GC setting 80 runtime.SetFinalizer(m, nil) 81 return err 82 83 } 84 85 func RemoveMmap(filePath string) error { 86 return os.Remove(filePath) 87 }