...

Source file src/github.com/syndtr/goleveldb/leveldb/storage.go

Documentation: github.com/syndtr/goleveldb/leveldb

     1  package leveldb
     2  
     3  import (
     4  	"github.com/syndtr/goleveldb/leveldb/storage"
     5  	"sync/atomic"
     6  )
     7  
     8  type iStorage struct {
     9  	storage.Storage
    10  	read  uint64
    11  	write uint64
    12  }
    13  
    14  func (c *iStorage) Open(fd storage.FileDesc) (storage.Reader, error) {
    15  	r, err := c.Storage.Open(fd)
    16  	return &iStorageReader{r, c}, err
    17  }
    18  
    19  func (c *iStorage) Create(fd storage.FileDesc) (storage.Writer, error) {
    20  	w, err := c.Storage.Create(fd)
    21  	return &iStorageWriter{w, c}, err
    22  }
    23  
    24  func (c *iStorage) reads() uint64 {
    25  	return atomic.LoadUint64(&c.read)
    26  }
    27  
    28  func (c *iStorage) writes() uint64 {
    29  	return atomic.LoadUint64(&c.write)
    30  }
    31  
    32  // newIStorage returns the given storage wrapped by iStorage.
    33  func newIStorage(s storage.Storage) *iStorage {
    34  	return &iStorage{s, 0, 0}
    35  }
    36  
    37  type iStorageReader struct {
    38  	storage.Reader
    39  	c *iStorage
    40  }
    41  
    42  func (r *iStorageReader) Read(p []byte) (n int, err error) {
    43  	n, err = r.Reader.Read(p)
    44  	atomic.AddUint64(&r.c.read, uint64(n))
    45  	return n, err
    46  }
    47  
    48  func (r *iStorageReader) ReadAt(p []byte, off int64) (n int, err error) {
    49  	n, err = r.Reader.ReadAt(p, off)
    50  	atomic.AddUint64(&r.c.read, uint64(n))
    51  	return n, err
    52  }
    53  
    54  type iStorageWriter struct {
    55  	storage.Writer
    56  	c *iStorage
    57  }
    58  
    59  func (w *iStorageWriter) Write(p []byte) (n int, err error) {
    60  	n, err = w.Writer.Write(p)
    61  	atomic.AddUint64(&w.c.write, uint64(n))
    62  	return n, err
    63  }
    64  

View as plain text