| 98 | } |
| 99 | |
| 100 | func (r *BufferedReaderAt) ReadAt(b []byte, offset int64) (int, error) { |
| 101 | r.mtx.Lock() |
| 102 | defer r.mtx.Unlock() |
| 103 | |
| 104 | if len(r.buffers) == 0 { |
| 105 | return r.ra.ReadAt(b, offset) |
| 106 | } |
| 107 | |
| 108 | // Least-recently-used tracking |
| 109 | r.count++ |
| 110 | var lru *readerBuffer |
| 111 | var buf *readerBuffer |
| 112 | for i := range r.buffers { |
| 113 | if r.canRead(&r.buffers[i], offset, int64(len(b))) { |
| 114 | buf = &r.buffers[i] |
| 115 | break |
| 116 | } |
| 117 | |
| 118 | if lru == nil || r.buffers[i].count < lru.count { |
| 119 | lru = &r.buffers[i] |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | if buf == nil { |
| 124 | // No buffer satisfied read, overwrite least-recently-used |
| 125 | buf = lru |
| 126 | |
| 127 | r.prep(buf, offset, int64(len(b))) |
| 128 | buf.count = r.count |
| 129 | |
| 130 | var err error |
| 131 | if _, err = r.populate(buf); isFatalError(err) { |
| 132 | return 0, err |
| 133 | } |
| 134 | |
| 135 | r.read(buf, b, offset) |
| 136 | return len(b), err |
| 137 | } |
| 138 | |
| 139 | buf.count = r.count |
| 140 | r.read(buf, b, offset) |
| 141 | return len(b), nil |
| 142 | } |
| 143 | |
| 144 | type BufferedWriter struct { |
| 145 | w io.Writer |