1 // Copyright (c) 2013, Suryandaru Triandana <syndtr@gmail.com>
2 // All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
17 type memStorageLock struct {
21 func (lock *memStorageLock) Unlock() {
31 // memStorage is a memory-backed storage.
32 type memStorage struct {
35 files map[uint64]*memFile
39 // NewMemStorage returns a new memory-backed storage implementation.
40 func NewMemStorage() Storage {
42 files: make(map[uint64]*memFile),
46 func (ms *memStorage) Lock() (Locker, error) {
52 ms.slock = &memStorageLock{ms: ms}
56 func (*memStorage) Log(str string) {}
58 func (ms *memStorage) SetMeta(fd FileDesc) error {
69 func (ms *memStorage) GetMeta() (FileDesc, error) {
73 return FileDesc{}, os.ErrNotExist
78 func (ms *memStorage) List(ft FileType) ([]FileDesc, error) {
81 for x := range ms.files {
91 func (ms *memStorage) Open(fd FileDesc) (Reader, error) {
93 return nil, ErrInvalidFile
98 if m, exist := ms.files[packFile(fd)]; exist {
100 return nil, errFileOpen
103 return &memReader{Reader: bytes.NewReader(m.Bytes()), ms: ms, m: m}, nil
105 return nil, os.ErrNotExist
108 func (ms *memStorage) Create(fd FileDesc) (Writer, error) {
110 return nil, ErrInvalidFile
116 m, exist := ms.files[x]
119 return nil, errFileOpen
127 return &memWriter{memFile: m, ms: ms}, nil
130 func (ms *memStorage) Remove(fd FileDesc) error {
132 return ErrInvalidFile
138 if _, exist := ms.files[x]; exist {
142 return os.ErrNotExist
145 func (ms *memStorage) Rename(oldfd, newfd FileDesc) error {
146 if FileDescOk(oldfd) || FileDescOk(newfd) {
147 return ErrInvalidFile
153 oldx := packFile(oldfd)
154 newx := packFile(newfd)
157 oldm, exist := ms.files[oldx]
159 return os.ErrNotExist
161 newm, exist := ms.files[newx]
162 if (exist && newm.open) || oldm.open {
165 delete(ms.files, oldx)
166 ms.files[newx] = oldm
170 func (*memStorage) Close() error { return nil }
172 type memFile struct {
177 type memReader struct {
184 func (mr *memReader) Close() error {
186 defer mr.ms.mu.Unlock()
194 type memWriter struct {
200 func (*memWriter) Sync() error { return nil }
202 func (mw *memWriter) Close() error {
204 defer mw.ms.mu.Unlock()
208 mw.memFile.open = false
212 func packFile(fd FileDesc) uint64 {
213 return uint64(fd.Num)<<typeShift | uint64(fd.Type)
216 func unpackFile(x uint64) FileDesc {
217 return FileDesc{FileType(x) & TypeAll, int64(x >> typeShift)}