]> Sergey Matveev's repositories - btrtrc.git/blob - mmap_span/mmap_span.go
Merge pull request #79 from shoenig/normalize
[btrtrc.git] / mmap_span / mmap_span.go
1 package mmap_span
2
3 import (
4         "io"
5         "log"
6
7         "github.com/edsrzf/mmap-go"
8 )
9
10 type segment struct {
11         *mmap.MMap
12 }
13
14 func (s segment) Size() int64 {
15         return int64(len(*s.MMap))
16 }
17
18 type MMapSpan struct {
19         span
20 }
21
22 func (ms *MMapSpan) Append(mmap mmap.MMap) {
23         ms.span = append(ms.span, segment{&mmap})
24 }
25
26 func (ms MMapSpan) Close() error {
27         for _, mMap := range ms.span {
28                 err := mMap.(segment).Unmap()
29                 if err != nil {
30                         log.Print(err)
31                 }
32         }
33         return nil
34 }
35
36 func (ms MMapSpan) Size() (ret int64) {
37         for _, seg := range ms.span {
38                 ret += seg.Size()
39         }
40         return
41 }
42
43 func (ms MMapSpan) ReadAt(p []byte, off int64) (n int, err error) {
44         ms.ApplyTo(off, func(intervalOffset int64, interval sizer) (stop bool) {
45                 _n := copy(p, (*interval.(segment).MMap)[intervalOffset:])
46                 p = p[_n:]
47                 n += _n
48                 return len(p) == 0
49         })
50         if len(p) != 0 {
51                 err = io.EOF
52         }
53         return
54 }
55
56 func (ms MMapSpan) WriteAt(p []byte, off int64) (n int, err error) {
57         ms.ApplyTo(off, func(iOff int64, i sizer) (stop bool) {
58                 mMap := i.(segment)
59                 _n := copy((*mMap.MMap)[iOff:], p)
60                 // err = mMap.Sync(gommap.MS_ASYNC)
61                 // if err != nil {
62                 //      return true
63                 // }
64                 p = p[_n:]
65                 n += _n
66                 return len(p) == 0
67         })
68         if err != nil && len(p) != 0 {
69                 err = io.ErrShortWrite
70         }
71         return
72 }