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  }