memory_map_backend.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package memory_map
  2. import (
  3. "os"
  4. "time"
  5. )
  6. var (
  7. // _ backend.BackendStorageFile = &MemoryMappedFile{} // remove this to break import cycle
  8. )
  9. type MemoryMappedFile struct {
  10. mm *MemoryMap
  11. }
  12. func NewMemoryMappedFile(f *os.File, memoryMapSizeMB uint32) *MemoryMappedFile {
  13. mmf := &MemoryMappedFile{
  14. mm: new(MemoryMap),
  15. }
  16. mmf.mm.CreateMemoryMap(f, 1024*1024*uint64(memoryMapSizeMB))
  17. return mmf
  18. }
  19. func (mmf *MemoryMappedFile) ReadAt(p []byte, off int64) (n int, err error) {
  20. readBytes, e := mmf.mm.ReadMemory(uint64(off), uint64(len(p)))
  21. if e != nil {
  22. return 0, e
  23. }
  24. // TODO avoid the extra copy
  25. copy(p, readBytes)
  26. return len(readBytes), nil
  27. }
  28. func (mmf *MemoryMappedFile) WriteAt(p []byte, off int64) (n int, err error) {
  29. mmf.mm.WriteMemory(uint64(off), uint64(len(p)), p)
  30. return len(p), nil
  31. }
  32. func (mmf *MemoryMappedFile) Truncate(off int64) error {
  33. return nil
  34. }
  35. func (mmf *MemoryMappedFile) Close() error {
  36. mmf.mm.DeleteFileAndMemoryMap()
  37. return nil
  38. }
  39. func (mmf *MemoryMappedFile) GetStat() (datSize int64, modTime time.Time, err error) {
  40. stat, e := mmf.mm.File.Stat()
  41. if e == nil {
  42. return mmf.mm.End_of_file + 1, stat.ModTime(), nil
  43. }
  44. return 0, time.Time{}, err
  45. }
  46. func (mmf *MemoryMappedFile) Name() string {
  47. return mmf.mm.File.Name()
  48. }
  49. func (mm *MemoryMappedFile) Sync() error {
  50. return nil
  51. }