gitee.com/quant1x/gox@v1.7.6/cache/FastCache.go (about) 1 package cache 2 3 import ( 4 "os" 5 "path/filepath" 6 "syscall" 7 ) 8 9 type FastCache struct { 10 filename string 11 f *os.File 12 size int64 13 Data []byte 14 } 15 16 func OpenCache(name string, size int64) (*FastCache, error) { 17 dir := filepath.Dir(name) 18 os.MkdirAll(dir, 0755) 19 filename := name 20 f, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0644) 21 if nil != err { 22 return nil, err 23 } 24 f.Truncate(size) 25 data, err := syscall.Mmap(int(f.Fd()), 0, int(size), syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_SHARED) 26 if nil != err { 27 return nil, err 28 } 29 30 return &FastCache{ 31 filename: filename, 32 f: f, 33 size: size, 34 Data: data, 35 }, nil 36 } 37 38 func (fc *FastCache) Close() { 39 if fc != nil && fc.f != nil { 40 _ = fc.f.Close() 41 _ = syscall.Munmap(fc.Data) 42 } 43 }